MySQL半同步复制实践

半同步复制

MySQL的主从复制在5.5版本以前只支持异步复制,也就是说主库在执行一些事务后,是不管从库备库的进度的,这种方式最大的好处是速度快、效率高;缺点就是在主库宕机后,不能确保从库和主库的数据一致性。

半同步复制的好处就是,主库在每执行一次事务后,会等待备库接受日志后才返回给客户端,如果做的是小事务,两台主机的延迟较小,则可以实现在损失很小的性能的情况下保证零数据丢失。

原理

1)主库每执行一次事务都会先让备库读取日志,确保至少有一台备库上面的数据和自己完整

2)如果在一个timeout超时时间内主库仍旧没有收到备库的应答,则自动q切换回异步模式,保证业务运行

3)半同步复制只能保证从库读取了日志,并不能保证数据写入到了从库数据库中,还得看从库sql进程执行情况

4)如果有从库进度追赶上了主库,模式继续切换回半同步状态

环境搭建实践

MySQL半同步复制插件由谷歌提供,5.5版本以后自带可以直接使用

!!注意,两台主机实现半同步复制之前的必须已经实现主从复制
请参考博文:http://www.lichengbing.cn/archivers/82.html
mysql> show variables like ‘plugin_dir‘;
+---------------+--------------------------------+
| Variable_name | Value                          |
+---------------+--------------------------------+
| plugin_dir    | /application/mysql/lib/plugin/ | #插件位置
+---------------+--------------------------------+
1 row in set (0.00 sec)

主库安装插件

mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
mysql> show variables like ‘%rpl_semi_sync%‘; #查看配置状态
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
mysql> set global rpl_semi_sync_master_enabled = 1; #开启Semi-sync功能
mysql> set global rpl_semi_sync_master_timeout = 10000; #设置超时时间为10秒
mysql> show variables like ‘%rpl_semi_sync%‘;
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+

加入配置文件my.cnf中

[mysqld]
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000

从库

安装插件

mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
mysql> show variables like ‘%rpl_semi_sync%‘;
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
mysql> set global rpl_semi_sync_slave_enabled = 1; #开启插件
mysql> stop slave;  #重启从库IO进程
mysql> start slave;

此时在主库这边可以查看半同步复制状态

mysql> show global status like ‘%rpl_semi%‘;
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 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              | 2     |
| Rpl_semi_sync_master_no_tx                 | 1     |
| 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     |
+--------------------------------------------+-------+
14 rows in set (0.01 sec)

做几个简单的测试:主库插入一行数据

mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | 小明   |
+----+--------+
1 row in set (0.00 sec) 
mysql> insert into test values(2,‘test‘);
Query OK, 1 row affected (0.00 sec) #可以看见延迟几乎可以忽略

从库这边,数据正常说明成功了~

mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | 小明   |
|  2 | test   |
+----+--------+
2 rows in set (0.00 sec)

模拟下从库故障

mysql> stop slave IO_THREAD;
Query OK, 0 rows affected (0.01 sec)

我们再在主从插入数据

mysql> insert into test values(3,‘test‘);
Query OK, 1 row affected (10.01 sec) #插入时间很久,10秒钟,10秒超时后,自动切换回异步复制了
mysql> show global status like ‘%rpl_semi%‘;
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 498   |
| Rpl_semi_sync_master_net_wait_time         | 1495  |
| Rpl_semi_sync_master_net_waits             | 3     |
| Rpl_semi_sync_master_no_times              | 3     |
| Rpl_semi_sync_master_no_tx                 | 2     |
| Rpl_semi_sync_master_status                | OFF   | #关闭状态
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 799   |
| Rpl_semi_sync_master_tx_wait_time          | 1599  |
| Rpl_semi_sync_master_tx_waits              | 2     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 2     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

恢复IO线程

mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
mysql> show global status like ‘%rpl_semi%‘;
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 4526  |
| Rpl_semi_sync_master_net_wait_time         | 18107 |
| Rpl_semi_sync_master_net_waits             | 4     |
| Rpl_semi_sync_master_no_times              | 3     |
| Rpl_semi_sync_master_no_tx                 | 2     |
| Rpl_semi_sync_master_status                | ON    | #重新开启了
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 799   |
| Rpl_semi_sync_master_tx_wait_time          | 1599  |
| Rpl_semi_sync_master_tx_waits              | 2     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 2     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
时间: 2024-12-12 13:52:11

MySQL半同步复制实践的相关文章

MySQL半同步复制的数据一致性探讨微信后台团队实践【转】

MySQL是一个RDBMS(关系型数据库管理系统),由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.由于其体积小.速度快.拥有成本低,尤其是开放源码这一特点,广受各大企业欢迎,包括腾讯,阿里,百度,网易,Google,FaceBook等互联网巨头企业. 随着互联网的高速发展,互联网服务可用性变得越发重要,数据容灾也随之成为各企业的关键任务.在数据容灾中,数据库集群如何处理数据一致性也成为了各企业需要解决的问题.特别在一些新兴的金融服务中,MySQL也逐渐成为其核心数据库,如何

mysql半同步复制的实现

mysql半同步复制和异步复制的差别如上述架构图所示:在mysql异步复制的情况下,Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master Sever就自动返回数据给客户端,而不管slave上是否接受到了这个二进制日志.在半同步复制的架构下,当master在将自己binlog发给slave上的时候,要确保slave已经接受到了这个二进制日志以后,才会返回数据给客户端.对比两种架构:异步复制对于用户来说,可以确保得到快速的响应结构,但是

MySQL半同步复制

1.概述 主从复制存在三种类型:异步复制.同步复制以及半同步复制,下面根据手册上解释逐一说明一下. 异步复制: 主库将更新的事件写入binlog,准备好的从库获取这些binlong进行回放.这无法保证所有从库都接到这些事件. ? With asynchronous replication, the master writes events to its binary log and slaves request them when they are ready. There is no guar

mysql半同步复制实现

mysql半同步复制和异步复制的区别如上述架构图所看到的:在mysql异步复制的情况下.Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master Sever就自己主动返回数据给client.而无论slave上是否接受到了这个二进制日志.在半同步复制的架构下.当master在将自己binlog发给slave上的时候.要确保slave已经接受到了这个二进制日志以后,才会返回数据给client. 对照两种架构:异步复制对于用户来说,能够确保得

Mysql半同步复制模式说明 - 运维小结

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是:主库开启binlog功能并授权从库连接主库,从库通过chan

MySQL半同步复制原理配置与介绍详解

环境介绍: Ubuntu Server 16.04.2+MySQL 5.7.17 Community Server (GPL) MySQL安装 通过APT的方式安装,官方指导文档地址: https://dev.mysql.com/downloads/repo/apt/ 1.下载mysql-apt-config_0.8.3-1_all.deb 2.安装deb A Quick Guide to Using the MySQL APT Repository: https://dev.mysql.com

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

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是: 主库开启binlog功能并授权从库连接主库,从库通过cha

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

[1]配置my.cnf [1.1]通用复制配置 #replication_new log_bin=/mysql/log/3306/mysql-bin #开启binlog log_bin_index=/mysql/log/3306/mysql-bin.index binlog_format=row binlog_rows_query_log_events=on max_binlog_size=2048 bind-address=0.0.0.0 server_id=2013306 expire_lo

简述mysql半同步复制—semisync

mysql的半同步复制-semisync是基于默认的异步复制和完全同步复制之间,它是在master在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个slave收到并写到relay log中才返回给客户端.相对于异步复制,semisync提高了数据的安全性,但是又比完全同步性能好,所以master和slave之间的时间一定要一致,以免造成semisync失败.mysql的半同步复制的插件是由Google免费提供的在mysql的$basedir/lib/plugin下有相应的动态库文件