简介
mysql配置读写分离以及使用shardingjdbc配置操作读写分离
读写分离
主数据库负责增删改操作(写),从数据库负责查询操作(读),主数据库和从数据库之间会数据同步(主从复制)。
读写分离可以确保系统的稳定性(热备),提高性能。
shardingjdbc读写分离式根据sql语义的分析,将读操作和写操作分别路由到主库和从库。它提供透明化的读写分离,让开发人员像操作一个数据库一样去操作多个数据库。
shardingjdbc只是操作数据的路由,读写分离和主从复制是mysql做的。
mysql配置读写分离
复制mysql
修改mysql-8.0.25-winx64 -copy配置文件
- 修改两处的端口号:port=3307
- 修改mysql的基础路径:basedir=E:\mysql\mysql-8.0.25-winx64-copy 改成自己的mysql文件夹名
- 修改数据目录:找到原来的mysql的路径下的文件,复制一份,然后修改:datadir=E:\mysql\data-copy
安装复制的mysql服务
在复制的mysql文件夹的bin目录中输入cmd(以管理员的身份),输入如下命令:
mysqld install mysqlcopy --defaults-file="E:\mysql\mysql-8.0.25-winx64-copy\my.ini"
安装成功
在任务管理器中右键启动
尝试连接
配置主从关系
配置这两个mysql服务的主从关系。
修改主mysql的my.ini文件,
头部添加配置:
[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
修改从mysql的my.ini文件,
头部添加配置:
[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.%
重启服务,先启动主服务器,再启动从服务器。
创建一个专门用于主从复制的账号
连接主服务器,使用命令授权主备复制专用账号 :
CREATE USER 'db_sync'@'%' IDENTIFIED BY 'db_sync'; GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%';
使用 FLUSH PRIVILEGES;
刷新权限
使用show master status;
查看主数据库的状态
设置主从数据同步
切换到从服务器
先执行STOP SLAVE;
停止同步
执行命令:
#修改从库指向到主库,使用上一步记录的文件名以及位点
CHANGE MASTER TO
master_host = 'localhost',
master_user = 'db_sync',
master_password = 'db_sync',
master_log_file = 'mysql-bin.000001',
master_log_pos = 1386;
注意:master_log_file和master_log_pos的值是使用show master status;
命令展示的值
使用命令START SLAVE;
启动同步
使用show slave status
查看状态
要这两个字段都是yes才是配置成功,这个就是有问题了的。
使用命令show variables like 'log_%';
查看错误日志;
打开日志,查看到
先打开任务管理器停止mysql服务
找出auto.cnf文件,修改里面的uuid,
83b167e3-8b2a-4b0c-9e26-7f1a4ef68391
然后启动mysql服务,先启动主再启动从
然后执行STOP SLAVE;
,再执行START SLAVE;
可以了!!!!
测试
在主mysql的user_db数据库中修改t_user,从mysql会同步数据
使用shardingjdbc操作读写分离
配置文件
# 配置数据源,给数据源起名称,
# 水平分库,配置两个数据源
spring.shardingsphere.datasource.names=m1,m2,m0,s0# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true#配置第一个数据源具体内容,包含连接池,驱动,地址,用户名和密码
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/edu_db_1?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=123456#配置第二个数据源具体内容,包含连接池,驱动,地址,用户名和密码
spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/edu_db_2?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m2.username=root
spring.shardingsphere.datasource.m2.password=123456#配置第三个数据源具体内容,包含连接池,驱动,地址,用户名和密码
# user_db主服务器
spring.shardingsphere.datasource.m0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m0.url=jdbc:mysql://localhost:3306/user_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m0.username=root
spring.shardingsphere.datasource.m0.password=123456# user_db从服务器
spring.shardingsphere.datasource.s0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s0.url=jdbc:mysql://localhost:3307/user_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.s0.username=root
spring.shardingsphere.datasource.s0.password=123456# 主库从库逻辑数据源定义 ds0为user_db
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=m0
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=s0# t_user分表策略,固定分配至ds0的t_user真实表
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds0.t_user# 配置公共表
spring.shardingsphere.sharding.broadcast-tables=t_udict
spring.shardingsphere.sharding.tables.t_udict.key-generator.column=dictid
spring.shardingsphere.sharding.tables.t_udict.key-generator.type=SNOWFLAKE# 指定course表里面主键cid 生成策略 SNOWFLAKE
spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id
spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE# 指定表分片策略 约定cid值偶数添加到course_1表,如果cid是奇数添加到course_2表
spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user#指定数据库分布情况,数据库里面表分布情况
# m1 m2 course_1 course_2
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m$->{1..2}.course_$->{1..2}# 指定course表里面主键cid 生成策略 SNOWFLAKE
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE# 指定表分片策略 约定cid值偶数添加到course_1表,如果cid是奇数添加到course_2表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2 + 1}# 指定数据库分片策略 约定user_id是偶数添加m1,是奇数添加m2
spring.shardingsphere.sharding.tables.course.database-strategy.inline..sharding-column=user_id
spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=m$->{user_id % 2 + 1}# 打开sql输出日志
spring.shardingsphere.props.sql.show=true
解析:s0就是从数据库,配置它的数据源,配置谁是主谁是从,最后配置一下t_user分表策略。
测试
@Test
public void add(){user u = new user();u.setUsername("joker");u.setUstatus("bad");userMapper.insert(u);
}
@Testpublic void find(){QueryWrapper<user> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id",1024403036157509633l);user user1 = userMapper.selectOne(queryWrapper);System.out.println(user1);
}
会在主数据库中插入数据
打开从数据库,也会有一条数据
执行查询的操作,会去从数据库中查询
shardingproxy
透明化的数据库代理端,它相当于数据库,我们直接操作一个shardingproxy数据库,shardingjdbc底层会去操作分库分表的数据。
是一个独立应用,安装后进行分库分表,读写分离的配置,然后使用。