mysql主从复制有三种方法:
- 异步复制:也是默认的主从同步方式。这种方式的优点是效率高。缺点是不能保证数据一定会到达slave。可能会受到网络等原因出现延迟,导致主从数据不一致。当前对master中的表进行数据操作,master将事务Binlog事件写入到Binlog文件中,此时主库只会通知一下Dump线程发送这些新的Binlog到slave(slave的 I/O 线程读取并将事件写入relay-log中)然后主库就会继续处理提交操作,而此时不会保证这些Binlog传到任何一个从库节点上。
- 全同步复制:优点是能够保证数据的强一致性,缺点是效率太低。当master上有提交事务之后,Dump线程发送这些新的Binlog到slave上,并且必须等待所有的slave回复成功(所有从库将事件写入中继日志,并将数据写入数据库)才能继续下一步操作。
- 半同步复制:优点是在耗费少量性能的基础上能在一定程度上保证数据的一致性。当master上有提交事务之后,Dump线程发送这些新的Binlog到slave上,并且必须等待其中一个slave回复成功(slave将事件写入relay-log)才能继续下一步操作。
对于mysql主从结构数据库如何保障数据一致性官方提供了“半同步插件”
该插件默认不安装
1、要使用半同步复制,必须满足以下要求:
- MySQL服务器支持动态加载插件的能力。要验证这一点,可以检查 have_dynamic_loading系统变量的值为YES。二进制发行版应支持动态加载。
mysql> show variables like "%have_dynamic_loading%"; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | have_dynamic_loading | YES | +----------------------+-------+ 1 row in set (0.01 sec)
- 主从复制必须已经可以正常工作。
- 不能配置多个复制通道。半同步复制仅与默认复制通道兼容。(mysql支持多源复制,即slave从多个master同步数据)
什么是多源复制 ?
在MySQL多源复制中,一个slave打开多个复制通道,每个源服务器一个。复制通道代表从源流向slave的事务路径。每个复制通道都有其自己的接收器(I / O)线程,一个或多个应用程序(SQL)线程以及中继日志。通道的接收器线程接收到来自源的事务时,会将它们添加到通道的中继日志文件中,并传递到通道的应用程序线程。这样可使每个通道独立运行。
2、安装半同步插件
rpl_semi_sync 半同步插件需要在master跟slave上同时安装才可以。
(1)master主库安装半同步插件
- 查看是否安装同步插件
show plugins;
- 主库安装半同步插件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
- 开启半同步插件
- 临时开启
set persist rpl_semi_sync_master_enabled=on;
- 通过修改my.cnf配置永久开启
rpl_semi_sync_master_enabled=ON rpl_semi_sync_master_timeout=10000 rpl_semi_sync_master_trace_level=32 rpl_semi_sync_master_wait_for_slave_count=1 rpl_semi_sync_master_wait_no_slave=ON rpl_semi_sync_master_wait_point=AFTER_SYNC rpl_stop_slave_timeout=31536000
- 临时开启
(2)slave从库安装半同步插件
- 查看是否安装同步插件
show plugins;
- 从库安装半同步插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
- 开启半同步插件
- 临时开启
set persist rpl_semi_sync_slave_enabled=on;
- 通过修改my.cnf配置永久开启
rpl_semi_sync_slave_enabled=ON rpl_semi_sync_slave_trace_level=32
- 临时开启