强同步复制模式半同步复制模式哪个好

发布网友 发布时间:2022-04-23 16:59

我来回答

2个回答

热心网友 时间:2022-04-08 03:57

从mysql5.5开始,支持半同步模式复制(semisynchronous replication),比之前的异步模式复制增强了安全性。
半同步复制模式可以确保至少有一个备节点服务器在接受完主服务器发送的binlog日志文件并写入到中继日志后,返回给主节点一个ack信号,告诉主节点已经接收完日志,这时主节点线程才返回给当前session提交信息。
当主节点因为超时未接收到任一个备节点的ack信号时会切换会异步复制模式,从而防止堵塞应用。
当至少有一个备节点返回给主节点ack信号时,主节点切换回半同步复制模式。
主备节点必须全部配置成半同步复制模式,否则不支持该模式。
mysql 的半同步复制是通过安装插件来实现的,主备节点安装相应的插件,否则无法实现半同步复制。
已安装二进制包的默认插件目录在/usr/lib/mysql/plugin中。开启半同步复制模式如下:

1.在主节点中运行
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
2.在每个备节点中运行
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
3.在主节点中运行
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 10000;
4.在备节点中运行
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
5.在主节点中配置文件/etc/my.cnf添加
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout =10000 (默认为10000毫秒,可不更改)
6.在备节点中配置文件/etc/my.cnf添加
rpl_semi_sync_slave_enabled=1
7.查看主节点状态确认半同步复制模式打开

Rpl_semi_sync_master_clients 大于0表示有备机以半同步模式连接到主节点。

备注(单位微秒):
Rpl_semi_sync_master_clients
半同步连接的slave数目
Rpl_semi_sync_master_net_avg_wait_time
主节点等待备节点同步的平均时间
Rpl_semi_sync_master_net_wait_time
主节点等待备节点同步的总时间
Rpl_semi_sync_master_net_waits
主节点等待次数
Rpl_semi_sync_master_no_times
主节点关闭半同步的次数
Rpl_semi_sync_master_no_tx
主节点未收到ack返回信号的次数
Rpl_semi_sync_master_status
半同步主节点状态(当为主节点的时候为ON)
Rpl_semi_sync_master_timefunc_failures
半同步由于调用时间函数错误的次数
Rpl_semi_sync_master_tx_avg_wait_time
半同步主节点等待一个事务的平均等待时间
Rpl_semi_sync_master_tx_wait_time
主节点等待事务完成的总等待时间
Rpl_semi_sync_master_tx_waits
主节点等待事务完成的总次数
Rpl_semi_sync_master_wait_pos_backtraverse
等待备节点事务应用的顺序同主节点日志写入顺序不一致
Rpl_semi_sync_master_wait_sessions
主节点等待的回话次数
Rpl_semi_sync_master_yes_tx
成功完成半同步的事务总次数
Rpl_semi_sync_slave_status
半同步备节点状态(当为备节点的时候为ON)

热心网友 时间:2022-04-08 05:15

在谈这个特性之前,我们先来看看mysql的复制架构衍生史。 MySQL的复制分为三种:         第一种,即普通的replication。 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非常好,可谓非常成熟。 但是这种架构数据是异步的,所以有丢失数据库的风险。         第二种,即mysql cluster。 搭建也简单,本身也比较稳定,是mysql里面对数据保护最最靠谱的架构,也是唯一一个数据完全同步的架构,绝对的零丢失。不过性能就差远些了。        第三种,即semi-sync replication,半同步,性能,功能都介于以上两者之间。从mysql5.5开始诞生,目的是为了折中上述两种架构的性能以及优缺点。“我们今天谈论第三种架构

我们知道,普通的replication,也即mysql的异步复制,依靠mysql二进制日志也即binary log进行数据复制。比如两台机器,一台主机也即master,另外一台是从机,也即slave。


         1. 正常的复制为:事务一(t1)写入binlog buffer;mper 线程通知slave有新的事务t1;binlog buffer 进行checkpoint;slave的io线程接收到t1并写入到自己的的relay log;slave的sql线程写入到本地数据库。 这时,master和slave都能看到这条新的事务,即使master挂了,slave可以提升为新的master。          2. 异常的复制为:事务一(t1)写入binlog buffer;mper 线程通知slave有新的事务t1;binlog buffer 进行checkpoint;slave因为网络不稳定,一直没有收到t1;master 挂掉,slave提升为新的master,t1丢失。 

         3. 很大的问题是:主机和从机事务更新的不同步,就算是没有网络或者其他系统的异常,当业务并发上来时,slave因为要顺序执行master批量事务,导致很大的延迟。


为了弥补以上几种场景的不足,mysql从5.5开始推出了半同步。


即在master的mper线程通知slave后,增加了一个ack,即是否成功收到t1的标志码。也就是mper线程除了发送t1到slave,还承担了接收slave的ack工作。如果出现异常,没有收到ack,那么将自动降级为普通的复制,直到异常修复。

 我们可以看到半同步带来的新问题:         1. 如果异常发生,会降级为普通的复制。 那么从机出现数据不一致的几率会减少,并不是完全消失。         2. 主机mper线程承担的工作变多了,这样显然会降低整个数据库的性能。         3. 在MySQL 5.5和5.6使用after_commit的模式下,  即如果slave 没有收到事务,也就是还没有写入到relay log 之前,网络出现异常或者不稳定,此时刚好master挂了,系统切换到从机,两边的数据就会出现不一致。 在此情况下,slave会少一个事务的数据。 

随着MySQL 5.7版本的发布,半同步复制技术升级为全新的Loss-less Semi-Synchronous Replication架构,其成熟度、数据一致性与执行效率得到显著的提升。


 MySQL 5.7对数据复制效率进行了改进1 主从一致性加强支持在事务commit前等待ACK

新版本的semi sync 增加了rpl_semi_sync_master_wait_point参数 来控制半同步模式下 主库在返回给会话事务成功之前提交事务的方式。

该参数有两个值:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com