半同步复制简介

MySQL复制默认情况下是异步的,主库将事件写入binlog并不管从库是否接受并处理它们,如果主库崩溃时,已提交的事务可能没有被传送到从库,因此主从切换可能导致数据丢失。Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了至少一个备库。半同步

复制中,仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行完成了。半同步复制确实有一定的性能影响,因为需要等待的从库确认。这是对增加数据的完整性的折衷。

工作原理:

从库连接主库时指明时从库否有半同步能力

主库启动半同步复制且至少有一个半同步从库,主库线程执行事务提交之后将会阻塞直到任一半同步从库确认接收到该事务的所有事件或者超时

从库确认接收到事务的所有事件之后写入到中继日志并刷新到磁盘

如果超时没有任何从库确认事务,主库恢复到异步复制,保障业务的正常使用,直到一台从库追赶上之后,继续切换到半同步模式

半同步复制必须主从两端同时启用,如任意一端禁止将使用异步复制

当主库被阻塞时(已经提交的事务等待从从库确认),不会向执行事务的session返回信息;当主库阻塞结束后,返回session执行结果。

此时,主库事务已提交,至少一台从库确认接收到事务。

如果主备网络故障或者从库崩溃,主库在事务提交后等待10秒(rpl_semi_sync_master_timeout默认值)后,主从复制将自动降级为异步模式。

半同步复制是通过plugin实现的,master和slave使用不同的plugin。默认情况下没有安装该plugin,插件位于CMAKE_INSTALL_PREFIX/lib/plugin/。安装完插件之后,还需要手动设置系统参数以开启半同步复制模式。

安装配置半同步

[Master]

首先先检查 mysql是否支持动态添加插件

mysql> show variables like 'have_dynamic_loading';

+----------------------+-------+

| Variable_name | Value |

+----------------------+-------+

| have_dynamic_loading | YES |

+----------------------+-------+

1 row in set (0.02 sec)

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

Query OK, 0 rows affected (0.04 sec)

mysql> show variables like '%sem%';

+------------------------------------+-------+

| Variable_name | Value |

+------------------------------------+-------+

| rpl_semi_sync_master_enabled | OFF |

| rpl_semi_sync_master_timeout | 10000 |

| rpl_semi_sync_master_trace_level | 32 |

| rpl_semi_sync_master_wait_no_slave | ON |

+------------------------------------+-------+

4 rows in set (0.00 sec)

mysql> set global rpl_semi_sync_master_enabled = ON;

Query OK, 0 rows affected (0.00 sec)

mysql> set global rpl_semi_sync_master_timeout=2000; #毫秒

Query OK, 0 rows affected (0.00 sec)

mysql> show status like '%sem%';

+--------------------------------------------+-------+

| Variable_name | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients | 0 | # 有多少slave设置了半同步模式

| Rpl_semi_sync_master_net_avg_wait_time | 0 | # 事务提交后,等待备库响应的平均时间

| Rpl_semi_sync_master_net_wait_time | 0 | # 网络响应等待的总时间

| Rpl_semi_sync_master_net_waits | 0 | # 网络等待总次数

| Rpl_semi_sync_master_no_times | 0 | # 一共有几次从Semi-sync跌回普通状态

| Rpl_semi_sync_master_no_tx | 0 | # 备库未及时响应的事务次数

| Rpl_semi_sync_master_status | ON | # 主库上Semi-sync是否正常开启

| Rpl_semi_sync_master_timefunc_failures | 0 | # 时间函数未正常工作的次数

| Rpl_semi_sync_master_tx_avg_wait_time | 0 | # 开启Semi-sync,事务返回需要等待的平均时间

| Rpl_semi_sync_master_tx_wait_time | 0 | # 事务等待备库响应的总时间

| Rpl_semi_sync_master_tx_waits | 0 | # 事务等待备库响应的总次数

| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | # 改变当前等待事务记录最小二进制日志的次数

| Rpl_semi_sync_master_wait_sessions | 0 | # 当前有几个线程在等待备库响应

| Rpl_semi_sync_master_yes_tx | 0 | # 备库成功响应的事务次数

+--------------------------------------------+-------+

14 rows in set (0.01 sec)

[Slave]

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

Query OK, 0 rows affected (0.03 sec)

mysql> show variables like '%sem%';

+---------------------------------+-------+

| Variable_name | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled | OFF |

| rpl_semi_sync_slave_trace_level | 32 |

+---------------------------------+-------+

2 rows in set (0.00 sec)

mysql> set global rpl_semi_sync_slave_enabled = ON;

Query OK, 0 rows affected (0.00 sec)

然后重启replication(stop slave;start slave;)即可。

一定需要重启,否则master无法确认该slave是否开启了半同步。相同的操作可以在任意多个slave中进行设置。

[slave]

mysql> show status like '%sem%';

+----------------------------+-------+

| Variable_name | Value |

+----------------------------+-------+

| Rpl_semi_sync_slave_status | ON |

+----------------------------+-------+

1 row in set (0.01 sec)

[master]

mysql> show status like '%sem%';

+--------------------------------------------+-------+

| Variable_name | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients | 1 |

| Rpl_semi_sync_master_net_avg_wait_time | 9978 |

| Rpl_semi_sync_master_net_wait_time | 19957 |

| Rpl_semi_sync_master_net_waits | 2 |

| Rpl_semi_sync_master_no_times | 1 |

| Rpl_semi_sync_master_no_tx | 2 |

| Rpl_semi_sync_master_status | ON |

| Rpl_semi_sync_master_timefunc_failures | 0 |

| Rpl_semi_sync_master_tx_avg_wait_time | 0 |

| Rpl_semi_sync_master_tx_wait_time | 0 |

| Rpl_semi_sync_master_tx_waits | 0 |

| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |

| Rpl_semi_sync_master_wait_sessions | 0 |

| Rpl_semi_sync_master_yes_tx | 0 |

+--------------------------------------------+-------+

14 rows in set (0.00 sec)

状态说明:

Rpl_semi_sync_master_tx_avg_wait_time:事务因开启Semi_sync,平均需要额外等待的时间

Rpl_semi_sync_master_net_avg_wait_time:事务进入等待队列后,到网络平均等待时间

依据上面两个状态值可以知道,Semi-sync的网络消耗有多大,给某个事务带来的额外的消耗有多大。

Rpl_semi_sync_master_status: 表示主库当前Semi-sync是否正常工作

Rpl_semi_sync_slave_status: 表示从库当前Semi-sync是否正常工作

Rpl_semi_sync_master_no_times:可以知道一段时间内,Semi-sync是否有超时失败过,该计数器则记录了这样的失败次数。

Rplsemi_sync_master_wait_pos_backtraverse:在semisync_master中,维护了这样的两个变量wait_file_name和waitfile_pos,当主库上多个事务都在等待从库的响应时,这两个变量记录了所有等待中,最小的那一个Binlog位置。如果这时一个新的事务加入等待,并且该事务需要等待的Binlog比waitfile_name和waitfile_pos还小的话,则更新这两个值,并将Rpl_semi_sync_master_wait_pos_backtraverse值自增1。

整理自网络

Svoid

2015-01-29

mysql半同步降级_MySQL半同步复制相关推荐

  1. mysql半同步模式_MySQL 半同步复制模式的实现

    半同步复制原理图 #半同步启动需要主从两端都需要加载安装各自对应的semi模块,从库端支持半同步功能的数量至少一台:主库端当一个事务成功提交后,并不及时反馈给前端用户,该线程会被临时block,等待由 ...

  2. mysql 半同步 原理_MySQL半同步复制原理与配置详解

    一 .异步.同步和半同步复制概念 异步复制(Asynchronous replication),MySQL默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已 ...

  3. mysql 主主同步失败_MySQL 主主复制失败问题

    今天遇到 MySQL 主主同步复制失败的问题,记录下解决办法 注意下文中 MySQL 版本比较老,现在新版版本支持了很多新的特性.笔者用的 MySQL 版本是 5.7. 问题描述: DB1 和 DB2 ...

  4. mysql主从同步原理_mysql主从同步以及原理

    mysql主从复制介绍 当前的生产工作中,大多数应用的mysql主从同步都是异步的复制方式,即不是严格实时的数据同步. 实时和异步: 同步复制: 指的是客户端连接到MySQL主服务器写入一段数据,My ...

  5. mysql 从服务器同步设置_mysql主从同步配置

    1.为什么要主从同步? 在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一.尤其是在大规模系统中,数据库集群已经成为必备的配置之一.集群的好处主要有:查询负载.数据库复制备份等.其中Ma ...

  6. mysql+主从同步端口_MySQL主从同步配置

    MySQL主从同步 1. 主从同步的定义 主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave).因为复 ...

  7. mysql的主从同步问题_mysql主从同步问题梳理

    前言: MySQL主从复制故障机延迟原因有很多,之前详细介绍了Mysql主从复制的原理和部署过程,在mysql同步过程中会出现很多问题,导致数据同步异常.以下梳理了几种主从同步中可能存在的问题: 1) ...

  8. mysql设置主从同步只读_MySql主从同步设置

    主MySql服务器A:192.168.1.3 从MySql服务器B:192.168.1.4 1.编辑A的my.cnf,一般在/etc/my.cnf,在[mysqld]下面添加 log-bin=mysq ...

  9. mysql数据库同步时间_MySQL 数据库同步

    简明现代魔法 -> 数据库技术 -> MySQL 数据库同步 MySQL 数据库同步 2010-01-15 MySQL 的数据同步,在 MySQL 官方网站文档上,叫 Replicatio ...

最新文章

  1. Python 获取接口数据,解析JSON,写入文件
  2. jquery 遍历java对象的属性_用jquery each标签遍历java list对象
  3. java代码,继承。。。主要是传值,赋值。
  4. 深拷贝与浅拷贝的区别
  5. dalvik虚拟机简单介绍
  6. 免费生成十字绣字体_十字绣鞋垫图案 手工鞋垫历史长
  7. python串口数据分包_python TCP Socket的粘包和分包的处理详解
  8. 设计某高校学生选课管理系统
  9. jpa 人大金仓数据库方言_人大金仓数据库(kingbase7d)操作入门指南 Windows
  10. 使用Graghics2D实现证书签字盖章功能总结
  11. 用户研究|为何这么多用户愿意成为VIP?
  12. c语言指针选择题库及答案,C语言指针练习习题及答案.doc
  13. javascript javascript面向对象的理解及简单的示例
  14. 判断机型,支持最新设备(iPhone SE Gen2 和 iPad Pro 11 Gen2、iPad Pro 12.9 Gen4)
  15. HTML5七夕情人节表白网页制作 __浪漫空中散落的花瓣3D相册__ HTML+CSS+JavaScript
  16. IIR数字滤波器设计和实现
  17. win10系统ipv6服务器地址,win10系统设置ipV6地址的处理办法
  18. WiFi语音、VoLTE以及下一代移动语音服务
  19. 闪马人书单2.0|正是读书时
  20. Vue2 修改打包文件的编码格式(webpack-encoding-plugin)

热门文章

  1. python编程基础_月隐学python第2课
  2. php网站xml链接,xml图像超链接的制作代码
  3. php ajax 重复提交,ThinkPHP防止重复提交表单的方法实例分析
  4. yii添加模型基础类
  5. Notification的功能和用法 加薪通知
  6. swift变量和函数
  7. 河南多校大一训练赛 C 青蛙的约会
  8. 快速排序算法 java 实现
  9. PHPcms 把盛大登陆换成人人网登陆
  10. WPF LibraryBar去背景色