实现读写分离
博主 默语带您 Go to New World.
✍ 个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨
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);
}
如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )