半同步复制

异步复制:

mysql默认的复制就是异步的,主库在执行完客户端提交的事物后会立即返回结果给客户端,并不判断从库是否已经接受并处理,这样就会有一个问题,如果这个时候主库crash,主库上已经提交的事物可能还没有传到从库上,如果此时,强行将从提升为主,可能导致新主上的数据丢失。


全同步复制:

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


半同步复制:

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

分为两种半同步:

(1)官方半同步

即参数 rpl_semi_sync_master_wait_point = after_commit时

原理:

客户端发送过来一个请求,经过mysql的SQL分析,存储引擎处理,写入binlog,然后再存储引擎层提交,写入从库的relaylog,最后返回给客户端。

缺点:

(1)在storage commit提交之后,其他会话都可以读到更新的数据,但是本客户端还没有,需要等待从库接收完日志才能返回结果。

(2)当在storage commit之后,此时如果主crash了,从库还没有接收到relaylog,这个时候要进行主从切换,会导致新主数据比原来主数据少,即丢失部分数据。

(2)增强半同步(又称社区半同步,无损lossless半同步等)

即参数 rpl_semi_sync_master_wait_point = after_sync

原理:

客户端发送过来一个请求,经过mysql的SQL分析,存储引擎处理,写入binlog,然后写入从库的relaylog,存储引擎层提交,最后返回给客户端。

优点:

主库把更新先发送给从库的relaylog,然后再提交,返回结果给客户端,这个过程即使在storage commit之后主crash了,日志也已经写入到relaylog中,从库和主库数据一致。


要想使用半同步复制,必须满足以下几个条件:

1. MySQL 5.5及以上版本

2. 变量have_dynamic_loading为YES

3. 异步复制已经存在

4.不支持多源复制


1.基本环境

master slave
数据库版本 5.7.16 5.7.16
IP 192.168.91.16 192.168.91.22
serverid 330616 330622
端口号 3306 3306


2.主从配置

master:

配置文件中设置:

server-id = 330616

binlog_format = row

log-bin = /data/mysql3306/logs/mysql-bin

skip_slave_start=1

log-slave-updates=0

gtid_mode=ON

enforce-gtid-consistency=ON

slave:

配置文件中设置:

server-id = 330622

binlog_format = row

relay-log=relay-bin

relay-log-index=relay-bin.index

skip_slave_start=1

log_slave_updates=0

gtid_mode=on

enforce-gtid-consistency=on


3.主库创建用户

master1:

create user [email protected]‘192.168.91.%‘ identified by ‘147258‘;

grant replication slave on *.* to [email protected]‘192.168.91.%‘;


4.从库 change master to

slave:

change master to

master_host=‘192.168.91.16‘,

master_port=3306,

master_user=‘rep‘,

master_password=‘147258‘,

master_auto_position=1;


5.安装插件

master:

install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;

show plugins;

也可以通过下载配置文件中重启服务加载插件:

plugin-load=rpl_semi_sync_master=semisync_master.so

slave:

install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;

show plugins;

也可以通过下载配置文件中重启服务加载插件:

plugin-load=rpl_semi_sync_slave=semisync_slave.so


6.编辑配置文件

master

#semi

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000 #1 second

动态生效:

set global rpl_semi_sync_master_enabled=1;

set global rpl_semi_sync_master_timeout=1000;

slave

#semi

rpl_semi_sync_slave_enabled=1

动态生效:

set global rpl_semi_sync_slave_enabled=1;


在有的高可用架构下,如果需要主从切换继续使用半同步,主从都需要加载插件并添加配置文件:

#plugins

plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

#semi

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000 #1 second

rpl_semi_sync_slave_enabled=1


7.参数和状态

variables:

rpl_semi_sync_master_enabled = ON

表示在master上已经开启半同步复制模式

rpl_semi_sync_master_timeout = 10000

默认为10000毫秒,等于10秒,这个参数动态可调,表示主库在某次事务中,如果等待时间超过10秒,那么则降级为异步复制模式,不再等待SLAVE从库。如果主库再次探测到,SLAVE从库恢复了,则会自动再次回到半同步复制模式。

rpl_semi_sync_master_trace_level = 32

用于开启半同步复制模式时的调试级别,默认是32

rpl_semi_sync_master_wait_for_slave_count=1;

该参数控制主需要等待多少个slave应答,才能返回给客户端,默认为1。

rpl_semi_sync_master_wait_point = AFTER_SYNC

半同步的方式


status:

Rpl_semi_sync_master_clients

当前半同步复制从的个数,如果是一主多从的架构,并不包含异步复制从的个数。

Rpl_semi_sync_master_yes_tx

表示成功使用半同步的事物

Rpl_semi_sync_master_no_tx

表示没有使用半同步的事物为

例:master:怎么查看是否开启半同步:[email protected] [testdb]> show global variables like ‘%semi%‘;+-------------------------------------------+------------+| Variable_name                             | Value      |+-------------------------------------------+------------+| rpl_semi_sync_master_enabled              | ON         |   --表示主库上面的半同步已经开启| rpl_semi_sync_master_timeout              | 1000       || rpl_semi_sync_master_trace_level          | 32         || rpl_semi_sync_master_wait_for_slave_count | 1          || rpl_semi_sync_master_wait_no_slave        | ON         || rpl_semi_sync_master_wait_point           | AFTER_SYNC || rpl_semi_sync_slave_enabled               | ON         || rpl_semi_sync_slave_trace_level           | 32         |+-------------------------------------------+------------+测试插入一条数据:[email protected] [testdb]>insert into t1 values(4,‘ddd‘);[email protected] [testdb]>show global status like ‘%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             | 1     || Rpl_semi_sync_master_no_times              | 0     || Rpl_semi_sync_master_no_tx                 | 0     |     --表示没有使用半同步的事物| Rpl_semi_sync_master_status                | ON    |     --表示半同步正在运行| Rpl_semi_sync_master_timefunc_failures     | 0     || Rpl_semi_sync_master_tx_avg_wait_time      | 2920  || Rpl_semi_sync_master_tx_wait_time          | 2920  || Rpl_semi_sync_master_tx_waits              | 1     || Rpl_semi_sync_master_wait_pos_backtraverse | 0     || Rpl_semi_sync_master_wait_sessions         | 0     || Rpl_semi_sync_master_yes_tx                | 1     |     --表示成功使用半同步的事物| Rpl_semi_sync_slave_status                 | OFF   |+--------------------------------------------+-------+slave:[email protected] [(none)]>stop slave;[email protected] [testdb]>show status like ‘%semi%‘;         +----------------------------+-------+| Variable_name              | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | OFF   |+----------------------------+-------+master:[email protected] [testdb]>insert into t1 values(5,‘eee‘);Query OK, 1 row affected (1.01 sec)                      --这里插入第一条数据用了1.01秒,是由rpl_semi_sync_master_timeout=1000ms控制,因为1秒后超时不使用半同步,变成普通复制。[email protected] [testdb]>insert into t1 values(6,‘fff‘);Query OK, 1 row affected (0.00 sec)                      --后面的操作默认不使用半同步,所以用时比较快。[email protected] [testdb]>show global status like ‘%semi%‘;+--------------------------------------------+-------+| Variable_name                              | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients               | 0     || Rpl_semi_sync_master_net_avg_wait_time     | 0     || Rpl_semi_sync_master_net_wait_time         | 0     || Rpl_semi_sync_master_net_waits             | 1     || Rpl_semi_sync_master_no_times              | 1     || Rpl_semi_sync_master_no_tx                 | 2     |     ----表示没有使用半同步的事物为2个,如果这个值比较大,那么从库可能有问题,需要优化。| Rpl_semi_sync_master_status                | OFF   || Rpl_semi_sync_master_timefunc_failures     | 0     || Rpl_semi_sync_master_tx_avg_wait_time      | 2920  || Rpl_semi_sync_master_tx_wait_time          | 2920  || Rpl_semi_sync_master_tx_waits              | 1     || Rpl_semi_sync_master_wait_pos_backtraverse | 0     || Rpl_semi_sync_master_wait_sessions         | 0     || Rpl_semi_sync_master_yes_tx                | 1     || Rpl_semi_sync_slave_status                 | OFF   |+--------------------------------------------+-------+rpl_semi_sync_master_wait_for_slave_count=N;该参数控制主需要等待多少个slave应答,才能返回给客户端,默认为1。例:[email protected] [testdb]>set global rpl_semi_sync_master_wait_for_slave_count=2;[email protected] [testdb]>show variables like ‘%semi%‘;+-------------------------------------------+------------+| Variable_name                             | Value      |+-------------------------------------------+------------+| rpl_semi_sync_master_enabled              | ON         || rpl_semi_sync_master_timeout              | 1000       || rpl_semi_sync_master_trace_level          | 32         || rpl_semi_sync_master_wait_for_slave_count | 2          || rpl_semi_sync_master_wait_no_slave        | ON         || rpl_semi_sync_master_wait_point           | AFTER_SYNC |+-------------------------------------------+------------+[email protected] [testdb]>insert into t2 values(6,‘fff‘);Query OK, 1 row affected (1.03 sec)  --超时之后采用异步复制模式

总结

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

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

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

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

时间: 2024-10-25 06:50:00

半同步复制的相关文章

MySQL 主从复制、主主复制、半同步复制

MySQL 复制 =============================================================================== 概述: =============================================================================== MySQL Replication:   1.主从复制的目的和架构 ★Master/Slave(主/从) Master: write/read Slave

msyql 的半同步复制

mysql的半同步复制: mysql的异步复制:mysql默认使用异步方式进行同步,master在执行客户端提交的事务后会将结果返回给客户端,表示客户端的操作已经生效,同时会将该操作的binlog通过dumper通知slave来取,再正常情况下,slave会将该binlog写入本地,并通过sql语句写入从库中与主库同步数据,master对从库是否写入不负任何责任. 主和从的复制过程是由三个线程参与完成的,其中有两个线程(sql语句和I/O线程在slave端),一个I/O线程在master端. m

简述mysql半同步复制—semisync

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

mysql的主从、主主及半同步复制

mysql复制 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接

mysql5.5半同步复制

一.实验目的: mysql在主从复制还支持半同步复制,mysql复制是异步的,因为同步性能非常差.主库分发事件以后必须等待从库复制数据结束并收到从库正常响应以后,才能进行下一步操作.异步模式导致从库落后主库时,主库无从得知.因此mysql5.5后引入google补丁半同步复制,2个插件:semisync_master.so与semisync_slave.so.半同步:一主多从架构中,主库只等待一台从库复制完成数据并返回正常响应,就认为同步完成进行下一步操作,这样即有异步的高速,又有同步的安全.一

MariaDB主从半同步复制详解

半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端.相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间.所以,半同步复制最好在低延时的网络中使用. 潜在的问题 客户端事务在存储引擎层提交后,在得到从库确认的过程中,主库宕机了,此时,可能的情况有两种: 1.事务还没发

mysql半同步复制及复制过滤

配置mysql半同步,前提是已经有master和slave环境. MySQL半同步配置 Master配置 安装semisync_master插件 mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (0.02 sec) mysql>show plugins; +----------------------------+----------+------

MySQL学习笔记12半同步复制

1.1.1. 相关概念 默认情况下,MySQL使用异步复制,即master上的事务执行与slave上的复制操作不需要同步,master不需要等待slave上的复制线程将Binary Log接收完毕即可执行其它事务. 半同步复制时,master上的事务执行与slave上的复制操作需要在某个步骤上进行同步,master需要等待slave上的复制线程接收完毕Binary Log. 异步复制的工作效率比较高,但是在特定条件下,有可能造成master和slave的数据不一致.半同步复制可以降低数据不一致的

Mysql5.7基于GTID的半同步复制

一.GTID是什么 GTID是事务的ID,唯一识别号,全局唯一.随事务记录到Binary Log中,用来标识事务.每个事务有一个Gtid_log_event.GTID的构成:UUID + Sequence Number Sequence Number是MySQL服务器内部的一个事务顺序号.一个MySQL服务器上的事务不会有重复的顺序号(保证服务器内唯一).每个MySQL服务器有一个全局唯一的UUID. GTID的目的简化复制的使用过程和降低复制集群维护的难度,不再依赖Master的binlog文

MySQL数据的主从复制、半同步复制和主主复制详解

一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制.单向.异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环