MySQL半同步的配置

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

半同步复制:

插件由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数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
112 0
|
22天前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
|
11天前
|
存储 SQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
|
12天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
51 2
|
16天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
27天前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
59 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
SQL 存储 关系型数据库
Mysql主从同步 清理二进制日志的技巧
Mysql主从同步 清理二进制日志的技巧
26 1
|
2月前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
271 11
|
2月前
|
关系型数据库 MySQL Go
go抽取mysql配置到yaml配置文件
go抽取mysql配置到yaml配置文件
|
1月前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
78 0
下一篇
无影云桌面