Sharding JDBC教程之读写分离
1 理解读写分离 面对日益增加的系统访问量数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说将数据库拆分为主库和从库主库负责处理事务性的增删改操作从库负责处理查询操作能够有效的避免由数据更新导致的行锁使得整个系统的查询性能得到极大的改善。 通过一主多从的配置方式可以将查询请求均匀的分散到多个数据副本能够进一步的提升系统的处理能力。 使用多主多从的方式不但能够提升系统的吞吐量还能够提升系统的可用性可以达到在任何一个数据库宕机甚至磁盘物理损坏的情况下仍然不影响系统的正常运行。 读写分离的数据节点中的数据内容是一致的而水平分片的每个数据节点的数据内容却并不相同。将水平分片和读写分离联合使用能够更加有效的提升系统的性能。Sharding-JDBC读写分离则是根据SQL语义的分析将读操作和写操作分别路由至主库与从库。它提供透明化读写分离让使用方尽量像使用一个数据库一样使用主从数据库集群。 Sharding-JDBC提供一主多从的读写分离配置可独立使用也可配合分库分表使用同一线程且同一数据库连接内如有写入操作以后的读操作均从主库读取用于保证数据一致性。Sharding-JDBC不提供主从数据库的数据同步功能需要采用其他机制支持。 接下来咱们对上面例子中user_db进行读写分离实现。为了实现Sharding-JDBC的读写分离首先要进行mysql的主从同步配置。2.mysql主从同步(windows)一新增mysql实例复制原有mysql如D:\mysql-5.7.25(作为主库) - D:\mysql-5.7.25-s1(作为从库)并修改以下从库的my.ini[mysqld] #设置3307端口 port 3307 # 设置mysql的安装目录 basedirD:\mysql-5.7.25-s1 # 设置mysql数据库的数据的存放目录 datadirD:\mysql-5.7.25-s1\data然后将从库安装为windows服务注意配置文件位置D:\mysql-5.7.25-s1\binmysqldinstallmysqls1 --defaults-fileD:\mysql-5.7.25-s1\my.ini由于从库是从主库复制过来的因此里面的数据完全一致可使用原来的账号、密码登录。二修改主、从库的配置文件(my.ini)新增内容如下主库[mysqld] #开启日志 log-bin mysql-bin #设置服务id主从不能一致 server-id 1 #设置需要同步的数据库 binlog-do-dbuser_db #屏蔽系统库同步 binlog-ignore-dbmysql binlog-ignore-dbinformation_schema binlog-ignore-dbperformance_schema从库[mysqld] #开启日志 log-bin mysql-bin #设置服务id主从不能一致 server-id 2 #设置需要同步的数据库 replicate_wild_do_tableuser_db.% #屏蔽系统库同步 replicate_wild_ignore_tablemysql.% replicate_wild_ignore_tableinformation_schema.% replicate_wild_ignore_tableperformance_schema.%重启主库和从库net start[主库服务名]net start[从库服务名mysqls1]请注意主从MySQL下的数据(data)目录下有个文件auto.cnf文件中定义了uuid要保证主从数据库实例的uuid不一样建议直接删除掉重启服务后将会重新生成。三授权主从复制专用账号#切换至主库bin目录登录主库mysql-hlocalhost-uroot-p#授权主备复制专用账号GRANT REPLICATION SLAVE ON *.* TOdb_sync%IDENTIFIED BYdb_sync;#刷新权限FLUSH PRIVILEGES;#确认位点 记录下文件名以及位点show master status;四设置从库向主库同步数据、并检查链路#切换至从库bin目录登录从库mysql-hlocalhost-P3307-uroot-p#先停止同步STOP SLAVE;#修改从库指向到主库使用上一步记录的文件名以及位点CHANGE MASTER TO master_hostlocalhost, master_userdb_sync, master_passworddb_sync, master_log_filemysql-bin.000002, master_log_pos154;#启动同步START SLAVE;#查看从库状态Slave_IO_Runing和Slave_SQL_Runing都为Yes说明同步成功如果不为Yes请检查error_log然后排查相关异常。show slave status\G#注意 如果之前此备库已有主库指向 需要先执行以下命令清空STOP SLAVE IO_THREAD FOR CHANNEL;reset slave all;最后测试在主库修改数据库看从库是否能够同步成功。3.实现sharding-jdbc读写分离(1)在Sharding-JDBC规则中修改# 增加数据源s0使用上面主从同步配置的从库。 spring.shardingsphere.datasource.names m0,m1,m2,s0 ... spring.shardingsphere.datasource.s0.type com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.s0.driver-class-name com.mysql.jdbc.Driver spring.shardingsphere.datasource.s0.url jdbc:mysql://localhost:3307/user_db?useUnicodetrue spring.shardingsphere.datasource.s0.username root spring.shardingsphere.datasource.s0.password root .... # 主库从库逻辑数据源定义 ds0为user_db spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-namem0 spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-namess0 # t_user分表策略固定分配至ds0的t_user真实表 spring.shardingsphere.sharding.tables.t_user.actual-data-nodes ds0.t_user ....(2)测试执行testInsertUser单元测试通过日志可以看出所有写操作落入m0数据源。执行testSelectUserbyIds单元测试通过日志可以看出所有写操作落入s0数据源达到目标。4 更多参考参考代码https://github.com/pbteach/PB-Sharding-JDBC更多技术教程http://www.yjoffer.com