MySQL Semisynchronous Replication

复制架构衍生史

1.普通的replication,异步同步。 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非常好,可谓非常成熟。 但是这种架构数据是异步的,所以有丢失数据库的风险。
2.semi-sync replication,半同步。性能,功能都介于异步和全同步中间。从mysql5.5开始诞生,目的是为了折中上述两种架构的性能以及优缺点。
3.sync replication,全同步。目前官方5.7基于Group replication的全同步技术处在labs版本,离正式集成已经不远。全同步技术带来了更多的数据一致性保障。相信是未来同步技术一个重要方向,值得期待。
4.mysql cluster。 基于NDB引擎,搭建也简单,本身也比较稳定,是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.如果异常发生,会降级为普通的复制。 那么从机出现数据不一致的几率会减少,并不是完全消失。
2.主机dumper线程承担的工作变多了,这样显然会降低整个数据库的性能。
3.在MySQL 5.5和5.6使用after_commit的模式下, 即如果slave 没有收到事务,也就是还没有写入到relay log 之前,网络出现异常或者不稳定,此时刚好master挂了,系统切换到从机,两边的数据就会出现不一致。 在此情况下,slave会少一个事务的数据。

随着MySQL 5.7版本的发布,半同步复制技术升级为全新的Loss-less Semi-Synchronous Replication架构,其成熟度、数据一致性与执行效率得到显著的提升。下面做实验是以5.6为基础进行操作,关于5.7带来的新特性请查看此文章

半同步复制的实现

注意:半同步模式是作为MySQL5.5的一个插件来实现的,主库和从库使用不同的插件。同时在配置半同步复制之前请先将异步复制给配置好,以下测试是在搭建异步复制之后操作的。
环境介绍

角色 IP 版本 系统
Master 192.168.100.203 mysql-5.6.31 CentOS 6.7
Slave 192.168.100.202 mysql-5.6.31 CentOS 6.7

查看MySQL是否支持动态增加插件

  1. mysql> show global variables like 'have_dynamic_loading';
  2. +----------------------+-------+
  3. | Variable_name | Value |
  4. +----------------------+-------+
  5. | have_dynamic_loading | YES |
  6. +----------------------+-------+
  7. 1 row in set (0.00 sec)

Master安装插件

  1. mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
  2. Query OK, 0 rows affected (0.53 sec)
  3. mysql> select * from mysql.plugin;
  4. +----------------------+--------------------+
  5. | name | dl |
  6. +----------------------+--------------------+
  7. | rpl_semi_sync_master | semisync_master.so |
  8. +----------------------+--------------------+
  9. 1 row in set (0.00 sec)

Slave安装插件

  1. mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  2. Query OK, 0 rows affected (0.51 sec)
  3. mysql> select * from mysql.plugin;
  4. +---------------------+-------------------+
  5. | name | dl |
  6. +---------------------+-------------------+
  7. | rpl_semi_sync_slave | semisync_slave.so |
  8. +---------------------+-------------------+
  9. 1 row in set (0.00 sec)

主库打开半同步

  1. mysql> set global rpl_semi_sync_master_enabled=1;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> set global rpl_semi_sync_master_timeout=30000;
  4. Query OK, 0 rows affected (0.00 sec)

从库打开半同步

  1. mysql> set global rpl_semi_sync_slave_enabled=1;
  2. Query OK, 0 rows affected (0.00 sec)

由于之前这两台主机是配置了异步复制,所以现在需要重启从库的I/O线程。(如果是全新配置的半同步复制则不需要):

  1. mysql> stop slave io_thread;start slave io_thread;
  2. Query OK, 0 rows affected (0.53 sec)
  3. Query OK, 0 rows affected (0.00 sec)

验证

  1. mysql> show status like '%semi_sync%';
  2. +--------------------------------------------+-------+
  3. | Variable_name | Value |
  4. +--------------------------------------------+-------+
  5. | Rpl_semi_sync_master_clients | 1 |
  6. | Rpl_semi_sync_master_net_avg_wait_time | 0 |
  7. | Rpl_semi_sync_master_net_wait_time | 0 |
  8. | Rpl_semi_sync_master_net_waits | 0 |
  9. | Rpl_semi_sync_master_no_times | 0 |
  10. | Rpl_semi_sync_master_no_tx | 0 |
  11. | Rpl_semi_sync_master_status | ON |
  12. | Rpl_semi_sync_master_timefunc_failures | 0 |
  13. | Rpl_semi_sync_master_tx_avg_wait_time | 0 |
  14. | Rpl_semi_sync_master_tx_wait_time | 0 |
  15. | Rpl_semi_sync_master_tx_waits | 0 |
  16. | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
  17. | Rpl_semi_sync_master_wait_sessions | 0 |
  18. | Rpl_semi_sync_master_yes_tx | 0 |
  19. +--------------------------------------------+-------+
  20. 14 rows in set (0.00 sec)

测试

  1. mysql> insert into newdb values('xiaozels');
  2. Query OK, 1 row affected (0.57 sec)
  3. mysql> select * from hellodb.newdb;
  4. +----------+
  5. | Name |
  6. +----------+
  7. | bols |
  8. | longls |
  9. | cangls |
  10. | xiaozels |
  11. +----------+
  12. 4 rows in set (0.00 sec)
  13. mysql> show status like '%semi_sync%';
  14. +--------------------------------------------+-------+
  15. | Variable_name | Value |
  16. +--------------------------------------------+-------+
  17. | Rpl_semi_sync_master_clients | 1 |
  18. | Rpl_semi_sync_master_net_avg_wait_time | 1199 |
  19. | Rpl_semi_sync_master_net_wait_time | 1199 |
  20. | Rpl_semi_sync_master_net_waits | 1 |
  21. | Rpl_semi_sync_master_no_times | 0 |
  22. | Rpl_semi_sync_master_no_tx | 0 |
  23. | Rpl_semi_sync_master_status | ON |
  24. | Rpl_semi_sync_master_timefunc_failures | 0 |
  25. | Rpl_semi_sync_master_tx_avg_wait_time | 986 |
  26. | Rpl_semi_sync_master_tx_wait_time | 986 |
  27. | Rpl_semi_sync_master_tx_waits | 1 |
  28. | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
  29. | Rpl_semi_sync_master_wait_sessions | 0 |
  30. | Rpl_semi_sync_master_yes_tx | 1 |
  31. +--------------------------------------------+-------+
  32. 14 rows in set (0.00 sec)

此时我们看到Rpl_semi_sync_master_yes_tx 为1,说明测试的insert语句通过半同步复制到从库上去了,从而Rpl_semi_sync_master_yes_tx 加一。下面在从库查看数据是否复制过去:

  1. mysql> select * from hellodb.newdb;
  2. +----------+
  3. | Name |
  4. +----------+
  5. | bols |
  6. | longls |
  7. | cangls |
  8. | xiaozels |
  9. +----------+
  10. 4 rows in set (0.00 sec)

参数说明

  • 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时,反之。

ref:
http://www.actionsky.com/docs/archives/129
http://www.cnblogs.com/ivictor/p/5735580.html

MySQL半同步主从.md的更多相关文章

  1. MySQL半同步复制

    从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...

  2. Mysql半同步复制模式说明及配置示例 - 运维小结

    MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...

  3. MySQL半同步安装以及参数

    MySQL半同步安装以及参数 基于MySQL5.5 官档地址: Semisynchronous Replication Administrative Interface https://dev.mys ...

  4. 安装MySQL半同步复制

    一.简介 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认 ...

  5. mysql半同步复制实现

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

  6. MySQL半同步复制搭建

    默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制是异步的,异步复制可以提供最佳性能,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完 ...

  7. (5.5)mysql高可用系列——MySQL半同步复制(实践)

    关键词,mysql半同步复制 [0]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复 ...

  8. mysql半同步复制跟无损半同步区别

    mysql半同步复制跟无损半同步复制的区别: 无损复制其实就是对semi sync增加了rpl_semi_sync_master_wait_point参数,来控制半同步模式下主库在返回给会话事务成功之 ...

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

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

随机推荐

  1. 解决 windows npm ERR! asyncWrite is not a function 问题

    重装过node,cmd中 node -v,npm -v 提示版本都没有问题,但是在vue项目中npm i 的时候出现了npm ERR! asyncWrite is not a function 问题, ...

  2. oracle序列的创建和使用

    oracle 序列的创建与使用 (2012-03-15 16:14:09) -------------------------------------------------------------- ...

  3. Java的工厂模式(一)

    Java的工厂模式在框架中是用的到很多的,所谓的工厂模式,其实也就是用一个接口来创建对象,把实例化的工作推迟到子类去实现.这样在主函数中就可以直接创建一个工厂类,再通过这个工厂类实现操作. 假设有一个 ...

  4. Android基础知识你知道多少?

    https://github.com/zhantong/interview/blob/master/Android/Android.md 四大组件是什么? 四大组件的启动方式? Activity生命周 ...

  5. js 判断一个元素是否在滚动的可视区域内,不在就固定到可视区域的上方。

    前言:最近工作中,有这样一个场景,判断一个元素是否在滚动的可视区域内,不在就固定到可视区域的上方.为了以后再次遇到,所以记录下来,并分享.转载请注明出处:https://www.cnblogs.com ...

  6. K:有限状态自动机

      有限状态自动机是一种特殊的状态机.它表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.有限状态自动机分为两种,一种是 确定有限状态自动机(DFA) ,一种是 非确定有限状态自动机(NF ...

  7. Linux安装jdk,编写helloworld程序

    今天学习了Linux安装jdk,做个笔记记录一下. 第一步,确定Linux是32位的还是64位的,然后到oracle官网上下载对应版本的jdk,一般下载.tar.gz文件.查看Linux的版本的命令是 ...

  8. MPVUE - 使用vue.js开发微信小程序

    MPVUE - 使用vue.js开发微信小程序 什么是mpvue? mpvue 是美团点评前端团队开源的一款使用 Vue.js 开发微信小程序的前端框架.框架提供了完整的 Vue.js 开发体验,开发 ...

  9. CSS3入门学习之属性大全手册

    CSS Level 2 经历了 9 年的时间(从 2002 年 8 月到 2011 年 6 月)才达到 Recommendation(推荐) 状态.主要的原因是被一些 secondary featur ...

  10. setInterval和setTimeout的区别以及setInterval越来越快问题的解决方法

    setInterval()和setTimeout()方法都是js原生的定时方法,当然它们两个的作用也是不同的,并且最近在做上下滚动公告栏的时候,发现了setInterval()非常令人抓狂的问题,那就 ...