点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!

作者 | 阿飞的博客

来源 | 公众号「阿飞的博客」

本文将回顾MySQL复制概念和MySQL几种复制方案,同时也会澄清一些关于复制问题的误解。

本文翻译自:https://www.percona.com/blog/2017/02/07/overview-of-different-mysql-replication-solutions/

MySQL复制是什么?

复制能够保护信息得到备份,并且备份会不同于原数据,备份会被保存到另一个环境。即主备数据不在同一台服务器。下图是MySQL复制示意图:

MySQL有哪些复制方案?

复制如此重要,那么在MySQL中我们有哪些选择呢?

1. 异步复制

异步复制意味着本地环境操作完成,事务就完成,不会受到slave复制是否完成的影响。

当改变被提交后,master就会把数据修改信息放到binlog中(也可能把实际的statement放到binlog中,这是row-based复制和statement-based复制的不同,后面会讲到)。dump线程读取binlog日志然后将其发送到slave,slave接受并保存到待处理队列中(被称为relay-log),slave会执行每一个在master上的改变:

2. 半同步复制

半同步复制(Semi-synchronous replication)意味着master和slave彼此通讯确保事务的正确转移。当改变发生时,master需要等待slave已经将日志保存到relay-log中并向master回复确认master才能提交事务。半同步复制可以保证事务被正确的复制,但不能保证在slave上一定发生:

需要注意的是,半同步复制的话,master需要等待至少有一个slave服务器确认接收到事务并保存了relay-log(或达到超时)才能继续处理同一个SESSION中的当前事务,至于具体多少个slave确认,可以通过参数rpl_semi_sync_master_wait_slave_count进行配置,这个值有效范围是1~1024之间,而且这个值可以动态更新。举个栗子:

假设rpl_semi_sync_master_wait_slave_count被设置为2,并且有两个slave,分别是:slave1和slave2。

\1. T1等待两个slave的ack;

\2. master收到slave1的ack;

\3. 此时加入一个slave3,并将rpl_semi_sync_master_wait_slave_count改为3;

\4. master收到slave2的ack;

\5. master收到slave3的ack;

\6. master唤醒等待中的事务,并准备提交;

记住半同步复制会影响性能,因为它需要等待来自slave的确认(ack)。但是,它也能减少slave上由于故障导致数据丢失的风险。

3. 组复制

组(Group)复制是MySQL5.7版本新介绍的概念,在5.7.17发布了GA,而且以插件模式提供。

任意一个数据库节点无论什么时候执行一个事务,组复制插件在向客户端响应它已经完成事务前,会尝试得到其他数据库节点的同意。组复制示意图如下:

4. Percona XtraDB Cluster / Galera Cluster

再介绍一个把master数据复制到其他节点的解决方案,就是Percona XtraDB Cluster,简称PXC。这个解决方案把重心放在一致性上,并且通过使用一个认证过程来保证事务避免冲突和执行的正确性。在这个集群方案的数据库环境下,每个节点的数据都是相同的,节点之间会依赖galera提供的广播机制来保证一致性。

以一条SQL为例,某节点接收SQL请求后,在commit之前,由wsrep API 调用galera库进行集群内广播,所有其他节点验证成功后事务在集群所有节点进行提交,反之rollback。PXC保证整个集群所有数据的强一致性,满足CAP理论中的CA,即 Consistency 和 Availability。

Percona XtraDB Cluster 有很多组件:

  • Percona Server for MySQL(MySQL的Percona分支);

  • Percona XtraBackup (主要用于集群的快照备份);

  • wsrep patches / Galera Library;

该解决方案几乎是同步的,可与组复制相媲美。但是,它还具有使用多主复制的能力。Percona XtraDB Cluster这样的组件能很好的提高数据库基础架构可用性:

Row-Based VS. Statement-Based

讨论MySQL复制,就不得不提Row-Based复制和Statement-Based复制。因为它们是两种不同复制方案的实现原理。

对于statement-based复制(被翻译为基于语句复制),执行的SQL本身会被写入binlog中,例如完全相同的INSERT/UPDATE/DELETE语句会被在slave上执行。它的优缺点如下:

  • 审计数据库会更容易,因为实际执行的SQL语句就被记录在binlog中;

  • 主从之间会有更少的数据传输;

  • binlog日志需要的空间更小;

  • 不确定性SQL可能会给slave带来很大的影响;

  • 某些操作(例如insert...select)会有性能劣势;

  • Statement-based复制会由于SQL优化和执行变得更慢;

  • slave上一些复杂SQL执行时,执行计划评估可能变得糟糕;

  • 数据一致性问题会有更大的挑战;

Row-based复制(基于行复制)是从MySQL 5.7.7起默认的选择,它有很多优点,改变的行会被记录在binlog中,因此它不需要上下文信息。它的其他优点如下::
  • 每一个改变都能被复制,所以是最安全的复制方式;

  • 对于包含不是很多行改变的高并发操作,性能有一定的提升;

  • 显著的改善了数据一致性;

当然,也有缺点:

  • 网络流量显著变大,尤其当操作很多行记录的时候,可能打爆网络;

  • 对于影响很多行的操作,Row-based就会很吃力,不擅长;

  • 数据库操作审计变得更加困难,因为binlog中不记录SQL,取而代之的是记录变更的数据;

  • Row-based相比statement-based在一些场景下会更慢;

关于复制的误解

误解1: 复制就是集群

标准的异步复制不是集群,记住不管是标准的异步复制还是半同步复制,都不能保证环境服务于同一数据集。而使用集群(例如Percona XtraDB Cluster)时,这是不同的,任意一个请求打到任意一台服务器上其结果都一样。如果不是,则会从群集中删除受影响的节点。异步复制没有这样的保障,即使某个slave节点与master处于不一致状态时仍然会接受操作请求。

误解2: 复制作为手动故障转移方案

理论上来说,两个环境之间是有可比性的。然而,有许多参数能影响性能和数据一致性。只要你使用了异步复制,在master上发生的事务正确性就无法在slave上得到保障。当然,你可以通过增强持久化的配置来改善这点,但是它相应的会带来一定的性能损耗,性能和可靠之间总需要做一定的取舍。

误解3: 我有复制,所以不用备份

复制是为了对数据集有一个可访问的副本的解决方案,通过把读请求打到复制节点,能减轻master的压力。但是复制不是备份。备份一般是指离线备份,它的作用是数据库所在环境发生灾难性的破坏不可恢复时,还能通过备份恢复数据库。对数据库进行离线备份是非常重要和有意义的事情!

误解4: 因为有复制,所以数据库能负载均衡事务请求

给master增加一个slave尽管可以改善系统的可用性,但是你仍然需要自己做几件事情:把读请求打到slave上,把写请求打到master上。有很多代理工具可以完成这样的事情,当然你可以自己动手造轮子!

本文通过OpenWrite的免费Markdown转换工具发布

-END-

留言交流不过瘾

关注我,回复“加群”加入各种主题讨论群

点一点“阅读原文”小惊喜在等你

盘点几种MySQL复制的解决方案和常见的错误理解相关推荐

  1. mysql回滚与错误提示_对mysql事务提交、回滚的错误理解 – jae – 博客园

    一.起因 begin或者START TRANSACTION开始一个事务 rollback事务回滚 commit 事务确认 人们对事务的解释如下:事务由作为一个单独单元的一个或多个 这句话本身没有什么问 ...

  2. MySQL 那些常见的错误设计规范

    依托于互联网的发达,我们可以随时随地利用一些等车或坐地铁的碎片时间学习以及了解资讯.同时发达的互联网也方便人们能够快速分享自己的知识,与相同爱好和需求的朋友们一起共同讨论. 但是过于方便的分享也让知识 ...

  3. 关于不同的MySQL复制解决方案概述

    我在解决方案团队工作多年,发现数据库复制总是被误解,甚至有些人根本完全不理解,所以本文将来回顾一下MySQL环境中的复制概念,并且澄清一些大家对于复制的误解. 什么是复制? 复制:保证信息被复制并有目 ...

  4. MYSQL复制的几种模式

    MYSQL复制的几种模式 MySQL 5.1 中,在复制方面的改进就是引进了新的复制技术:基于行的复制. MYSQL复制的几种模式 MySQL 5.1 中,在复制方面的改进就是引进了新的复制技术:基于 ...

  5. php mysql 复制数据库表结构图_MySQL_Mysql复制表结构、表数据的方法,本文给大家分享了好几种复制 - phpStudy...

    Mysql复制表结构.表数据的方法 本文给大家分享了好几种复制表结构.表数据的示例介绍,具体详情请看下文吧. 1.复制表结构及数据到新表 CREATE TABLE 新表SELECT * FROM 旧表 ...

  6. mysql复制模式有几种_MYSQL复制的几种模式

    MySQL 5.1 中,在复制方面的改进就是引进了新的复制技术:基于行的复制. MYSQL复制的几种模式 MySQL 5.1 中,在复制方面的改进就是引进了新的复制技术:基于行的复制. 简言之,这种新 ...

  7. Mysql复制表两种方式(复制表结构、复制表结构和数据、复制表中的部分数据、复制表中的部分数据并起别名)

    需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE - SELECT 命令,是无法实现的. 本章节将为大家介绍如何完整的复制MySQL数据表,步骤如 ...

  8. mysql复制表的几种方式

    mysql复制表的几种方式 所描述的方法还请实际测试一下再使用. 1.复制表结构及数据到新表 CREATE TABLE 新表SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都 ...

  9. mysql复制表的两种方式

    mysql复制表的两种方式. 第一.只复制表结构到新表 create table 新表 select * from 旧表 where 1=2 或者 create table 新表 like 旧表 第二 ...

最新文章

  1. 如何在Linux下安装Docker
  2. 皮一皮:工作再忙,也记得陪陪孩子...
  3. Almost Union-Find UVA - 11987(并查集的删除操作)
  4. 某些数组和字符串类型转换(转)
  5. 网络编程项目——在线电子词典
  6. win10无线投屏_win10无线投屏智能电视
  7. 微pe工具箱 系统安装教程_微PE工具箱 V2.0正式版(附安装系统教程)
  8. java开发文档怎么写?教你写java技术文档
  9. 0.3-87 GHz频段手持频谱分析仪 —— SAF Spectrum Compact
  10. python + 数学公式 + 图像 表白 LOVE YOU❤
  11. 关于tv app的一些想法
  12. ASCII码和汉字码
  13. 深度相机 物体三维重建_基于深度相机的实时物体三维重建方法与流程
  14. 什么牌子的护眼灯最好?分享四款护眼灯合格的品牌
  15. MATLAB08:符号运算
  16. 图像特征提取中的平移不变性、旋转不变性、尺度不变性
  17. android smallestWidth 限定符屏幕适配方案dimens.xml
  18. java日期格式化yyyy-mm-dd
  19. 第六章 Wi-Fi扫描流程
  20. python用户登录a_python实现用户登录

热门文章

  1. linux awk 用一个或多个空格做分隔符
  2. linux 内核 虚拟文件系统VFS 路径查找 path_lookup
  3. 证书格式pfx和cer的区别及转换
  4. libssh2 和 libssh 比较
  5. php 操作数组 (合并,拆分,追加,查找,删除等)
  6. 用symbol来获得ShadowSSDT的原始地址和函数名
  7. 代码注入之远程线程篇
  8. 编程之美3.2 电话号码对应英语字母
  9. Linux2.6内核--对块IO层操作的讨论
  10. golang中base64编码_MySQL中如何将字符串转为base64编码?