阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL半同步复制实现

137次阅读
没有评论

共计 4018 个字符,预计需要花费 11 分钟才能阅读完成。

一,为什么要使用半同步复制?

MySQL 复制默认是异步复制,Mysql Master Server 将自己的 Binary Log 通过复制线程传输出去以后,Mysql Master Sever 就自动返回数据给客户端,但并不知道 Slave 是否或何时已经接收且已处理,因此存在一定的概率备库与主库的数据是不对等的。在异步复制的机制的情况下,如果 Master 宕机,事务在 Master 上已提交,但很可能这些事务没有传到任何的 Slave 上。假设有 Master->Salve 故障转移的机制,此时 Slave 也可能会丢失事务。有些情况下需要保持主备库的强一致性,此时启用 MySQL 的半同步复制特性则是非常完美的。semi_sync_replication 是 google 为 mysql 开发的一个基于半同步的补丁,从 mysql5.5 之后,mysql 为了保证主从库数据一致性,引进了 semi-sync 功能。

在半同步复制的架构下,当 master 在将自己 binlog 发给 slave 上的时候,要确保 slave 已经接受到了这个二进制日志以后,才会返回数据给客户端。对比两种架构:异步复制对于用户来说,可以确保得到快速的响应结构,但是不能确保二进制日志确实到达了 slave 上;半同步复制对于客户的请求响应稍微慢点,但是他可以保证二进制日志的完整性。

二,半同步复制原理

半同步复制架构图如下所示:

MySQL 半同步复制实现

半同步复制的概念:

 

  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,半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。

二,半同步复制的实现

配置主节点:

  1. mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;# 安装插件
  2. Query OK,0 rows affected (0.07 sec)
  3.  
  4. mysql> show global variables like ‘%semi%’;
  5. +————————————+————–+
  6. |Variable_name|Value|
  7. +————————————+————–+
  8. | rpl_semi_sync_master_enabled | OFF |
  9. | rpl_semi_sync_master_timeout |10000|
  10. | rpl_semi_sync_master_trace_level |32|
  11. | rpl_semi_sync_master_wait_no_slave | ON |
  12. | rpl_semi_sync_master_wait_point | AFTER_COMMIT |
  13. +————————————+————–+
  14. 5 rows inset(0.00 sec)
  15.  
  16. mysql>setglobal rpl_semi_sync_master_enabled=on;# 启用插件
  17. Query OK,0 rows affected (0.02 sec)
  18.  
  19. mysql>setglobal rpl_semi_sync_master_timeout=2000;# 设置超时时间
  20. Query OK,0 rows affected (0.00 sec)
  21.  
  22. mysql> show global variables like ‘%semi%’;
  23. +————————————+————–+
  24. |Variable_name|Value|
  25. +————————————+————–+
  26. | rpl_semi_sync_master_enabled | ON |
  27. | rpl_semi_sync_master_timeout |2000|
  28. | rpl_semi_sync_master_trace_level |32|
  29. | rpl_semi_sync_master_wait_no_slave | ON |
  30. | rpl_semi_sync_master_wait_point | AFTER_COMMIT |
  31. +————————————+————–+
  32. 5 rows inset(0.00 sec)
  33.  

rpl_semi_sync_master_enabled 是控制 Master 是否开启半同步,开启或不开启, 将其设置为 ON 或 OFF(1or0).

rpl_semi_sync_master_timeout 是控制 Master 等待多长时间被告知 Slave 已收到,也就是所谓的超时时间。

rpl_semi_sync_slave_enabled 是控制 Slave 是否开启半同步,开启或不开启,将其设置为 ON 或 OFF(1or0)。

 

监控半同步复制的状态变量(几个常用的):

 

Rpl_semi_sync_master_clients:查看有多少个开启半同步复制的插件的 Slave

Rpl_semi_sync_master_status:查看在 Master 上半同步复制是否正在运行,其值为 ON 时,说明 Master 已启用半同步且已被告知有 Slave 收到;其值为 OFF 时,说明 Master 没启用半同步或是没被告知,由于 timeout 等原因。

Rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。

Rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。

Rpl_semi_sync_slave_status:查看 Slave 上半同步复制是否正常运行,其值为 ON 时,说明 Slave 正通过半同步复制且 Slave I/ O 正在运行;为 OFF 时,反之。

使用相同步骤配置从节点,完成后需要重启 io_thread,不重启当执行时会超时,超时后则自动降为异步:

 

  1. MariaDB[mydb]> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
  2. MariaDB[mydb]>setglobal rpl_semi_sync_master_enabled=on;
  3.  
  4. MariaDB[mydb]> stop slave io_thread;
  5. Query OK,0 rows affected (0.01 sec)
  6.  
  7. MariaDB[mydb]> start slave io_thread;
  8. Query OK,0 rows affected (0.00 sec)
  9.  
  10. mysql> show global status like ‘%semi%’;# 查看半同步客户端
  11. +——————————————–+——-+
  12. |Variable_name|Value|
  13. +——————————————–+——-+
  14. |Rpl_semi_sync_master_clients|0|
  15. |Rpl_semi_sync_master_net_avg_wait_time|0|
  16. |Rpl_semi_sync_master_net_wait_time|0|
  17. |Rpl_semi_sync_master_net_waits|0|
  18. |Rpl_semi_sync_master_no_times|1|
  19. |Rpl_semi_sync_master_no_tx|3|
  20. |Rpl_semi_sync_master_status| OFF |
  21. |Rpl_semi_sync_master_timefunc_failures|0|
  22. |Rpl_semi_sync_master_tx_avg_wait_time|0|
  23. |Rpl_semi_sync_master_tx_wait_time|0|
  24. |Rpl_semi_sync_master_tx_waits|0|
  25. |Rpl_semi_sync_master_wait_pos_backtraverse|0|
  26. |Rpl_semi_sync_master_wait_sessions|0|
  27. |Rpl_semi_sync_master_yes_tx|0|
  28. +——————————————–+——-+
  29. 14 rows inset(0.00 sec)

然后自行验证吧!

总结:使用半同步复制机制,性能也许会受到影响,但其主要是为了维持数据完整性,安全性的的一个策略,虽会损失一点性能,但还是值得的。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/133043.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4018字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中