mysql cp ap_MySQL5.7新特性:lossless replication 无损复制

MySQL的三种复制方式

asynchronous 异步复制

fully synchronous 全同步复制

Semisynchronous 半同步复制

asynchronous replication

原理:在异步复制中,master写数据到binlog且sync,slave request binlog后写入relay-log并flush disk

优点:复制的性能最好

缺点:master挂掉后,slave可能会丢失事务

代表:MySQL原生的复制

c637019a90beb9817ba9bc586b0135fc.png

fully synchronous replication

原理:在全同步复制中,master写数据到binlog且sync,所有slave request binlog后写入relay-log并flush disk,并且回放完日志且commit

优点:数据不会丢失

缺点:会阻塞master session,性能太差,非常依赖网络

代表:MySQL-Cluster

ca0c12b4916ca5154e8edd4bc1dbebba.png

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数据丢失

c0a2ce27d54be91b972d43cd4a3eb74c.png

增强版的半同步复制(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没有丢失数据

c48e3c8a5e72072b34117a5ce8528452.png

重要参数

参数

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 牺牲一致性

这种做法,就是保留高可用性,牺牲一致性

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

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

GTID的全称为 global transaction identifier  , 可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建.GTID需要在全局的主-备拓扑结构中保持唯 ...

MySQL5.6 新特性之GTID【转】

转自 MySQL5.6 新特性之GTID - jyzhou - 博客园http://www.cnblogs.com/zhoujinyi/p/4717951.html 背景: MySQL5.6在5.5的 ...

mysql5.7新特性探究

一.MySql5.7增加的特性 1.MySql服务方面新特性 1) 初始化方式改变 MySql5.7之前版本初始化方式: scripts/mysql_install_db MySql5.7版本初始化方 ...

MySQL5.7新特性

MySQL5.7介绍 身处 MySQL 这个圈子,能够切身地感受到大家对 MySQL 5.7 的期待和热情,似乎每个人都迫不及待的想要了解.学习和使用 MySQL 5.7.那么,我们不禁要问, MyS ...

MySQL5.6新特性Index conditontion pushdow

index condition pushdown是MySQL5.6的新特性,主要是对MySQL索引使用的优化. Index condition push简称ICP,索引条件下推,将索引条件从serve ...

初试mysql5.7.2新特性:多源复制(MySQL 5.7 multi-source replication)

多源复制和多主复制的区别: 多主复制示意图: 多源复制示意图: 在my.cnf中添加crash safe特性参数:master_info_repository=TABLE;relay_log_info ...

MySQL5.6新特性之GTID、多线程复制 - 不知为何

http://www.tuicool.com/articles/yi2aui http://www.cnblogs.com/cenalulu/category/380263.html

MySQL5.6 新特性之GTID

背景: MySQL5.6在5.5的基础上增加了一些改进,本文章先对其中一个一个比较大的改进"GTID"进行说明. 概念: GTID即全局事务ID(global transactio ...

mysql5.6新特性总结

一. server参数默认值设置的变化http://dev.mysql.com/doc/refman/5.6/en/server-default-changes.html 二. innodb增强1.全 ...

随机推荐

创建javaScript对象的方法

一.工厂模式 function person (name,age) { var p=new Object(); p.name=name; p.age=age; p.showMessage=functi ...

java类加载器深入研究

看了下面几篇关于类的加载器的文章,豁然开朗.猛击下面的地址开始看吧. Java类加载原理解析      深入探讨 Java 类加载器 分析BootstrapClassLoader/ExtClassLo ...

windows调试器尝鲜

曾几何时,我也下载过看雪论坛精华看的津津有味.可惜一直没有动手去调试,学到的x86汇编指令也忘得差不多了.最近将老机器的T4200 CPU换成了更省电,温度更低的P8800,为了支援新的VT虚拟化,特 ...

[Swift]LeetCode96. 不同的二叉搜索树 | Unique Binary Search Trees

Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? Example ...

10.Django ModelForm

ModelForm 1.ModeForm简单验证 from django.db import models # Create your models here. class UserInfo(mode ...

POJ 1201 Intervals (经典) (差分约束)

题目大意:给你$n$段区间,$a_i,b_i,c_i$ 表示在 $[a_i,b_i]$ 区间内至少要选择$c_i$个点.现在问你在满足这n个条件的情况下,最少要选多少个点? ...

Vue-admin工作整理(十): Vuex-Actions(模拟接口请求实现组件字段更新)

思路:通过提交一个 mutation,而不是直接变更状态,它可以包括异步操作,通过请求接口,定义一个方法,第一个参数为对象,在里面能够提取到一些东西,比如:commit,这是一个方法,调用这个comm ...

python之restful api(flask)获取数据

需要用到谷歌浏览器的扩展程序 Advanced Rest Client进行模拟请求 1.直接上代码 from flask import Flask from flask import request ...

服务器 'xxxx' 已被定义为分发服务器。若要将该服务器重新配置为分发服务器,必须首先卸载现有的分发服务

使用AWS DMS(Database Migration Service)将SQL Server数据库同步到AWS的Data Lake上,需要在本地源数据库上配置复制,在配置分发向导最后一步时,遇到下 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值