主从半同步复制(Semisynchronous replication)
一主多从模式下,有一个从节点返回成功,即成功,不必等待多个节点全部返回
异步复制可能会造成数据丢失,半同步复制就是为了解决数据丢失的问题
当出现超时情况时,主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。
半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。
server1:master
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';安装半同步插件
SELECT PLUGIN_NAME,PLUGIN_STATUS 查看插件
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
SET GLOBAL rpl_semi_sync_master_enabled =1; 激活插件,开启半同步
show VARIABLES LIKE 'rpl_semi_sync%'; 查看主库的变量值
rpl_semi_sync_master_enabled 是否开启半同步
rpl_semi_sync_master_timeout 默认切换复制的延迟时间为10s (10000指10000毫秒)
rpl_semi_sync_master_trace_level 开启半同步复制模式的调试级别默认32
rpl_semi_sync_master_wait_for_slave_count 至少有1个slave接收到日志
rpl_semi_sync_master_wait_no_slave 是否允许master的每个事物提交后都等待slave的回复信号
rpl_semi_sync_master_wait_point 等待的point
show status like '%rpl%'; 查看变量的状态
Rpl_semi_sync_master_clients
Rpl_semi_sync_master_status 开启
server2:slave
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 安装半同步模块
SELECT PLUGIN_NAME, PLUGIN_STATUS 查看插件
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
SET GLOBAL rpl_semi_sync_slave_enabled=1; 激活插件
STOP SLAVE IO_THREAD; 激活插件之后必须要重启io进程
START SLAVE IO_THREAD;
show variables like '%rpl%';
rpl_semi_sync_slave_enabled
测试:
server2:先关闭io进程
STOP SLAVE IO_THREAD;
server1:在master端插入数据,会等待10s(master端设置),没有接收到slave的ack请求,自动转换为异步复制,需要等待一个节点完成所有的复制
use westos
insert into usertb values ('user5','123'); 等待10s后切换为异步复制
insert into usertb values ('user6','123'); 同步很快,已经变成异步
show status like '%rpl%'; 发现半同步已经关闭OFF
Rpl_semi_sync_master_status
server2:
start SLAVE IO_THREAD;
use westos
select * from usertb; 重新打开I/O线程,发现数据同步了,但这是异步复制所同步过来的数据。
show processlist; 查看数据同步的进度