主从同步可以同步多个数据库,也可以设置为一个数据库同步,如果设置一个数据库,在从服务器上其他数据可以写操作
半同步复制模式在主服务器和从服务器同时启用,否则主服务器默认使用异步复制模式
半同步复制:一主多从模式下,有一个从节点返回成功,即成功,不必等待多个节点全部返回
异步复制可能会造成数据丢失
半同步复制就是为了解决数据丢失的问题
master做完一步等一步,需要等待至少一个slave节点完成复制之后才开始进行下一个操作
master做大事件的时候,需要进行半同步,master节点等待一个节点即可
当半同步出现问题的时候会自动切换为异步同步
银行数据库全同步,master节点等待集群中的所有全部节点
数据库要避免慢查询问题,会造成延迟,占用数据库的IO
优点:提高了数据完整性,数据至少会存在两个节点(master节点和一个slave节点)
加了消息确认ACK,不会造成数据丢失
出现问题会自动降低为异步复制
基于gtid主从复制开启的情况下做本次实验
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;
查看主库的变量的值,可以查看到延迟时间(10000指10000毫秒,也就是10秒)
SHOW VARIABLES LIKE 'rpl_semi_sync%'; 查看变量的值
SHOW STATUS LIKE 'Rpl_semi_sync%'; 查看变量的状态
至少有一个slave接受到日志就提交
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%';
激活插件
从库重启io进程,激活插件之后必须要重启io进程,否则不会生效,如果重启不了的话就说明两端的数据不同步
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD; 关闭IO线程
START SLAVE IO_THREAD; 开启IO线程
SHOW VARIABLES LIKE 'rpl_semi_sync%';
SHOW STATUS LIKE 'Rpl_semi_sync%';
测试:
server2:
STOP SLAVE IO_THREAD; 关闭从库进行测试
server1:
写入数据
use westos
insert into usertb values ('user4','123');
等待10s,没有接收到slave的ack请求,自动转换为异步复制,需要等待一个节点完成所有的复制
有10秒的延迟,这是因为从库的io进程关闭了,不能及时的写入数据;主库等待10秒之后从库还没有起来,主库不再等待直接写入
等待完毕,10秒后直接写入
server2:
START SLAVE IO_THREAD;
server2:
STOP SLAVE IO_THREAD;
server1:
接收不到ack
等待10s 自动切换为异步复制
server2:
关闭server2上面的slave,然后在server1上面插入数据
sever1(master)等待10s发现server2(slave)没有发送ACK消息,自动变为异步同步,
然后在server2上把slave上面开启,会把之前的数据读过来
- 也就是说只要从库的io进程恢复工作就会立即同步没有同步的数据
半同步复制失败后会自动切换成异步复制,从库进程起来之后会检测主从库数据是否同步;若不同步,将会采用异步复制的方式同步数据
将插件安装在数据库中是临时的,退出重新登陆会失效,永久的可以将配置写在配置文件中
还有一种情况:
server2:
STOP SLAVE IO_THREAD;
server1:
在第二步写入的时候已经转换位异步复制
server2: