MySQL复制之理论篇

一、MySQL复制概述

MySQL支持两种复制方式:基于行的复制和基于语句的复制(逻辑复制)。这两种方式都是通过在主库上记录

二进制日志、在备库重放日志的方式来实现异步的数据复制,其工作原理如下图:

同一时间点主库和备库的数据可能存在不一致。复制通常不会增加主库的开销,主要是启用二进制日志带来的开

销。通过复制可以将读操作指向备库来获得更好的读扩展,但对于写操作,除非设计得当,否则并不适合通过复制来

扩展写操作。在一主库多备库的架构中,写操作会被执行多次,这时候整个系统的性能取决于写入最慢的那部分。

复制解决的问题(用途):数据分布、、负载均衡、备份、高可用性和故障切换、MySQL升级测试等等。

二、MySQL复制原理

1. 基于语句的复制:

主库记录那些造成数据更改的查询,当备库读取并重放这些事件时,实际上只是把主库上执行过的SQL再执行一遍。

好处:实现简单、二进制日志里事件更加紧凑。当主备库模式不同时,逻辑复制能在多种情况下工作。容易理解,

出现问题可以很好定位。

缺点:存在一些无法被正确复制的SQL,例如当使用了CURRENT_USER()函数时。更新必须是串行的,这需要更多的

锁。存储过程和触发器在使用基于语句的复制模式时也可能存在问题。

2. 基于行的复制:
       基于行的复制将实际数据记录在二进制日志中。

好处:可以正确地复制每一行。无须重放更新主库数据的查询,更高效。减少锁的使用。

缺点:很难进行时间点恢复、开销有时大有时小。无法判断执行了哪些SQL。出现问题很难定位。无法处理诸如在

备库修改表的schema这样的情况。

没有那种模式对所有情况都是完美的,MySQL能够在这两种复制模式间动态切换。默认情况下使用的是基于语句的

复制方式,但如果发现语句无法被正确地复制,就切换到基于行的复制模式。

3. 复制使用的文件:

(1)二进制文件、中继二进制文件(文件名可在mysql配置文件中配置)

(2)mysql-bin.index:记录所有的二进制日志文件名,不能删除,MySQL依赖这个文件识别二进制日志文件。

(3)mysql-relay-bin.index:记录所有中继日志的索引文件,同样不能删除。

(4)master.info:保存备库连接到主库所需要的信息,格式为纯文本,记录了复制用户的密码。

(5)relay-log.info:记录当前备库复制的二进制日志和中继日志坐标。

4. 发送制事件到其他备库:

log_slave_updates选项可以让备库变成其他服务器的主库。在设置该选项后,MySQL会将其执行过的事件记录到

它自己的二进制日志中,这样它的备库就可以从其日志中检索并执行事件。原理图如下:

注:

当复制SQL线程读中继日志时,会丢弃事件中记录的服务器ID和该服务器本身ID相同的事件,从而打破了复制过程中

的无限循环。

5. 复制过滤器:

复制过滤器选项允许仅复制服务器上一部分数据。有两种过滤方式:在主库上过滤记录到二进制日志中的事件、在

备库上过滤记录到中继日志中的事件。原理图如下:

注:

除非万不得已,不要使用复制过滤,因为它很容易中断复制并导致问题,在需要灾难恢复时也会带来极大的不方便。

三、复制拓扑
      可以在任意个主库和备库之间建立复制,只有一个限制:每一个备库只能有一个主库。各种拓扑结构的基本原则:

(1)一个MySQL备库实例只能有一个主库。

(2)每个备库必须有一个唯一的服务器ID。

(3)一个主库可以有多个备库。

(4)如果打开了log_slave_updates选项,一个备库可以把其主库上的数据变化传播到其他备库。

1. 一主库多备库:

在有少量写和大量读时,这种配置是非常有用的。可以把读分摊到多个备库上,直到备库给主库造成了太大的负担,

或者主备之间的带宽成为瓶颈为止。

2. 主动-主动模式下的主-主复制:
      也叫双主复制或双向复制,包含两台服务器,每一个都被配置成对方的主库和备库。

这种配置最大的问题是如何解决冲突,例如,两台服务器同时修改一行记录,或同时在两台服务器上向一个包含

auto_increment列的表里插入数据。

允许向两个服务器写入所带来的麻烦远远大于其带来的好处。

3. 主动-被动模式下的主-主复制:

把“主动-主动模式下的主-主复制”中的的一台服务器配置成只读的被动服务器。

这种方式使得反复切换主动和被动服务器非常方便,因为服务器的配置是对称的,这使得故障转移和故障恢复很容易。

4. 拥有备库的主-主结构:

为主-主复制中的每个主库增加一个备库。

这种配置的优点是增加了冗余,对于不同地理位置的复制拓扑结构,能够消除站点单点失效的问题。

5. 环形复制:
       每个服务器都是在它之前的服务器的备库,是在它之后的服务器的主库。完全依赖于环上的每一个可用节点,大大增

加了整个系统失效的几率。如果从环中移除一个节点,这个节点发起的事件就会陷入无限循环。

可用通过为每个节点增加备库的方式来减少环形复制的风险。

6. 主库、分发主库以及备库:

当备库足够多时,会对主库造成很大的负载。这种拓扑使用一个备库专门来进行复制的分发,移除主库的负载。

为了避免在分发主库上做实际的查询,可以将它的表修改为blackhole存储引擎。如果主库接近满负载,不应该为其

建立10个以上的备库。可以通过设置slave_compressed_protocol来节约一些主库宽带。可以通过分发主库实现其他目的,例

如对二进制日志事件执行过滤和重写规则。

使用分发主库一个主要的缺点是无法使用一个备库来代替主库,因为由于分发主库的存在,导致各个备库与原始主库

的二进制日志坐标已经不相同。

7. 树或金字塔形:

减轻了主库的负担,但它的缺点是中间层出现的任何错误都会影响到多个服务器,中间层次越多,处理故障会更困难、

更复杂。

时间: 2024-10-11 04:30:40

MySQL复制之理论篇的相关文章

MySql binlog(理论篇)

1.什么是binlog? binlog日志用于记录所有更新了数据的sql语句或保存被修改的记录Row: 有了binlog,可以用于实时备份,master/slave主从同步: 在5.0版本前支持文本格式和二进制格式,5.0后只支持二进制格式:二进制日志在性能.信息处理方面更佳: 2.binlog日志格式 Mysql binlog日志有三种格式,分别为Statement Level,Mixed Level,以及Row Level! Statement Level:每一条修改数据的sql都会记录在b

MySQL知识理论篇

此篇文件献给正在学习MySQL的同学们,如果希望探讨学习请加我QQ:402283866 [思维理论篇] MySQL的定义 MySQL就是一个存表格的仓库,用规范的语句可以操作这个表(我们称sql语句).这些表格的每一行为一个单位,被公司记录一些信息. MySQL的使用方法 MySQL中的表格,每一行在被调用的时候会使用一些标准的语句,语句可以完成增删改查等操作.这些语句有6类,常用的有3类,每一类只有3-5个总有固定的单词,反复练习很容易掌握. MySQL主从同步 因为两个原因要设置主从同步:1

mysql系列之复制1----原理篇

MySQL 复制介绍: MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器. MySQL主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新. 在当前的生产工作中,大多数应用的 MySQL 主从同步都是异步的复制方式,即不是严格实时的数

小蚂蚁学习sphinx(1)--理论篇

网上有视频在讲php+mysql+sphinx,以前只是听说过,心想今天终于能够学习一下涨涨见识了,一个小时的理论篇讲完,并没有预想中那种汲取大量知识的满足感,一来讲的理论多一些,二来都是在linux下的操作,没办法实践,先把今天的小笔记写一下,以后慢慢钻研这块内容. sphinx生成索引数据,并为数据库提供更专业的搜索功能. 为什么要用sphinx?1.做搜索时当数据量很大单纯的mysql搜索比较慢(如果表进行了分表会更慢)2.搜索中文分词3.速度快 获取sphinx.http://sphin

MySQL复制: Galera

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

mysql配置主从复制 第一篇

安装好一个mysql到D盘.然后把D盘的mysql文件夹复制到另外一个盘.我这里选择E盘 之后修改 根目录下的 my.ini 端口号 [mysqld]port = 3307 ps:一定要和另外一个区分开. 安装服务 mysqld install mysql 启动mysql服务 net start mysql 删除mysql服务步骤: mysql\bin\mysql -remove  移除服务 如果出现这种情况. 已经安装好mysql服务,启动其中的一个服务可以成功,就是不能启动两个,这时候你该

MySQL复制详解

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

mysql配置主从复制 第二篇

经过查询资料,终于把mysql主从复制搞定了.此版本是mysql5.0的. 好了,开始说步骤. 首先,上篇已经说过了,需要复制一份安装文件到另外一个盘.接下来修改注册表. 好了,完了之后,我们修改mysql根目录下的my.ini文件. 当然,修改之前你需要备份一下.省的以后启动不起来. ----------------------------------------- 首先修改你要配置的主数据库的my.ini ----------------------------------------- [

CentOS 6开机启动流程理论篇

CentOS 6开机启动流程理论篇 centos 系统的启动流程 grub 破坏Linux的核心文件再修复体验系统启动流程 概述 任何系统启动的第一步必然是加电,然后计算机硬件会主动地读取BIOS来加载硬件设备信息并检测,之后系统会主动地读取第一个有引导程序的设备,该引导程序(grub)可以指定使用哪个内核来启动,并将其加载至内存当中运行,同时内核还要加载其他硬件设备以及对应的驱动程序,来例主机各个组件开始运行,等所有硬件设备加载完后,系统就真正地启动了,稍后系统会操作一些外部程序开始准备软件的