MySQL半同步复制

目录

MySQL主从复制的几个同步模式:

[●异步复制(Asynchronous replication)](#●异步复制(Asynchronous replication))

[●全同步复制(Fully synchronous replication)](#●全同步复制(Fully synchronous replication))

[●半同步复制(Semisynchronous replication)](#●半同步复制(Semisynchronous replication))

//主数据库配置

//从数据库配置

#主数据库执行

#从数据库执行(此时可能还是OFF状态,需要在下一步重启IO线程后,从库半同步状态才会为ON)

#重启从数据库上的IO线程

#在主库查询半同步状态


MySQL主从复制的几个同步模式:

●异步复制(Asynchronous replication)

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

●全同步复制(Fully synchronous replication)

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

●半同步复制(Semisynchronous replication)

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

//主数据库配置

vim /etc/my.cnf #在 [mysqld] 区域添加下面内容

......

plugin-load=rpl_semi_sync_master=semisync_master.so #加载mysql半同步复制的插件

rpl_semi_sync_master_enabled=ON #或者设置为"1",即开启半同步复制功能

rpl-semi-sync-master-timeout=1000 #超时时间为1000ms,即1s

systemctl restart mysqld

//从数据库配置

vim /etc/my.cnf

......

plugin-load=rpl_semi_sync_slave=semisync_slave.so

rpl_semi_sync_slave_enabled=ON

systemctl restart mysqld

//查看半同步是否在运行

#主数据库执行

show status like 'Rpl_semi_sync_master_status';

show variables like 'rpl_semi_sync_master_timeout';

#从数据库执行(此时可能还是OFF状态,需要在下一步重启IO线程后,从库半同步状态才会为ON)

show status like 'Rpl_semi_sync_slave_status';

#重启从数据库上的IO线程

STOP SLAVE IO_THREAD;

START SLAVE IO_THREAD;

#在主库查询半同步状态

show status like '%Rpl_semi%';

参数说明:

Rpl_semi_sync_master_clients #半同步复制客户端的个数

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 #表示没有成功接收slave提交的次数

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 #当前有多少个session因为slave的回复而造成等待

Rpl_semi_sync_master_yes_tx #成功接受到slave事物回复的次数

当半同步复制发生超时(由rpl_semi_sync_master_timeout参数控制,默认为10000ms,即10s),会暂时关闭半同步复制,转而使用异步复制,也就是会自动降为异步工作。

当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,收到了从库的响应, 则主从又重新恢复为半同步复制。

注:

  1. 在一主多从的架构中,如果要开启半同步复制,并不要求所有的从都是半同步复制。

  2. MySQL 5.7极大的提升了半同步复制的性能。

5.6 版本的半同步复制,dump thread 承担了两份不同且又十分频繁的任务:传送binlog 给 slave ,还需要等待 slave 反馈信息,而且这两个任务是串行的,dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。dump thread 已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的系统吞吐量(TPS)。

5.7 版本的半同步复制中,独立出一个 ack collector thread ,专门用于接收 slave 的反馈信息。这样 master 上有两个线程独立工作,可以同时发送 binlog 到 slave ,和接收 slave 的反馈。

相关推荐
时差95322 分钟前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
让学习成为一种生活方式24 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
Mephisto.java30 分钟前
【大数据学习 | kafka高级部分】kafka的优化参数整理
大数据·sql·oracle·kafka·json·database
秋意钟1 小时前
MySQL日期类型选择建议
数据库·mysql
山海青风1 小时前
第七篇: BigQuery中的复杂SQL查询
sql·googlecloud
Dxy12393102162 小时前
python下载pdf
数据库·python·pdf
桀桀桀桀桀桀2 小时前
数据库中的用户管理和权限管理
数据库·mysql
lzhlizihang3 小时前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
superman超哥3 小时前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
用户8007165452003 小时前
HTAP数据库国产化改造技术可行性方案分析
数据库