SpringBoot 2.x ShardingSphere读写分离实战

号外: 本文出自「公众号:李浩东的博客」欢迎关注和转载,保留摘要,谢谢!外有Spring Boot、Spring Cloud的详细教程, 尾部欢迎关注!

一. 前言

面对日益增长的系统访问量,数据库的吞吐量面临着巨大瓶颈。 对于同一时间有大量并发读操做和较少写操做类型的应用系统来讲,将单一的数据库拆分为主库和从库,主库负责处理事务性的增删改操做,从库负责处理查询操做,可以有效的避免由数据更新致使的行锁,使得整个系统的查询性能获得极大的改善。 经过一主多从的配置方式,能够将查询请求均匀的分散到多个数据副本,可以进一步的提高系统的处理能力。 使用多主多从的方式,不但可以提高系统的吞吐量,还可以提高系统的可用性,能够达到在任何一个数据库宕机,甚至磁盘物理损坏的状况下仍然不影响系统的正常运行。mysql

虽然读写分离能够提高系统的吞吐量和可用性,但同时也带来了数据不一致的问题,这包括多个主库之间的数据一致性,以及主库与从库之间的数据一致性的问题。而且,读写分离也带来了与数据分片一样的问题,它一样会使得应用开发和运维人员对数据库的操做和运维变得更加复杂。透明化读写分离所带来的影响,让使用方尽可能像使用一个数据库同样使用主从数据库,是读写分离中间件的主要功能。ios

在上一篇文章介绍到Mysql数据库的分库分表,本文将介绍读写分离git

二. 学习计划

  1. 安装Mysql
  2. 配置主从复制
  3. 测试主从复制
  4. 读写分离
  5. 测试读写分离

三. 项目实战

环境介绍

192.168.0.3  
192.168.0.4
复制代码

3.1. 安装Mysql数据库

这里不作过多介绍了 我这里安装的Mysql 8.0github

3.2 配置主从复制

MySQL 主从复制的方式有多种,本文主要演示基于基于日志(binlog)的主从复制方式。spring

MySQL 主从复制(也称 A/B 复制) 的原理
  • Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件, 这些记录叫作二进制日志事件(binary log events);
  • Slave 经过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志(relay log);
  • Slave 重作中继日志中的事件, 把中继日志中的事件信息一条一条的在本地执行一次,完 成数据在本地的存储, 从而实现将改变反映到它本身的数据(数据重放)。

主从配置须要注意的点sql

主从服务器操做系统版本和位数一致;
Master 和 Slave 数据库的版本要一致;
Master 和 Slave 数据库中的数据要一致;
Master 开启二进制日志, Master 和 Slave 的 server_id 在局域网内必须惟一;
复制代码
主从配置的简要步骤

Master 上的配置shell

1.安装数据库;
2.修改数据库配置文件, 指明 server_id, 3.开启二进制日志(log-bin);
4.启动数据库, 查看当前是哪一个日志, position 号是多少;
5.登陆数据库, 受权数据复制用户(IP 地址为从机 IP 地址, 若是是双向主从, 6.这里的还须要受权本机的 IP 地址, 此时本身的 IP 地址就是从 IP 地址);
7.备份数据库(记得加锁和解锁);
8.传送备份数据到 Slave 上;
9.启动数据库;
复制代码

如下步骤, 为单向主从搭建成功, 想搭建双向主从须要的步骤:数据库

登陆数据库, 指定 Master 的地址、 用户、 密码等信息(此步仅双向主从时须要)
开启同步
查看状态
复制代码
  1. 主从服务器分别做如下操做:
1.一、版本一致  
1.二、初始化表,并在后台启动mysql  
1.三、修改root的密码  
复制代码
  1. 修改主服务器master:
#vim /etc/my.cnf 
[mysqld]  
log-bin=mysql-bin  //[必须]启用二进制日志
server-id=222 //[必须]服务器惟一ID,默认是1,通常取IP最后一段/自定义均可以的
复制代码
  1. 链接数据库 检验是否配置成功
mysql> mysql -u root -p
mysql> show master status;
复制代码

能够看到这些信息,说明前面咱们配置成功

  1. 修改从服务器slave:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin   //[不是必须]启用二进制日志
server-id=226      //[必须]服务器惟一ID,默认是1,通常取IP最后一段/自定义均可以的
复制代码
  1. 重复上面动做
mysql> mysql -u root -p
mysql> show master status;
复制代码

能够看到这些信息,说明前面咱们配置成功

  1. 重启两台服务器的mysql
systemctl restart mysqld.service
复制代码
  1. 在主服务器上创建账户并受权slave: 在从节点上设置主节点参数
change master to master_host='192.168.0.4',master_user='test',master_password='12root',master_log_file='mysql-bin.000001',master_log_pos=155;
复制代码

通常不用root账号,"%" 表示全部客户端均可能连,只要账号,密码正确,此处可用具体客户端IP代替,如192.168.0.4(主服务器的IP),增强安全 8. 开启主从同步vim

mysql> start slave; #中止主从同步命令为:stop slave
复制代码
  1. 查看同步状态
mysql> show slave status\G;
复制代码

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,不然都是错误的状态(如:其中一个NO均属错误)
说明们的主从同步配置成功浏览器

注意:若是若是从库宕机,从新启动,要链接上mysql服务,执行 start slave 这个命令,开启主从同步

3.3 测试主从复制

分别查询两台服务器的数据库

在主数据库建立test表

mysql> create database test;
复制代码

查询从数据库

咱们刚刚在主数据库建立的test库在从数据库有的 说明咱们的主从是成功的

注: 编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就代表主从有问题了,发短信警报吧

3.4 读写分离

  1. 在主数据库建立ds0:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

SET FOREIGN_KEY_CHECKS = 1;
复制代码

从数据库会自动同步

  1. 项目搭建 复制上一篇的项目在基础上加以改动

application.properties 配置

# 配置真实数据源
sharding.jdbc.datasource.names=master1,slave0
# 主数据库
sharding.jdbc.datasource.master1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.master1.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.master1.jdbc-url=jdbc:mysql://192.168.0.3:3306/ds0?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.master1.username=test
sharding.jdbc.datasource.master1.password=12root
# 从数据库
sharding.jdbc.datasource.slave0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.slave0.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.slave0.jdbc-url=jdbc:mysql://192.168.0.3:3306/ds0?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.slave0.username=test
sharding.jdbc.datasource.slave0.password=12root
# 配置读写分离
# 配置从库选择策略,提供轮询与随机,这里选择用轮询
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=ms
sharding.jdbc.config.masterslave.master-data-source-name=master1
sharding.jdbc.config.masterslave.slave-data-source-names=slave0
# 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志
sharding.jdbc.config.props.sql.show=true
spring.main.allow-bean-definition-overriding=true
复制代码

主要改动application.properties配置 其余地方不作改动

3.5 测试读写分

打开浏览器访问: http://localhost:8080/select 查询用户集合

控制台打印:

能够查询看到走的从数据库

打开浏览器访问: http://localhost:8080/insert?id=1&name=lhd&age=12 插入一条数据 控制台打印:

能够看到插入数据走的主数据库

主库负责写 从库负责读
这样读写分离就这样作好了

项目地址: github.com/LiHaodong88…

相关文章
相关标签/搜索