mariadb半同步

上一期我们说到了使用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也是可以进行使用的!

半同步的工作流程:

图片挂了看这里:

  1. 当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。
  2. 当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。
  3. 当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。在 Master 实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。
  4. 如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。
  5. 半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。
  6. 半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。

上面的理论知识和图片摘自: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

Leave a Reply

Your email address will not be published. Name and email are required