半同步复制:

插件由Google提供的。

主库在提交事务时,在客户端接收到查询结束反馈前必须保证二进制日志已经传输到至少一台备库上。

从库的IO线程在接受完binlog并写入到自己的relaylog后(不管realylog是否执行完),要给主库一个确认,这样主库线程才返回给当前session告知操作完成。

如果备库一直没有回应已收到事件,主库会自动转化为异步复制模式,后期若发现从库恢复后,主从又会自动切换成半同步。

半同步必须在master和slave上都启用才能生效,否则还是按照异步复制模式进行的。

插件:

semisync_master.so   【在主库上安装】

semisync_slave.so    【在从库上安装】

MySQL5.6 上安装方式:

假设目前主从关系已经配置好,下面开始开启半同步即可。

【主库】

> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

> set global rpl_semi_sync_master_enabled=ON;

> set global rpl_semi_sync_master_timeout = 1000;   ### 单位毫秒。这里1000就表示1秒

> set global rpl_semi_sync_master_wait_no_slave = ON;

> show variables like '%semi%';

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

| Variable_name                      | Value |

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

| rpl_semi_sync_master_enabled       | ON    |

| rpl_semi_sync_master_timeout       | 1000  |

| rpl_semi_sync_master_trace_level   | 32    |

| rpl_semi_sync_master_wait_no_slave | ON    |

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

加配置文件:

rpl_semi_sync_master_enabled = ON

rpl_semi_sync_master_timeout = 1000

rpl_semi_sync_master_wait_no_slave = ON

【从库】

> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

> set global rpl_semi_sync_slave_enabled=ON;

> show variables like '%semi%';

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

| Variable_name                   | Value |

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

| rpl_semi_sync_slave_enabled     | ON    |

| rpl_semi_sync_slave_trace_level | 32    |

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

加配置文件:

rpl_semi_sync_slave_enabled = ON

在初次加载插件后,mysql会自动将该插件记录到mysql.plugin表中,下次启动自动加载该插件。因此不需要在配置文件里加上加载semisync的插件(但是配置文件里面还是要写上是否启用这个semi插件的)。

然后,在从库执行 stop slave; start slave ; 即可启用半同步的插件。

从库状态:

> show global status like '%rpl%';

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

| Variable_name              | Value |

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

| Rpl_semi_sync_slave_status | ON    |

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

主库状态:

> show global status like '%semi%';

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

| Variable_name                              | Value |

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

| Rpl_semi_sync_master_clients               | 1     |   ### 1说明有1台从库目前是半同步状态

| 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     |

| Rpl_semi_sync_master_no_tx                 | 0     |

| 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     |

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

半同步涉及的参数:

> show VARIABLES like '%semi%sync%';

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

| 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      |

| rpl_semi_sync_slave_enabled        | OFF     |

| rpl_semi_sync_slave_trace_level    | 32      |

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

rpl_semi_sync_master_timeout

单位毫秒,默认10000毫秒,即10秒钟。

从节点发现从库在XX秒钟没有回应,则转为异步复制方式,不再等待从库。如果主库再次探测到从库恢复了,则自动再次回到半同步复制方式。

【注意这个参数不要设置太大,太大的话,master会直到超时才转换为异步复制模式,这样假如当前有事务要提交则要等超时结果才能执行提交。】

rpl_semi_sync_master_trace_level

调试级别,保持默认的32即可。

1 = general level (for example, time function failures)

16 = detail level (more verbose information)

32 = net wait level (more information about network waits)

64 = function level (information about function entry and exit)

rpl_semi_sync_master_wait_no_slave

默认是ON。表示master每个事务提交后都要等待slave的接收确认信号。如果为OFF则slave追赶上后,master也不会自动回到半同步模式,需要手工开启。

rpl_semi_sync_slave_enabled

slave上是否开启半同步复制模式。【这是配置在从节点上的,当然如果在主节点开启也不会有啥报错】

rpl_semi_sync_slave_trace_level

调试级别,保持默认的32即可。

1 = general level (for example, time function failures)

16 = detail level (more verbose information)

32 = net wait level (more information about network waits)

64 = function level (information about function entry and exit)

其他:

此外,启动半同步也会在mysql的日子里面留下记录,类似“start semi-sync replication to master .....”

例1:半同步和异步的切换:

在slave上执行stop slave io_thread;然后执行show slave status like '%semi%';可以看到半同步变为了OFF状态。

10秒钟后,到master上执行SHOW GLOBAL STATUS LIKE '%semi%';可以半同步的很多状态已经改变了。

再到slave上执行start io_thread;可以发现半同步有启用状态了。

例2:验证半同步与SQL线程无关

在slave上drop掉一个库test2,然后再master上再执行drop database test2;到slave上查看可以看到同步报错了,但是show status like '%semi%';发现半同步状态还是ON的,并没有切换到异步复制。

也就是说:半同步复制跟io_thread有直接关系,跟sql_thread没有关系。半同步复制中,slave接收到master传来的binlog后给master一个确认,但不管中继日志是否执行完。

例3:半同步超时设置太大的缺点

在master上修改rpl_semi_sync_master_timeout = 200000;    修改降级为异步的超时时长为差不多3分钟。

在slave上执行 stop slave io_thread; 停止半同步复制,模拟网络抖动造成从库暂时不可达。

在maser上执行如下命令:

> use test;

> begin;

> update t set name='ccd' wherer id=3;

> SELECT * FROM t;

> commit;

会发现commit要好久才能返回成功(差不多3分钟)。

这是因为半同步复制环境中,master要等slave的确认消息,而上面我们模拟slave宕机了,半同步切换异步复制要等到超时时间结束才降级,这就导致commit变慢了。

本文转自 lirulei90 51CTO博客,原文链接:http://blog.51cto.com/lee90/1973926,如需转载请自行联系原作者

MySQL半同步的配置相关推荐

  1. MySQL半同步复制配置

    前言: MySQL默认的主从复制采用的是异步模式,主库提交事务不需要确认是否已经传送到从库端,在主库发生宕机主备切换时,可能导致主库已经提交的事务在从库丢失的情况. 在MySQL 5.7通过插件支持了 ...

  2. Mysql主从复制的三种同步方式和半同步复制配置

    目录 一.MySQL主从复制的三种同步模式 1.异步复制(Asynchronous replication) 2.全同步复制(Fully synchronous replication) 3.半同步复 ...

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

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

  4. mysql半同步复制实现

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

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

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

  6. mysql 半同步_mysql 主从同步 与 半同步

    mysql主从同步复制定义 主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave).通过配置文件,可以指 ...

  7. MySQL · 源码分析 · MySQL 半同步复制数据一致性分析

    简介 MySQL Replication为MySQL用户提供了高可用性和可扩展性解决方案.本文介绍了MySQL Replication的主要发展历程,然后通过三个参数rpl_semi_sync_mas ...

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

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

  9. MHA-结合MySQL半同步复制高可用集群(Centos7)

    目录 一.理论概述 本案例部署思路 二.环境 三.部署 部署MHA 部署二进制包MySQL及部署主从复制 部署半同步复制 配置MHA MHA测试 部署lvs+keepalived(lvs1,lvs2) ...

最新文章

  1. 《中国人工智能学会通讯》——12.38 知识库与 HTML 表格的融合
  2. wsdl 与 soap协议详解
  3. labview除了全局变量还有别的办法_地中海贫血除了移植,还有什么办法?
  4. Linux的make 命令出现:make:*** No targets specified and no makefile found.Stop
  5. HTML5自定义播放器(简式)
  6. 零基础学习爬虫并实战
  7. poj 1862 Stripies/优先队列
  8. c语言十六进制字符串转整数,C语言-提取字符串中的十六进制数字并转换为一个十进制整数输出...
  9. gm怎么刷东西 rust_RUST:2020年7月第三周 修补和更新
  10. vSphere 故障排除之网络篇
  11. 修改数据库表数据的办法
  12. R-CNN学习笔记5:Faster R-CNN
  13. 在Python中使用XGBoost和scikit-learn进行随机梯度增强
  14. Unity3D网页游戏夺先发之势你hold得住吗?
  15. Proximal Algorithms 1 介绍
  16. jdk8 list Stream groupingBy 分组之后 利用 reducing 求和 BigDecimal
  17. 反射调用目标异常可能原因之一解决java.lang.reflect.InvocationTargetException
  18. ChessBoard棋盘覆盖问题
  19. Leetcode 1823 找出游戏的获胜者 (约瑟夫环问题)
  20. 孙溟㠭凿印《猛击一掌》

热门文章

  1. epoch训练时间不同_神经网络训练的三个基本概念Epoch, Batch, Iteration
  2. python四大高阶函数_四大高阶函数
  3. cbc系统是指_制动EBD,CBC是什么意思?
  4. 简述工业机器人示教再现的一般步骤_基于激光焊缝跟踪传感器的工业机器人焊缝跟踪系统的应用焊接寻位...
  5. php 和bootstrap,bootstrap4和bootstrap3的区别是什么
  6. 修改ubuntu默认的Python版本号
  7. Windows下基于Anaconda的Tensorflow环境配置
  8. Oracle/PLSQL FETCH Statement
  9. 安卓案例:安卓对话框演示
  10. 在IntelliJ IDEA里配置Go开发环境