mysql5.6半同步主从复制配置

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: mysql5.6半同步主从复制配置http://www.bieryun.com/3145.html 在谈这个特性之前,我们先来看看MySQL的复制架构衍生史。 在2000年,MySQL 3.23.15版本引入了Replication。

mysql5.6半同步主从复制配置http://www.bieryun.com/3145.html

在谈这个特性之前,我们先来看看MySQL的复制架构衍生史。

在2000年,MySQL 3.23.15版本引入了Replication。Replication作为一种准实时同步方式,得到广泛应用。这个时候的Replicaton的实现涉及到两个线程,一个在Master,一个在Slave。Slave的I/O和SQL功能是作为一个线程,从Master获取到event后直接apply,没有relay log。这种方式使得读取event的速度会被Slave replay速度拖慢,当主备存在较大延迟时候,会导致大量binary log没有备份到Slave端。

在2002年,MySQL 4.0.2版本将Slave端event读取和执行独立成两个线程(IO线程和SQL线程),同时引入了relay log。IO线程读取event后写入relay log,SQL线程从relay log中读取event然后执行。这样即使SQL线程执行慢,Master的binary log也会尽可能的同步到Slave。当Master宕机,切换到Slave,不会出现大量数据丢失。

在2010年MySQL 5.5版本之前,一直采用的是这种异步复制的方式。主库的事务执行不会管备库的同步进度,如果备库落后,主库不幸crash,那么就会导致数据丢失。于是在MySQL在5.5中就顺其自然地引入了半同步复制,主库在应答客户端提交的事务前需要保证至少一个从库接收并写到relay log中。那么半同步复制是否可以做到不丢失数据呢?下面分析。

在2016年,MySQL在5.7.17中引入了一个全新的技术,称之为InnoDB Group Replication。目前官方MySQL 5.7.17基于Group replication的全同步技术已经问世,全同步技术带来了更多的数据一致性保障。相信是未来同步技术一个重要方向,值得期待。MySQL 5.7 Group Replication

 

半同步机制:

1. 当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。

2. 当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。

3. 当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。

4.  如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。

5.  半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。

由于5.7之后的版本引入的全同步,测试半同步必须用5.6的版本进行。

1.配置半同步的主从复制必须先配置好异步的主从复制,先检查一下异步的主从是否完好。

master:

[html] view plain copy

  1. mysql> mysql> show master status;
  2. +------------------+----------+--------------+------------------+-------------------+
  3. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +------------------+----------+--------------+------------------+-------------------+
  5. | mysql_bin.000013 |      601 |              |                  |                   |
  6. +------------------+----------+--------------+------------------+-------------------+
  7. 1 row in set (0.00 sec)

slave:

[html] view plain copy

  1. mysql> show slave status\G
  2. *************************** 1. row ***************************
  3.                Slave_IO_State: Waiting for master to send event
  4.                   Master_Host: 172.17.61.131
  5.                   Master_User: repl
  6.                   Master_Port: 3306
  7.                 Connect_Retry: 60
  8.               Master_Log_File: mysql_bin.000013
  9.           Read_Master_Log_Pos: 601
  10.                Relay_Log_File: mysqld-relay-bin.000002
  11.                 Relay_Log_Pos: 374
  12.         Relay_Master_Log_File: mysql_bin.000013
  13.              Slave_IO_Running: Yes
  14.             Slave_SQL_Running: Yes
  15.            ...
  16.           Exec_Master_Log_Pos: 601
  17.               Relay_Log_Space: 548
  18.               Until_Condition: None
  19.              ...
  20.              Master_Server_Id: 10000
  21.                   Master_UUID: 82acea94-3e6f-11e8-b4a7-000c29d02daa
  22.              Master_Info_File: /u01/mysql/master.info
  23.                     SQL_Delay: 0
  24.           SQL_Remaining_Delay: NULL
  25.       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
  26.            Master_Retry_Count: 86400
  27.            ...
  28. 1 row in set (0.00 sec)

2.master安装半同步模块并启动(此模块就在/usr/local/mysql/lib/plugin/semisync_master.so)

PS:如果想卸载异步模块就使用uninstall即可。

[html] view plain copy

  1. mysql> show global variables like '%semi%';
  2. Empty set (0.00 sec)
  3.  
  4. mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
  5. Query OK, 0 rows affected (0.06 sec)
  6.  
  7. mysql>  show global variables like '%semi%';
  8. +------------------------------------+-------+
  9. | Variable_name                      | Value |
  10. +------------------------------------+-------+
  11. | rpl_semi_sync_master_enabled       | OFF   |
  12. | rpl_semi_sync_master_timeout       | 10000 |
  13. | rpl_semi_sync_master_trace_level   | 32    |
  14. | rpl_semi_sync_master_wait_no_slave | ON    |
  15. +------------------------------------+-------+
  16. 4 rows in set (0.00 sec)

rpl_semi_sync_master_enabled参数是指是否已启动半同步

rpl_semi_sync_master_timeout参数连接salve超时的时间,单位为毫秒,默认为10秒

在配置文件中修改这两个参数并重启数据库

[html] view plain copy

  1. [root@qht131 ~]# cat /etc/my.cnf
  2. 。。。
  3. [mysqld]
  4. 。。。
  5. rpl_semi_sync_master_enabled = 1
  6. rpl_semi_sync_master_timeout = 2000

[html] view plain copy

  1. [root@qht131 ~]# service mysql restart
  2. Shutting down MySQL....                                    [  OK  ]
  3. Starting MySQL..                                           [  OK  ]

 

[html] view plain copy

  1. mysql>  show global variables like '%semi%';
  2. +------------------------------------+-------+
  3. | Variable_name                      | Value |
  4. +------------------------------------+-------+
  5. | rpl_semi_sync_master_enabled       | ON    |
  6. | rpl_semi_sync_master_timeout       | 2000  |
  7. | rpl_semi_sync_master_trace_level   | 32    |
  8. | rpl_semi_sync_master_wait_no_slave | ON    |
  9. +------------------------------------+-------+
  10. 4 rows in set (0.00 sec)

3.slave安装半同步模块

[html] view plain copy

  1. mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  2. Query OK, 0 rows affected (0.03 sec)
  3.  
  4. mysql> show global variables like '%semi%';
  5. +---------------------------------+-------+
  6. | Variable_name                   | Value |
  7. +---------------------------------+-------+
  8. | rpl_semi_sync_slave_enabled     | OFF   |
  9. | rpl_semi_sync_slave_trace_level | 32    |
  10. +---------------------------------+-------+
  11. 2 rows in set (0.00 sec)

修改配置文件打开半同步

[html] view plain copy

  1. [root@qht132 backup]# cat /etc/my.cnf
  2. 。。。
  3. [mysqld]
  4. 。。。。
  5. rpl_semi_sync_slave_enabled=1

[html] view plain copy

  1. [root@qht132 backup]# service mysql restart
  2. Shutting down MySQL..                                      [  OK  ]
  3. Starting MySQL..                                           [  OK  ]

 

[html] view plain copy

  1. mysql> show global variables like '%semi%';
  2. +---------------------------------+-------+
  3. | Variable_name                   | Value |
  4. +---------------------------------+-------+
  5. | rpl_semi_sync_slave_enabled     | ON    |
  6. | rpl_semi_sync_slave_trace_level | 32    |
  7. +---------------------------------+-------+
  8. 2 rows in set (0.00 sec)

需要重新连接master服务器,半同步才会生效:

[html] view plain copy

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

3.检查一下半同步是否完成

[html] view plain copy

  1. mysql> show global status like 'rpl%';
  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.03 sec)

现在半同步已经正常工作了,主要看Rpl_semi_sync_master_clients是否不为0,Rpl_semi_sync_master_status是否为ON。如果Rpl_semi_sync_master_status为OFF,说明出现了网络延迟或Slave IO线程延迟。

4.那么可以验证一下半同步超时,是否会自动降为异步工作。可以在Slave上停掉半同步协议,然后在Master上创建数据库看一下能不能复制到Slave上。

slave上先关闭半同步:

[html] view plain copy

  1. mysql> set global rpl_semi_sync_slave_enabled = 0 ;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> stop slave io_thread;
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> start slave io_thread;
  8. Query OK, 0 rows affected (0.00 sec)

master:

[html] view plain copy

  1. mysql> create database dbtest;
  2. Query OK, 1 row affected (2.01 sec)
  3.  
  4. mysql> create database dbtest2;
  5. Query OK, 1 row affected (0.00 sec)

创建第一个数据库花了2.01秒,而我们前面设置的超时时间是2秒,而创建第二个数据库花了0.01秒,由此得出结论是超时转换为异步传送。可以在Master上查看半同步相关的参数值Rpl_semi_sync_master_clients和Rpl_semi_sync_master_status是否正常。

[html] view plain copy

  1. mysql> show global status like '%semi%';
  2. +--------------------------------------------+-------+
  3. | Variable_name                              | Value |
  4. +--------------------------------------------+-------+
  5. | Rpl_semi_sync_master_clients               | 0     |
  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              | 1     |
  10. | Rpl_semi_sync_master_no_tx                 | 2     |
  11. | Rpl_semi_sync_master_status                | OFF   |
  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.03 sec)

Rpl_semi_sync_master_clients已为0,Rpl_semi_sync_master_status已为OFF,现在主从复制已是异步状态。

5.还有一个问题,slave开启半同步后,master能自动开启半同步吗?

slave:

[html] view plain copy

  1. mysql> set global rpl_semi_sync_slave_enabled = 1;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> stop slave io_thread;
  5. Query OK, 0 rows affected (0.01 sec)
  6.  
  7. mysql> start slave io_thread;
  8. Query OK, 0 rows affected (0.00 sec)

master:

[html] view plain copy

  1. mysql> show global status like '%semi%';
  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              | 1     |
  10. | Rpl_semi_sync_master_no_tx                 | 2     |
  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)

当Slave开启半同步后,或者当主从之间网络延迟恢复正常的时候,半同步复制会自动从异步复制又转为半同步复制,还是相当智能的。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
存储 SQL 关系型数据库
创建并配置RDS实例
在阿里云上创建RDS实例涉及登录控制台、进入RDS管理页面、创建实例、选择数据库引擎和版本、配置实例规格与存储、设定网络与安全组、设置实例信息、确认订单并支付,最后初始化数据库。操作步骤可能因界面更新或数据库引擎不同略有差异。
18 1
|
23天前
|
SQL 存储 关系型数据库
MySQL的主从复制&主从同步
MySQL的主从复制&主从同步
26 0
|
4天前
|
负载均衡 容灾 关系型数据库
mysql主从复制
mysql主从复制
20 1
|
21天前
|
SQL 存储 运维
MySQL高可用性:主从复制和集群
MySQL高可用性:主从复制和集群
30 0
|
3天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
33 0
|
9天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
18天前
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
14 1
|
21天前
|
弹性计算 关系型数据库 MySQL
rds子网配置
在阿里云中配置RDS子网涉及五个关键步骤:1) 创建或选择VPC作为私有网络环境;2) 在VPC内创建子网并确保IP地址不重叠;3) 关联路由表和安全组以控制流量及访问权限;4) 创建RDS实例时指定VPC和子网;5) 确保ECS实例与RDS在同一VPC或配置相应跨VPC访问,并调整安全组规则。这样可保障RDS与其他资源的通信及网络性能。
16 6
|
24天前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
174 0
|
4天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)