本文会与SpringBoot实现读写分离实现业务的读写分离。
首先准备三台mysql
mysql-1:192.168.31.62
mysql-2:192.168.1.5
mysql-3:192.168.1.6
并且在三台机器上使用ping命令测试网络是否通畅。
在Master主库开启log_bin功能
windows是 my.ini
linux是 my.cnf
添加以下内容(注意备份源文件,并且尽量不要用原始编辑器打开,会修改编码格式,导致mysql无法正常启动)
# 配置要给Slave同步的数据库
binlog-do-db=life_account_db
# 不用给Slave同步的数据库,一般是Mysql自带的数据库就不用给Slave同步了
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 自动清理30天前的log文件
expire_logs_days=30
# 启用二进制日志
log-bin=mysql-bin
#集群唯一ID
server-id=1
查看log_bin开启状态
show variables like '%log_bin%';
在主库中创建用户,并设置该用户授予复制权限
#切换至mysql库中
use mysql
#创建用户并设置可访问的地址为所有,密码为123456
CREATE USER 'master'@'%' IDENTIFIED BY '123456'
#刷新
FLUSH PRIVILEGES
#给master用户配置复制权限,可访问库为所有,可访问地址为所有
grant replication slave on *.* to 'master'@'%'
#查看权限是否配置成功
show grants for master
#查看网络访问策略是否配置成功
select user,host from user
查看当前库中数据的日志名称及偏移量
File和Position的值后面配置从库时需要用到。
show master status
在从库中配置(192.168.1.5)
linux的 /etc/my.cnf 中
server-id=2
重启mysql
systemctl restart mysqld
登录mysql进行从库的读取配置
#停止主从
stop slave
#设置主从配置
change master to master_host='192.168.31.62', master_port=3306, master_user='master', master_password='123456', master_log_file='mysql-bin.000051', master_log_pos=649
#启动主从
start slave;
设置主从配置语句解释:
#master_host 主库ip
#master_port 主库端口
#master_user 主库提供可用来主从复制的用户名
#master_password 同上的密码
#master_log_file 主库中log日志的名称 也就是File
#master_log_pos 主库中log日志的偏移量 也就是Position
查看主从状态:
#\G会有格式
show slave status\G;
当以下两种状态都为yes时就设置成功
Slave_IO_Runing:Yes
Slave_SQL_Runing:Yes
配置从库2(192.168.1.6)
由于我是复制的192.168.1.5的虚拟机,所以需要删除以下文件
复制过来的uuid是一样的,后面是会出错的,删除之后重启mysql会重新生成一个不一样的。
rm /var/lib/mysql/auto.cnf
/etc/my.cnf中的service-id的值不要重复
测试
首先清空测试表数据
delete from acc_order where id >0
发现192.168.1.6没有删除数据,执行show slave status发现
Slave_SQL_Runing:No
#这个参数会跳过从主节点接下来的N个事件。这个参数用来修复由SQL语句导致的复制停止。
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1
并且发现如果使用范围删除,如果主库删了id为112,113的数据,但是从库有id为111的数据,那么就只会删除112,113的数据。id为111的数据依旧存在(说明log-bin保存的是真正执行的sql),所以实际操作之前需要将主库的sql同步至从库中,保证起始阶段的数据一致性。
测试删除
主库执行删除操作:
从库执行查询操作:
测试新增
主库执行新增操作:
从库执行查询操作
至此mysql的一主两从基本实现。
在实施的过程中遇到很多问题,并且实际工作中由运维来提供的主从读取用户的权限和地址都是会限制的。如果用于实际工作中,用户和可访问地址都要尽可能的缩小,来减少数据被恶意篡改的风险。