专栏首页李浩东的博客SpringBoot 2.x ShardingSphere读写分离实战

SpringBoot 2.x ShardingSphere读写分离实战

一. 前言

面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。 对于同一时间有大量并发读操作和较少写操作类型的应用系统来说,将单一的数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。 通过一主多从的配置方式,可以将查询请求均匀的分散到多个数据副本,能够进一步的提升系统的处理能力。 使用多主多从的方式,不但能够提升系统的吞吐量,还能够提升系统的可用性,可以达到在任何一个数据库宕机,甚至磁盘物理损坏的情况下仍然不影响系统的正常运行。 虽然读写分离可以提升系统的吞吐量和可用性,但同时也带来了数据不一致的问题,这包括多个主库之间的数据一致性,以及主库与从库之间的数据一致性的问题。并且,读写分离也带来了与数据分片同样的问题,它同样会使得应用开发和运维人员对数据库的操作和运维变得更加复杂。透明化读写分离所带来的影响,让使用方尽量像使用一个数据库一样使用主从数据库,是读写分离中间件的主要功能。

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

二. 本文计划

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

三. 项目实战

环境介绍

CentOS 7 192.168.0.3 从数据库
CentOS 7 192.168.0.4 主数据库

3.1. 安装Mysql数据库

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

3.2 配置主从复制

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

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

主从配置需要注意的点

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

Master 上的配置

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

以下步骤, 为单向主从搭建成功, 想搭建双向主从需要的步骤:

登录数据库, 指定 Master 的地址、 用户、 密码等信息(此步仅双向主从时需要)
开启同步
查看状态

1.主从服务器分别作以下操作:

1.1、版本一致  
1.2、初始化表,并在后台启动mysql  
1.3、修改root的密码

2.修改主服务器master:

#vim /etc/my.cnf  
[mysqld]  
log-bin=mysql-bin  //[必须]启用二进制日志
server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段/自定义都可以的

3.连接数据库 检验是否配置成功

mysql> mysql -u root -p
mysql> show master status;

可以看到这些信息,说明前面我们配置成功

4.修改从服务器slave:

#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin   //[不是必须]启用二进制日志
server-id=226      //[必须]服务器唯一ID,默认是1,一般取IP最后一段/自定义都可以的

5.重复上面动作

mysql> mysql -u root -p
mysql> show master status;

可以看到这些信息,说明前面我们配置成功

6.重启两台服务器的mysql

systemctl restart mysqld.service

7.在主服务器上建立帐户并授权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.开启主从同步

mysql> start slave; #停止主从同步命令为:stop slave

9.查看同步状态

mysql> show slave status\G;

注:SlaveIO及SlaveSQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误) 说明们的主从同步配置成功

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

3.3 测试主从复制

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

在主数据库创建test表

mysql> create database test;

查询从数据

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

注: 编写一shell脚本,用nagios监控slave的两个yes(SlaveIO及SlaveSQL进程),如发现只有一个或零个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;

从数据库会自动同步

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

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.4: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 查询用户集

控制台打印:

可以查询看到走的从数据库

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

可以看到插入数据走的主数据库 主库负责写 从库负责读 这样读写分离就这样做好了

项目地址: https://github.com/LiHaodong888/SpringBootLearn

点好看,送你小花花~

本文分享自微信公众号 - 李浩东的博客(lihaodong_blog),作者:小东啊

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Spring Boot 实战】数据库千万级分库分表和读写分离实战

    因为使用我们使用Sharding-JDBC Spring Boot Starter,所以还是只需要在properties配置文件配置主从库的数据源即可

    小东啊
  • SpringBoot 2.x ShardingSphere分库分表实战

    在之前我做项目的时候,数据量比较大,单表千万级别的,需要分库分表,于是在网上搜索这方面的开源框架,最常见的就是mycat,sharding-sphere,最终我...

    小东啊
  • Spring Boot集成Mybatis-Plus多租户架构实战

    目前公司产品就是对外企业服务,入职后了解到SaaS模式和私有部署,当我第一次听到SaaS时,我不是很理解。经过查阅资料,以及在后续研发功能时,不断的加深了对多租...

    小东啊
  • 如何进行bug总结?

    在项目过程中,测试同学会发现大量的bug,但同时也不可避免的会存在一些遗漏的bug。为了能够减少遗漏bug的现象,我们需要针对遗漏的问题进行总结,从教训中积累经...

    用户5521279
  • 【专业技术】编程老手如何化解棘手难题

    依然记得上一节编程课的时候,老师说过一句让我一直到现在都还记得的话“只要是软件,就一定有bug;只要是软件,他的功能就是有限的;功能越强大的软件,他的问题就越多...

    程序员互动联盟
  • 这个bug有点狠,到大西洋送外卖?成功逼疯前端工程师

    写半天代码,改一天BUG,这就是程序员的日常。大大小小的bug充斥着工作的边边角角,有些bug很有趣,但有些bug,可能会让你后悔不准备一把菜刀。找到bug后,...

    一墨编程学习
  • Bug与Debug的随笔

    bug的本意是指昆虫、小虫、损坏、缺陷等意思,在互联网时代还有一种引申意义,用来形容某人/物超乎想象的厉害,那简直就是开挂的人生,系统的bug!

    半吊子全栈工匠
  • 和各种诡异 Bug 打交道 13 年,我总结了 18 条经验

    作者 | Henrik Warne 翻译 | 郑芸 在《程序员,你会从 Bug 中学习么?》一文中,我写了我是怎样追踪这些年遇到的最有趣 bug 的。最近我重新...

    CSDN技术头条
  • 怎样才能提交一个让开发人员拍手叫好的bug单

    王豆豆
  • 程序出现bug是必然出现的情况还是程序猿水平有限导致的?

    PS:最最大的bug是,明明程序运行的好好的,但项目失败了。你叫程序员怎么查?我只是个搬砖的,大厦为什么会倒,我哪知道啊~

    IT故事会

扫码关注云+社区

领取腾讯云代金券