在上一期我们说到了使用mariadb主从同步,这次来说说如何实现半同步的设定!
有了数据库同步为什么需要使用数据库半同步?
mariadb复制默认是异步复制,mariadb master server将自己的二进制日志通过复制线程传输出去以后,mariadb master sever就自动返回数据给客户端,但并不知道slave是否或何时已经接收且已处理,因此存在一定的概率备库与主库的数据是不对等的。在异步复制的机制的情况下,如果master宕机,事务在master上已提交,但很可能这些事务没有传到任何的slave上。假设有master->salve故障转移的机制,此时slave也可能会丢失事务。有些情况下需要保持主备库的强一致性,此时启用MySQL的半同步复制特性则是非常完美的。semi_sync_replication是google为mysql开发的一个基于半同步的补丁,从mysql5.5之后,mysql为了保证主从库数据一致性,引进了semi-sync功能。
注:当然虽然是为mysql发明的,但是mariadb也是可以进行使用的!
半同步的工作流程:
- 当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。
- 当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。
- 当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。在 Master 实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。
- 如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。
- 半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。
- 半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。
上面的理论知识和图片摘自:http://www.tianfeiyu.com/?p=1663 如果有需要可以自行观看!
实验拓扑:
与上一期中相同!三个节点!
半同步实验:
Master节点操作:
插件位置在/usr/lib64/mysql/plugin/ 如果你是编译安装或者使用的二进制包进行安装的,那么插件在:/usr/local/mysql/lib/plugin
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #安装该插件 Query OK, 0 rows affected (0.02 sec) MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled = 1; #启用插件 Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout = 2000; #设置超时时间为2秒 Query OK, 0 rows affected (0.00 sec) #好了,主节点就算配置完毕了!够方便不?
Slave节点配置:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #安装slave相关插件 Query OK, 0 rows affected (0.03 sec) MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = 1; #开启插件 Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> stop slave io_thread; #重启io_thread,不过这个步骤也可以不做最多第一次同步可能会超时变为异步同步! Query OK, 0 rows affected (0.02 sec) MariaDB [(none)]> start slave io_thread; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> show global status like '%semi%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 1 row in set (0.00 sec) #好了slave节点相关配置就算完成了!
验证半同步的相关设置:
MariaDB [(none)]> CREATE DATABASE test3; #首先在主节点上创建test3数据库! Query OK, 1 row affected (0.02 sec) MariaDB [(none)]> SHOW DATABASES; #从节点1查看 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | test2 | | test3 | +--------------------+ 6 rows in set (0.03 sec) MariaDB [(none)]> SHOW DATABASES; #从节点2查看 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | test2 | | test3 | +--------------------+ 6 rows in set (0.03 sec) #悲剧的是完全看不出效果...有可能执行量太小了?好吧。这个验证还是交给大家看看了!
需要注意的是:配置半同步需要将其他所有slave节点都安装上相关插件吗?我的建议是不要安装1-2台即可。半同步的配置一般在MHA中使用,比如主节点的宕机,那么选举从节点中需要选举相关有半同步插件的slave这样可以保证一点数据一致性!
好了这期的文章到此就算结束了!
Comments