Sharding-JDBC 实现读写分离
1 、读写分离概念
读写分离原理:
上面的读写分离其实就是:2太数据库主从机制,一个提供读(select )另一个提供 增删改 为了保证数据的一致性他们直接是数据同步的;
下面说下数据咋同步的
那个图好理解看那个;
主服务器有一个binlog日志开启的功能他会记录所有增删改的操作,当主服务器进行相关的操作的时候 日志必定会记录他的操作;然后这个时候我们的从服务器他就会 实时的监控这个日志(biglog)的一些变化;来实现我们数据同步;
Sharding-JDBC通过sql语句语义分析,实现读写分离过程,并不会做数据同步,数据同步由MySQL实现
2 、 MySQL 配置读写分离
(我本地是没有尝试成功的)
第一步 创建两个 MySQL 数据库服务,并且启动两个 MySQL 服务
( 1 )复制之前MySQL目录
( 2 )修改复制之后配置文件
⚫ 修改端口号,文件路径
⚫ 需要把数据文件目录再复制一份
( 3 )把复制修改之后从数据库在windows安装服务
使用命令:(我就是这步失败的怎么也成功不了)
在bin下执行
mysqld install mysqls1 --defaults-file="D:\Program Files\MySQL\MySQL Server-s1\my.ini"
第二步 配置 MySQL 主从服务器
( 1 )在主服务器配置文件
[mysqld] #开启日志 log‐bin = mysql‐bin #设置服务id,主从不能一致 server‐id = 1 #设置需要同步的数据库 binlog‐do‐db=user_db #屏蔽系统库同步 binlog‐ignore‐db=mysql binlog‐ignore‐db=information_schema binlog‐ignore‐db=performance_schema
( 2 )在从服务器配置文件
[mysqld] #开启日志 log‐bin = mysql‐bin #设置服务id,主从不能一致 server‐id = 2 #设置需要同步的数据库 replicate_wild_do_table=user_db.% #屏蔽系统库同步 replicate_wild_ignore_table=mysql.% replicate_wild_ignore_table=information_schema.% replicate_wild_ignore_table=performance_schema.%
( 3 )把主和从服务器重启
第三步 创建用于主从复制的账号
#切换至主库bin目录,登录主库
mysql ‐h localhost ‐uroot ‐p
#授权主备复制专用账号
GRANT REPLICATION SLAVE ON . TO 'db_sync'@'%' IDENTIFIED BY 'db_sync';
#刷新权限
FLUSH PRIVILEGES;
#确认位点 记录下文件名以及位点
show master status;
第四步 主从数据同步设置
#切换至从库bin目录,登录从库
mysql ‐h localhost ‐P3307 ‐uroot ‐p
#先停止同步
STOP SLAVE;
#修改从库指向到主库,使用上一步记录的文件名以及位点
CHANGE MASTER TO master_host = 'localhost', master_user = 'db_sync', master_password = 'db_sync', master_log_file = 'mysql-bin.000177', master_log_pos = 107 ;
#启动同步
START SLAVE;
#查看Slave_IO_Runing和Slave_SQL_Runing字段值都为Yes,表示同步配置成功。如果不为Yes,请排查相关异常。
show slave status
3 、 Sharding-JDBC 操作
( 1 )配置读写分离策略
你们能安装成功也可以直接在数据库新增删除个数据查看是否成功;
#user_db从服务器
spring.shardingsphere.datasource.s0.type=com.alibaba.druid.pool.DruidDataSourc e spring.shardingsphere.datasource.s0.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.s0.url=jdbc:mysql://localhost:3307/user_db?se rverTimezone=GMT%2B 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- name=m spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source- names=s 配置user_db数据库里面t_user 专库专表 #spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=m$->{0}.t_user t_user分表策略,固定分配至ds0的t_user真实表 spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds0.t_user
( 2 )编写测试代码
//添加操作 @Test public void addUserDb() { User user = new User(); user.setUsername("lucymary"); user.setUstatus("a"); userMapper.insert(user); } //查询操作 @Test public void findUserDb() { QueryWrapper wrapper = new QueryWrapper<>(); //设置userid值 wrapper.eq("user_id",465508031619137537L); User user = userMapper.selectOne(wrapper); System.out.println(user); }