MySQL复制相关技术的简单总结

MySQL有很多种复制,至少从概念上来看,传统的主从复制,半同步复制,GTID复制,多线程复制,以及组复制(MGR)。
咋一看起来很多,各种各样的复制,其实从原理上看,各种复制的原理并无太大的异同,新的复制方式的出现,是原复制某一方面增强或者是优化的结果,就不难理解为什么有这么多中复制。
每一种复制的出现都是有其原因的,也是解决(或者说是弥补)前一种的复制方案的潜在的问题的。
其实搞出来这么多概念,个人觉得是源于开源的原因吧,不同复制版本的出现,因为是一个不断发现问题就解决问题的过程。
如果是闭源的数据库,你只管打补丁就行了,应该不会出现这么多概念。

本文仅从原理上粗略总结各种复制技术的特点以及解决的问题,不涉及太多的细节问题。
MySQL复制的原理图(图片来源于深入浅出MySQL)

大致的流程如下:

1,搭建完主从之后,slave连接至master,slave的io_thread等待主库的binlog信息
2,master上执行各种DDL或者DML命令,执行完成执行生成binlog
3,master上的binlog_dump线程将生成的binlog传送给slave的slave的io_thread
4,slave的io_thread接受到master上的binlog之后将binlog写入本地的中继日志文件
5,slave本地的sql_thread应用中继日志到本地数据库中

传统的主从复制

对于传统的主从复制,Slave连接至master的典型操作如下,就是手工指定slave要从master的哪个文件的哪个点开始执行其二进制日志。

CHANGE MASTER TO
MASTER_HOST=‘***.***.***.***‘,
MASTER_USER=‘username‘,
MASTER_PASSWORD=‘pwd‘,
MASTER_PORT = 3306,
MASTER_LOG_FILE=‘mysql-bin.000047‘,
MASTER_LOG_POS=3112;

潜在的问题:

1,数据异步复制,master提交事物并不需要与slave确认,binlog以异步的方式传送到slave,很明显,潜在的问题就是如果master宕机,可能存在没有传递到slave的binlog,造成事物的丢失。
2,需要手工确认logfile以及logfile的偏移量

半同步复制

  半同步复制最大的特点就是改进了传统的主从复制潜在的主从不一致的问题,
  半同步复制要求master提交事务之后,只要等到一台slave接收到binlog并且成功写入到中继日志中才算返回给客户端成功提交的消息。
  这样就确保了master上所有的事物,都可以传递至至少一个slave,master宕机的情况下并不会丢失事物,解决了传统复制潜在的问题1 ,但是问题2依旧。
  潜在的问题:
  1,依旧需要手工确认logfile以及logfile的偏移量

GTID复制

  GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成。
  这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系 的mysql服务器上也是唯一的。
  正是因为这样一个特性使得mysql的主从复制变得更加简单,以及数据库一致性更可靠。

change master to
master_user=‘username‘,
master_password=‘pwd‘
for channel ‘group_replication_recovery‘;

  相对于传统的主从复制,或者是提高了安全性的半同步复制,在搭建主从,或者是改变主从的时候,
  操作方式都是需要手动指定binlog的文件以及文件的偏移量,说白了就是人为地去判断slave应该从从master的哪个binlog中的哪个位置开始重放二进制日志中的内容。
  这样势必会增加手动操作以及人为判断错误的可能性,不是太方便做主从或者故障转移操作。

相对传统的复制,GTID的优势:
1、更简单的搭建主从复制,以及实现故障转移,不用以前那样在需要手工指定log_file和log_pos。
2,正常情况下,GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过,跳过错误的事物更加方便。

多线程复制

  半同步复制解决了传统复制潜在的slave丢失master事物的问题,GTID复制简化复制的实现,解决了传统复制过于复杂的的问题,算是原始复制的两个补丁。
  从安全性和复杂程度两个纬度改进了传统复制,但是传统复制依然潜在一个致命的问题,就是主从复制的延迟。
  slave上的sql_thread应用中继日志到本地数据库中,是一个单线程的操作,这样面对大量的binlog,就可能存在效率上的问题,
  多线程复制就是通过并行解析中继日志的方式,提要slave上sql_thread的执行效率,从而改善主从复制延迟的问题(当然也需要master的binlog做一定的优化)

  

MGR(MySQL Group Replication)

  MGR,MySQL的组复制,不仅仅是复制的问题,可以认为是结合了传统的复制,半同步复制(机制不一样,多数节点同步提交),GTID复制等一系列特性的一种高可用解决方案,并且具备故障探测功能,自动检测并剔除发生了故障的节点
  因此说是一种高可用以及高扩展的解决方案,而不仅仅是完成复制的功能。

  对于MGR的一些特性,一下引用自https://blog.csdn.net/jssg_tzw/article/details/69791330

  高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
  高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
  高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
  高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。

  对于MGR,笔者仅简单做过测试,搭建起来一如跟普通的复制并无太大差异,并不复杂,网络上的评价也很高,大有一统各种第三方高可用技术的趋势。
  缺点是出来的时间太短(MGR是是MySQL官方于2016年12月推出的,对于互联网来说,个人感觉超过已经不短了),可能存在这某些位置的问题。

总结

  MySQL的复制,任何一种新方案的出现,其原理差异不大,都是为了解决前一种方案潜在的问题的,是作为前一种复制的提升或者说增强,开源没有完美的解决方案,但是有不断完善的解决方案,这不是开源的魅力之一吗?
  不同的复制其技术细节上可能有差异,但是本质性的东西是一样的。
  当然每一种复制都有其自身的细节上的特性,只能在实际应用中实践了。
  这也不由得令人想到各种数据中的各种隔离级别(isolation),虽然不能完全做类比,与复制一样,每一种增强的隔离级别的,都是为解决前一种隔离级别中存在的问题而出现的。

原文地址:https://www.cnblogs.com/wy123/p/9073864.html

时间: 2024-11-13 10:06:31

MySQL复制相关技术的简单总结的相关文章

MySQL复制常用拓扑结构详解

复制的体系结构有以下一些基本原则: (1)    每个slave只能有一个master: (2)    每个slave只能有一个唯一的服务器ID: (3)    每个master可以有很多slave: (4)    如果你设置log_slave_updates,slave可以是其它slave的master,从而扩散master的更新. MySQL不支持多主服务器复制(Multimaster Replication)--即一个slave可以有多个master.但是,通过一些简单的组合,我们却可以建

涂抹mysql笔记-mysql复制特性

<>mysql复制特性:既可以实现整个服务(all databases)级别的复制,也可以只复制某个数据库或某个数据库中的某个指定的表对象.即可以实现A复制到B(主从单向复制),B再复制到C.也可以实现A直接复制到B和C(单主多从复制),甚至A的数据复制给B,B的数据也复制会A(双主复制) <>mysql复制处理数据时,有三种不同的模式: 1.基于语句复制(Statement Based Replication):基于实际执行的sql语句的模式方案简称SBR 2.基于记录复制(Ro

MYSQL 复制详解

MySql 复制介绍 MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库 ,也可以是一个数据库里的指定的表 MySQL复制所带来的优势在于: 扩展能力:通过复制功能可以将MySQL的性能压力分担到一个或多个slave上.这要求所有 的写操作和修改操作都必须在Master上完成,而读操作可以被分配到一个或多个s

MySQL 复制 - 性能与扩展性的基石 2:部署及其配置

原文:MySQL 复制 - 性能与扩展性的基石 2:部署及其配置 正所谓理论造航母,现实小帆船.单有理论,不动手实践,学到的知识犹如空中楼阁.接下来,我们一起来看下如何一步步进行 MySQL Replication 的配置. 为 MySQL 服务器配置复制非常简单.但由于场景不同,基本的步骤还是有所差异.最基本的场景是新安装主库和备库,总得来说分为以下几步: 在每台服务器上创建复制账号. 配置主库和备库. 通知备库连接到主库并从主库复制数据. 此外,由于主备部署需要多台服务器,但是这种要求对大多

双主模型、SSL、percona-toolkit、MySQL复制概念深入

[减轻复制压力]复制过滤器,指定需要复制的白名单,或者需要忽略的黑名单 [[email protected] ~]# cd /etc/ [[email protected] etc]# cp my.cnf{,.master} [[email protected] etc]# ll my.cnf* -rw-r--r--. 1 root root 4686 10月 13 04:43 my.cnf -rw-r--r--. 1 root root 4686 10月 14 20:00 my.cnf.mas

MySQL复制: Galera

MySQL复制: Galera mysql 主从复制 大纲 MySQL复制: Galera 前言 Galera Replication简介 MariaDB-Galera-Server 环境部署 配置步骤 总结 前言 之前介绍了MySQL复制的各种解决方案, 但是我个人还是感觉Galera最好用也最实用, 什么是Galera, 它强大在哪里, 这篇文章就带你认识这个强大的工具 Galera Replication简介 Galera Repplication Galera复制发生在事务提交时, 通过

理解MySQL——复制(Replication)

1.复制概述 1.1.复制解决的问题数据复制技术有以下一些特点:(1)    数据分布(2)    负载平衡(load balancing)(3)    备份(4)    高可用性(high availability)和容错 1.2.复制如何工作从高层来看,复制分成三步:(1)    master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events):(2)    slave将master的binary log events拷贝到它的中

MySQL复制详解

目录: 1.简介 2.原理 3.常见复制架构 4.一主一丛异步复制演示 5.测试结果 6.额外的配置参数 7.提升备库成为主库 7.1计划内的提升 7.2计划外的提升 8.半同步复制配置演示 9.双主双写配置演示 10.处理可以忽略的错误 11.总结 1.简介:MySQL内建的复制功能是构建基于MySQL的大规模,高性能应用的基础.复制就是让一台服务器的数据和其它服务器保持同步,一台主库可以同步到多台备库上面,备库也可以作为另一台服务器的主库.主库和备库之间可以有多种不同的组合方式. 2.原理:

使用 Ansible 管理 MySQL 复制

Ansible 是一个新兴的 IT 自动化工具.本文将介绍如何通过 Ansible 配置及管理 MySQL 主.从复制环境,实现部署过程自动化,体验 Ansible 简单快速带来的快感. 简介: Ansible 是一个配置管理和应用部署工具,功能类似于目前业界的配置管理工具 Chef,Puppet,Saltstack.Ansible 是通过 Python 语言开发.Ansible 平台由 Michael DeHaan 创建,他同时也是知名软件 Cobbler 与 Func 的作者.Ansible