1.mysql半同步复制的基础知识
半同步复制:一主多从模式下,有一个从节点返回成功,即成功,不必等待多个节点全部返回
MySQL半同步,MySQL5.5由Google贡献的补丁才开始支持半同步复制(semi Replication)模式,该模式可以确保从服务器接收完主服务器发送的binlog日志文件并写入自己的中继日志(relay log)里,然后会给主服务器一个反馈,告诉对方已经接收到完毕,这时主库线程才返回当前session告知操作完成,当出现超时情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。
主从同步可以同步多个数据库,也可以设置为一个数据库同步,如果设置一个数据库,在从服务器上其他数据可以写操作
半同步复制模式在主服务器和从服务器同时启用,否则主服务器默认使用异步复制模式
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
异步复制可能会造成数据丢失
半同步复制就是为了解决数据丢失的问题
master做完一步等一步,需要等待至少一个slave节点完成复制之后才开始进行下一个操作
master做大事件的时候,需要进行半同步,master节点等待一个节点即可
当半同步出现问题的时候会自动切换为异步同步
银行数据库全同步,master节点等待集群中的所有全部节点
数据库要避免慢查询问题,会造成延迟,占用数据库的IO
优点:提高了数据完整性,数据至少会存在两个节点(master节点和一个slave节点)
加了消息确认ACK,不会造成数据丢失
出现问题会自动降低为异步复制
2.实验环境
此实验是在上一篇的异步复制的基础上做的,因此不再赘述
3.mysql半同步复制的过程如下
- (1)在server1(master节点)上安装半同步复制的插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';安装半同步模块
- (2)在server2(slave节点)上安装半同步复制的插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';安装半同步模块
- (3)在server1上查看插件
SELECT PLUGIN_NAME, PLUGIN_STATUS设置
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
- (4)在server2查看插件
SELECT PLUGIN_NAME, PLUGIN_STATUS设置
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
- (5)在server1上激活插件
SET GLOBAL rpl_semi_sync_master_enabled = 1开启半同步,也就是激活插件
- (6)在server2上激活插件
SET GLOBAL rpl_semi_sync_slave_enabled = 1开启
STOP SLAVE IO_THREAD;关闭
START SLAVE IO_THREAD;开启
从库重启io进程,激活插件之后必须要重启io进程,否则不会生效,如果重启不了的话就说明两端的数据不同步
- (7)server1:查看主库的变量的值,可以查看到延迟时间(10000指10000毫秒,也就是10秒)
SHOW VARIABLES LIKE 'rpl_semi_sync%';查看变量的值
show status like '%rpl%';查看变量的状态
- (8)server2:
SHOW VARIABLES LIKE 'rpl_semi_sync%';
STOP SLAVE IO_THREAD;关闭从库进行测试
serve2先关闭io进程
- (9)server1:
use westos
insert into usertb values ('user4','123');
等待10s,没有接收到slave的ack请求,自动转换为异步复制,需要等待一个节点完成所有的复制
insert into usertb values ('user5','123');发现特别快,已经变成异步了
show status like '%rpl%';发现半同步已经关闭OFF
有10秒的延迟,这是因为从库的io进程关闭了,不能及时的写入数据;主库等待10秒之后从库还没有起来,主库不再等待直接写入
等待完毕,10秒后直接写入
再次插入数据,主库直接写入,没有延迟
这是因为:半同步复制再一次失败后会自动切换成异步复制,从库进程起来之后会将没有做的事情再做一遍
- (10)server2:
START SLAVE IO_THREAD;开启
show processlist;
use westos
select * from usertb;发现所有的数据都过来了(基于gtid),接着上一次的事情做
关闭server2上面的slave,然后在server1上面插入数据
sever1(master)等待10s发现server2(slave)没有发送ACK消息,自动变为异步同步,
然后在server2上把slave上面开启,会把之前的数据读过来
也就是说只要从库的io进程恢复工作就会立即同步没有同步的数据
半同步复制失败后会自动切换成异步复制,从库进程起来之后会检测主从库数据是否同步;若不同步,将会采用异步复制的方式同步数据
将插件安装在数据库中是临时的,退出重新登陆会失效,永久的可以将配置写在配置文件中