MySQL5.7新特性:lossless replication 无损复制

MySQL的三种复制方式

  1. asynchronous 异步复制
  2. fully synchronous 全同步复制
  3. Semisynchronous 半同步复制

asynchronous replication

原理:在异步复制中,master写数据到binlog且sync,slave request binlog后写入relay-log并flush disk
优点:复制的性能最好
缺点:master挂掉后,slave可能会丢失事务
代表:MySQL原生的复制

fully synchronous replication

原理:在全同步复制中,master写数据到binlog且sync,所有slave request binlog后写入relay-log并flush disk,并且回放完日志且commit
优点:数据不会丢失
缺点:会阻塞master session,性能太差,非常依赖网络
代表:MySQL-Cluster

semisynchronous replication

  • 普通的半同步复制

原理: 在半同步复制中,master写数据到binlog且sync,且commit,然后一直等待ACK。当至少一个slave request bilog后写入到relay-log并flush disk,就返回ack(不需要回放完日志)
优点:会有数据丢失风险(低)
缺点:会阻塞master session,性能差,非常依赖网络,
代表:after commit, 原生的半同步
重点:由于master是在三段提交的最后commit阶段完成后才等待,所以master的其他session是可以看到这个提交事务的,所以这时候master上的数据和slave不一致,master crash后,slave数据丢失

  • 增强版的半同步复制(lossless replication)

原理: 在半同步复制中,master写数据到binlog且sync,然后一直等待ACK. 当至少一个slave request bilog后写入到relay-log并flush disk,就返回ack(不需要回放完日志)
优点:数据零丢失(前提是让其一直是lossless replication),性能好
缺点:会阻塞master session,非常依赖网络
代表:after sync, 原生的半同步
重点:由于master是在三段提交的第二阶段sync binlog完成后才等待, 所以master的其他session是看不见这个提交事务的,所以这时候master上的数据和slave一致,master crash后,slave没有丢失数据

重要参数

参数 comment 默认值 推荐值 是否动态
rpl_semi_sync_master_wait_for_slave_count 至少有N个slave接收到日志 1 1 dynamic
rpl_semi_sync_master_wait_point 等待的point AFTER_SYNC AFTER_SYNC dynamic
rpl_semi_sync_master_timeout 切换复制的timeout 10000(10s) 1000(1s) dynamic
rpl_semi_sync_master_enabled 是否开启半同步 OFF ON dynamic
rpl_semi_sync_slave_enabled 是否开启半同步 OFF ON dynamic

如何开启lossless replication


1

2

3

4

5

6


########semi sync replication settings########

plugin_dir=/usr/local/mysql/lib/plugin

plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

loose_rpl_semi_sync_master_enabled = 1

loose_rpl_semi_sync_slave_enabled = 1

loose_rpl_semi_sync_master_timeout = 1000

实践是检验真理的唯一标准

如何检验上述after_sync,after_commit
如何检验上述原理的正确性

InnoDB commit : 三阶段提交过程


1

2

3


A阶段. wite prepare log -- 写入Xid

B阶段. write binlog

C阶段. write commit log

测试点

master上当一个事务Waiting for semi-sync ACK from slave的时候,后来的事务是在A,B,C哪个阶段卡住呢?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33


0,RC模式

1. semi-sync C阶段等待

假设设置time-out=100000s,当事务一提交了一个大事务,在write commit log(C阶段)时候等待,

那么第二个事务在敲commit命令的时候,是卡在哪个阶段呢?是卡在 wite prepare log(A阶段)?还是write binlog(B阶段)?还是write commit log(C阶段)

测试:semi-sync vs loss-less semi-sync

【semi-sync】 C阶段等待

0, 开启事务1,然后在slave上执行stop slave,制造timeout的情况,让其阻塞。(Waiting for semi-sync ACK from slave)

1,在开启一个事务2,事务2插入一条特殊记录(XXXXX)。 (Waiting for semi-sync ACK from slave)

2,在开启一个事务3。

2.1,测试案例:这个时候,kill -9 mysqld,造成人为的mysql crash

3,假设卡在A阶段,那么事务3,肯定是看不到事务1,2写入的记录(XXXXX),且重启mysql后,事务2不会提交。

4,假设卡在C阶段,那么事务3,肯定是可以看见事务1,2写入的记录(XXXXX)。

经过测试:

1,是卡在C阶段,也就是说事务3是可以看见事务1,事务2的。

2,MySQL crash重启后,事务1,事务2的dml都已经提交成功,说明不是卡在A阶段

【loss-less semi-sync】B阶段等待

0, 开启事务1,然后在slave上执行stop slave,制造timeout的情况,让其阻塞。(Waiting for semi-sync ACK from slave)

1,在开启一个事务2,事务2插入一条特殊记录(XXXXX)。(Waiting for semi-sync ACK from slave)

2,在开启一个事务3

3,假设卡在A阶段,那么事务3,肯定是看不到事务1,2写入的记录(XXXXX),且重启mysql后,事务2不会提交。。

4,假设卡在B阶段,那么事务3,肯定是可以看见事务1,2写入的记录(XXXXX),且重启mysql后,事务1,2都会提交。。

5, 假设卡在C阶段,那么事务3,肯定是可以看见事务3写入的记录(XXXXX)。

经过测试:

1,是卡在B阶段,也就是说事务3,既看不见事务1的提交内容,也看不见事务2的提交内容,且重启mysql后,事务1,2都已经提交。。

2,MySQL crash重启后,事务1,事务2的dml都已经提交成功,说明不是卡在A阶段。

性能

semi-sync vs lossless semi-sync 的性能对比

根据以上的测试,可以得知,lossless只卡在B阶段,普通的semi-sync是卡在C阶段。
lossless的性能远远好于普通的semi-sync,即(after_sync 优于 after_commit)
因为lossless 卡在B阶段的时候可以堆积事务,可以在C阶段进行group commit。
普通的semi-sync,卡在C阶段,事务都已经commit了,并没有堆积的过程。

CAP理论

一致性【C】
可用性【A】
分区容忍性【P】
理论:CAP 三者不可兼得,必须要牺牲一个

分区,是一定存在的,不是你想不要就不要的。所以,这里只剩下两种组合

  • CP 牺牲可用性

这种做法,就是保留强一致性,牺牲可用性
案例:可以将rpl_semi_sync_master_timeout设置成一个无限大的值,比如:100天,那么master和slave就强一致了,但是可用性就大打折扣

  • AP 牺牲一致性

这种做法,就是保留高可用性,牺牲一致性
案例:比如原生的异步复制就是这样咯。可以快速做到切换,但是一致性就没有保障

时间: 2024-10-25 00:56:39

MySQL5.7新特性:lossless replication 无损复制的相关文章

MySQL5.7新特性——gtid基础

1.MySQL5.7 新特性:gtid复制 ①:GTID是什么 是事务的ID,唯一识别号,全局唯一. 随事务记录到Binary Log中,用来标识事务. 每个事务有一个Gtid_log_event. ②:GTID的构成 UUID + Sequence Number 注意:Sequence Number是MySQL服务器内部的一个事务顺序号.一个MySQL服务器上的事务不会有重复的顺序号(保证服务器内唯一). 每个MySQL服务器有一个全局唯一的UUID. ③:GTID的目的 简化复制的使用过程和

[MySQL5.6 新特性] 全局事务标示符(GTID)

GTID的全称为 global transaction identifier  , 可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建.GTID需要在全局的主-备拓扑结构中保持唯一性,GTID由两部分组成: GTID = source_id:transaction_id source_id用于标示源服务器,用server_uuid来表示,这个值在第一次启动时生成,并写入到配置文件data/auto.cnf中 transaction_id则是根据在源服务器上第几个提交的事务来

MySQL5.6 新特性之GTID【转】

转自 MySQL5.6 新特性之GTID - jyzhou - 博客园http://www.cnblogs.com/zhoujinyi/p/4717951.html 背景: MySQL5.6在5.5的基础上增加了一些改进,本文章先对其中一个一个比较大的改进"GTID"进行说明. 概念: GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的

mysql5.7新特性探究

一.MySql5.7增加的特性 1.MySql服务方面新特性 1) 初始化方式改变 MySql5.7之前版本初始化方式: scripts/mysql_install_db MySql5.7版本初始化方式: [[email protected] mysql_new]# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql_new/ --datadir=/usr/local/mysql_new/data/ 2015-10-

MySQL5.6 新特性之GTID

MySQL5.6在5.5的基础上增加了一些改进,本文章先对其中一个一个比较大的改进"GTID"进行说明. 概念: GTID 即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增.下面是一个GTID的具体形式: 4e659069-3cd8-11e5-9a49-001c4270714e:1-77 更具体的说明见 官方

mysql-5.6新特性

1. undo log undo log分离到独立的表空间,并放到单独的文件目录下:这给我们部署不同IO类型的文件位置带来便利,对于并发写入型负载,我们可以把undo文件部署到单独的高速存储设备上. 1.1. 设置 vim /etc/my.cnf [mysqld] innodb_undo_directory=/data/undolog innodb_undo_log=128 innodb_undo_tablespaces=16 1.2. 说明 innodb_undo_directory 用来指定

MySQL5.7新特性——在线收缩undo表空间

1. MySQL 5.5时代的undo log 在MySQL5.5以及之前,大家会发现随着数据库上线时间越来越长,ibdata1文件(即InnoDB的共享表空间,或者系统表空间)会越来越大,这会造成2个比较明显的问题: (1)磁盘剩余空间越来越小,到后期往往要加磁盘: (2)物理备份时间越来越长,备份文件也越来越大. 这是怎么回事呢? 原因除了数据量自然增长之外,在MySQL5.5以及之前,InnoDB的undo log也是存放在ibdata1里面的.一旦出现大事务,这个大事务所使用的undo

mysql5.7新特性

mysql5.7版本出来后还是有大量的修改以及一些调优,修复一些bug,删掉了一些旧的参数,在这里就简单的整理一下 因为平时都是使用二进制包安装mysql,所以这里就以mysql的二进制包部署开始.首先,mysql的安装初始化抛弃了旧版的mysql_install_db而使用mysqld --initialize初始化,在完成初始化后mysql的root密码并不是空密码,而是在初始化后会给出一个随机密码,要正常使用时需要在改掉密码后才可以使用,在mysql其他的安装部分都和以前的版本都是一样的

mysql5.7新特性JSON数据类型解析

废话不多说,直接上实例. 一.json结构 创建测试表 CREATE TABLE `article` (   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,   `category` json NOT NULL,   `tags` json NOT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 分析:article表中的字段catego