怎么判断mysql是否是半同步复制

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

我来回答

3个回答

热心网友 时间:2022-04-07 19:06

在谈这个特性之前,我们先来看看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参数 来控制半同步模式下 主库在返回给会话事务成功之前提交事务的方式。

该参数有两个值:

热心网友 时间:2022-04-07 20:24

(1).修改rpl_semi_sync_master_timeout参数。

半同步复制参数中有一个rpl_semi_sync_master_timeout参数,用以控制主库等待备库响应消息的时间,如果超过该值,则认为备库一直没有收到(备库可能挂了,也可能备库执行很慢,较主库相差很远),这个时候复制会切换为普通复制,避免主库的执行事务长时间等待。线上这个值默认是50ms,简单想是不是这个值太小了,遂将其改到10s,但问题依然不解。

(2).打印日志

排查问题最简单最笨的方法就是打日志,看看到底是哪个环节出了问题。主库和备库分别有rpl_semi_sync_master_trace_level和rpl_semi_sync_slave_trace_level参数来控制半同步复制打印日志。将两个参数值设置为80(+16),记录详细日志信息,以及进出的函数调用。

master:

2016-01-04 18:00:30 13212 [Note] ReplSemiSyncMaster::updateSyncHeader:
server(-1721062019), (mysql-bin.000006, 500717950) sync(1),
repl(1)
2016-01-04 18:00:40 13212 [Warning] Timeout waiting for reply of
binlog (file: mysql-bin.000006, pos: 500717950), semi-sync up to file , position
0.
2016-01-04 18:00:40 13212 [Note] Semi-sync replication switched
OFF.

slave:

2016-01-04 18:00:30 332 [Note] ---> ReplSemiSyncSlave::slaveReply
enter
2016-01-04 18:00:30 332 [Note] ReplSemiSyncSlave::slaveReply: reply
(mysql-bin.000006, 500717950)
2016-01-04 18:00:30 332 [Note] <---
ReplSemiSyncSlave::slaveReply exit (0)

热心网友 时间:2022-04-07 21:58

用UPDATE直接编辑user表
mysql -u root
mysql> use mysql;
mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;

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