默认情况下,MySQL的复制功能是异步的。master把binlog发送给slave时,这个复制动作就已经完成,master不会验证slave是否接收完毕(类似于Oracle DataGuard Maximum Performance)。异步复制同时意味着在把数据从一个mysqld实例拷贝到另一个mysqld时有一个延时,即master当前提交的事务不会在同一时刻拷贝到slave。这也带来了一定的风险,当master或slave发生故障时,slave有可能会没有接收到master发送过来的binlog,这样就会造成了master/slave的数据不一直,甚至在恢复时也会造成数据的损失。

为了解决这个问题,MySQL 在5.5以后引入了一种半同步模式,slave在接收binlog并写入relay log后会给服务器发送一个反馈,告诉master接收完成,当出现超时情况时,master会暂时切换到异步复制模式,和Oracle DataGuard Maximum Available的处理方式比较相似。半同步复制模式必须在master和slave端同时启用,否则master会使用默认的异步模式。

1. 开启半同步

我的环境是RHEL 6.5 x86_64, Percona-Server-server-56(RPM),已经配置了异步的同步模式。

检查动态加载选项和插件列表。

mysql> select @@have_dynamic_loading ;

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

| @@have_dynamic_loading |

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

| YES |

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

1 row in set (0.00 sec)

mysql> show plugins;

......

默认并没有加载半同步插件,rpm发行版的插件.so文件的位置

/usr/lib64/mysql/plugin/semisync_master.so

/usr/lib64/mysql/plugin/semisync_slave.so

然后在M/S上都加载插件并启用同步。初次加载插件后,MySQL会将该插件记录到系统表mysql.plugin中,下次mysqld启动时会自动加载,无需INSTALL PLUGIN

mysql> INSTALL PLUGIN rpl_semi_sync_master soname 'semisync_master.so' ;

Query OK, 0 rows affected (0.01 sec)

mysql> INSTALL PLUGIN rpl_semi_sync_slave soname 'semisync_slave.so';

Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL rpl_semi_sync_master_enabled=ON;

mysql> SET GLOBAL rpl_semi_sync_slave_enabled=ON;

要将rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled参数写入配置文件my.cnf

rpl_semi_sync_master_enabled = 1

rpl_semi_sync_slave_enabled =1

日志文件会显示:

2014-08-14 14:13:23 5927 [Note] Semi-sync replication initialized for transactions.

2014-08-14 14:13:23 5927 [Note] Semi-sync replication enabled on the master.

2. 半同步的参数说明

在master上有4个相关参数,slave中有2个.

mysql> show global variables like 'rpl_semi%';

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

| Variable_name | Value |

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

| rpl_semi_sync_master_enabled | ON | --master上是否开启了半同步复制模式

| rpl_semi_sync_master_timeout | 10000 | --该参数默认为10000毫秒,可动态调整。它用来表示如果主库中某个事务等待时间超过10秒,则降级为异步复制模式。

| rpl_semi_sync_master_trace_level | 32 | --开启半同模式的调试级别

| rpl_semi_sync_master_wait_no_slave | ON | --表示是否允许master每个事物提交后都要等待slave的接收等待确认信号,默认为ON。

| rpl_semi_sync_slave_enabled | ON | --slave是否开启了半同步复制模式

| rpl_semi_sync_slave_trace_level | 32 |

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

6 rows in set (0.00 sec)

3. 半同步与异步的切换

执行完上面的步骤后,我们在M/S上检查半同步的状态,发现rpl_semi_sync_slave_status都是关闭的。这说明虽然启用了半同步的功能,但slave不会自动从异步模式转换到半同步模式。

mysql> show status like "%semi%";

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

| Variable_name | Value |

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

| Rpl_semi_sync_master_clients | 1 | --有多少slave配置成了semi-sync模式

| Rpl_semi_sync_master_net_avg_wait_time | 677 | --等待slave确认的平均等待时间,单位微秒。

| Rpl_semi_sync_master_net_wait_time | 3385 | --master的总等待时间,单位微秒

| Rpl_semi_sync_master_net_waits | 5 | --等待slave确认的的总的等待次数

| Rpl_semi_sync_master_no_times | 0 | --关闭半同步复制的次数

| Rpl_semi_sync_master_no_tx | 0 | --slave确认的不成功提交次数

| Rpl_semi_sync_master_status | ON | --master现在是否是半同步复制状态

| Rpl_semi_sync_master_timefunc_failures | 0 | --半同步所用的时间函数失败的次数

| Rpl_semi_sync_master_tx_avg_wait_time | 776 | --事务等待slave确认的平均等待时间,单位微秒

| Rpl_semi_sync_master_tx_wait_time | 3881 | --事物等待slave确认的总等待时间,单位微秒

| Rpl_semi_sync_master_tx_waits | 5 | --等待slave确认的的总的等待次数

| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | --改变当前等待最小二进制日志的次数

| Rpl_semi_sync_master_wait_sessions | 0 | --当前有多少个session 因为slave 的回复而造成等待

| Rpl_semi_sync_master_yes_tx | 5 | --slave确认的成功提交次数

| Rpl_semi_sync_slave_status | OFF | --该server的slave是否处于半同步状态

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

过上面的参数也说明了开启半同步会导致一部分额外的开销:

(1). 完成单条事务增加了额外的等待延迟,延迟的大小取决于网络的好坏。

(2). Semi-sync不是分布式事务,主库会在自己完成事务后,等待备库接收事务日志。

接下来重新启动slave。

mysql> stop slave;

Query OK, 0 rows affected (0.01 sec)

mysql> start slave ;

Query OK, 0 rows affected (0.03 sec)

这是Master和Slave中的日志中会提示:

--- master ---

2014-08-14 14:26:10 5927 [Note] Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000009, 1507)

--- slave ---

2014-08-14 14:26:09 5969 [Note] Slave I/O thread: Start semi-sync replication to master 'rep@172.19.17.210:3306' in log 'mysql-bin.000009' at position 1507

次检查slave的状态:

mysql> show status like "%semi%";

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

| Variable_name | Value |

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

| Rpl_semi_sync_master_status | ON |

......

| Rpl_semi_sync_slave_status | ON |

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

15 rows in set (0.01 sec)

参考:一般情况下,当slave的io线程将binlog接受完毕后,要给master发送一个确认。如果超过rpl_semi_sync_master_timeout=10000(10秒)内未收到该确认信号,那么就自动转换为异步复制模式。这种情况下要排查错误并重启slave来恢复半同步模式。

http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html

http://www.orczhou.com/index.php/2011/06/mysql-5-5-semi-sync-replication-setup-config/

mysql semi sync_MySQL Semisync相关推荐

  1. mysql semi join_MySQL 通过semi join 优化子查询

    半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...

  2. mysql semi join_技术分享 | MySQL 子查询优化

    作者:胡呈清 爱可生 DBA 团队成员,擅长故障分析.性能优化,个人博客:https://www.jianshu.com/u/a95...,欢迎讨论. 本文来源:原创投稿 *爱可生开源社区出品,原创内 ...

  3. mysql semi join详解_MySQL中的semi-join

    http://www.linuxidc.com/Linux/2015-05/117523.htm 1. 背景介绍 什么是semi-join? 所谓的semi-join是指semi-join子查询. 当 ...

  4. mysql semi join_MySQL 5.6 Semi join优化之materialization strategy

    8月 24, 2014 | Nix.Huang 考虑如下查询: select * from Country where Country.code IN (select City.Country fro ...

  5. mysql 半同步复制_Mysql半同步复制原理及问题排查

    mysql半同步复制和异步复制的差别如上述架构图所示:在mysql异步复制的情况下,Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master ...

  6. mysql半同步复制问题排查

    1.问题背景       默认情况下,线上的mysql复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失.半同步复制 ...

  7. mysql 5.7.21-linux_MySQL 5.7.21 Linux平台安装 Part 2

    从今天开始MySQL相关方面的东西 今天是关于MySQL的安装 系统为 redhat 6.10 数据库为MySQL 5.7.21 PS:目前最新版本为MySQL 5.7.25 1. 目录规划 2. M ...

  8. MySQL无中心化集群_MySQL Plus 如何做到无中心化、数据强一致性、秒级切换?

    数据库服务于企业的核心交易业务和实时交互应用,承载着企业的核心数据,因此企业对于数据库的数据一致性和高可用性有强烈的需求. 本次内容为青云QingCloud 数据库工程师蒙哲在 3306Pai 201 ...

  9. 问题定位 | XtraBackup 8.0 数据重建避坑事件始末

    作者:卢文双 资深数据库研发工程师 目前负责青云云数据库的研发工作,热衷于研究主流数据库架构.源码,对关系型数据库 MySQL/PostgreSQL 及分布式数据库有深入研究. 前言 在为 Xenon ...

最新文章

  1. 使用npm打包后生成的package.json中重要字段含义
  2. 为何生命进化的方向是衰老,而不是永生?
  3. Visual C++ MFC/ATL开发-高级篇(一)
  4. 计算机视觉编程——图像内容分类
  5. python 列表,元祖,字典的区别
  6. 3DSlicer12:风格准则
  7. microwindows位图解析
  8. php接收post写入文件,PHP中Post和Get获取数据写入文件中
  9. TensorFlow人工智能入门教程之十一 最强网络DLSTM 双向长短期记忆网络(阿里小AI实现)...
  10. [干货来袭]DevExpress ASP.NET示例资源最全分享!(二)
  11. Unicode16 与 UTF-8编码之间的转换
  12. git 分支merge主分支 解决冲突
  13. Java IO 之 介质流
  14. webpack-internal:///./node_modules/vue/dist/vue.esm.js:629 [Vue warn]: Invalid prop: type check fail
  15. 面试技巧,如何通过索引说数据库优化能力
  16. 华为系列设备优先级总结(二)
  17. 《数据库应用》课程设计人事管理系统(java源代码)
  18. NYOJ-57-6174问题-2013年6月29日11:58:06
  19. win32com为word添加页码(示例)
  20. 常见几种显示器进入工厂模式的方法

热门文章

  1. 形成性考核(计算机应用基础) 答案,2019年最新电大《计算机应用基础(Win7)》形成性考核册及答案.pdf...
  2. 东京大学计算机专业研究生好吗,东北大学计算机类研究生个人考研经历以及感受...
  3. Docker 私有仓库registry
  4. android谷歌打印插件下载地址,ARC Welder(App Runtime for Chrome)插件下载 附下载地址
  5. android的actionbar及菜单机制,Android ActionBar基本使用方法
  6. python开发效率怎样_Python 的开发效率真的比 Java高吗?
  7. 怎么去调需要登录的接口_遇到需要的登录的网站怎么办?学好python,用这3招轻松搞定...
  8. IDEA debug模式,修改集合的值
  9. java中hashcode和equals的区别和联系
  10. 远程桌面服务器无法复制粘贴了怎么解决