热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL半同步复制实现

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

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

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上;半同步复制对于客户的请求响应稍微慢点,但是他可以保证二进制日志的完整性。

二,半同步复制原理

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

20161595836942


半同步复制的概念:

 

  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)

然后自行验证吧!

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


推荐阅读
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • Ansibleplaybook roles安装redis实例(学习笔记二十九)
    1、相关redis参数:2、templatesredis.conf配置相关参数:daemonizeyespidfilevarrunredis_{{red ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 一、死锁现象与递归锁进程也是有死锁的所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • hackingTeam是如何被黑的
    hackingTeam是如何被黑的 ... [详细]
author-avatar
俺是胖墩墩_499
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有