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 的反馈。

相关推荐
shiming887930 分钟前
C/C++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
前端白袍31 分钟前
C语言:C语言实现对MySQL数据库表增删改查功能
c语言·数据库·mysql
Elastic 中国社区官方博客35 分钟前
Elasticsearch:Retrievers 介绍
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
蓝桉柒71 小时前
安装数据库客户端工具
数据库
南城花随雪。1 小时前
Redis(非关系型数据库)详细介绍
数据库·redis·nosql
冰红茶兑滴水1 小时前
MySQL 内置函数
数据库·mysql
鸿·蒙1 小时前
【PTA】【数据库】【SQL命令】编程题2
数据库·sql·pta
J.P.August2 小时前
Oracle RAC 环境下数据文件误建在本地目录的处理过程
数据库·oracle
对酒当歌丶人生几何2 小时前
Mybatis控制台打印SQL执行信息(执行方法、执行SQL、执行时间)
java·数据库·sql·mybatis
LightOfNight3 小时前
Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)
服务器·数据库·redis·分布式·后端·缓存·中间件