五、Mysql复制

目录
[toc]

概述

复制的问题解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。
两种复制方式:
基于行的复制和基于语句的复制。这两种方式都是通过在主库上记录二进制日志、在备库重放日志的方式来实现异步的数据复制。
复制通常不会增加主库的开销,主要是启用二进制日志带来的开销。除此之外,每个备库也会对主库增加一些负载(网络I/O开销)。

复制解决的问题

  • 数据分布
    可以随意的停止或开始复制,并在不同的地理位置来分布数据备份,例如不同的数据中心。即使在不稳定的网络环境下,远程复制也可以工作。
  • 负载均衡
    通过复制可以将读操作分布到多个服务器上,实现对密集型应用的优化,并且实现很方便,通过简单的代码修改就能实现基本的负载均衡
  • 备份
    对于备份来说,复制是一项很有意义的技术补充,但复制既不是备份也不能取代备份
  • 高可用性和故障切换
    复制能够帮助应用程序避免Mysql单点故障。
  • Mysql升级测试
    可以使用一个更高版本的Mysql作为备库,保证在升级全部实例前,查询能够在备库按照预期执行。

复制如何工作

  1. 在主库上把数据更改记录到二进制日志中。
    在每次准备提交事务完成数据更新前,主库将数据更新的实践记录到二进制日志中。按照事务提交的顺序而非语句执行的顺序来记录二进制日志。在执行完记录二进制日志之后,主库会告诉存储引擎可以提交事务了。
  2. 备库将主库的日志复制到自己的中继日志中
    备库将主库的二进制日志复制到其本地的中继日志中。首先,备库会启动一个工作现场。即I/O线程跟主库建立一个客户端连接,然后主库上启动一个特殊的二进制转储(binlog dump)线程,这个二进制转储线程会读取二进制日志中的事件,备库I/O线程将会接收到的事件记录到中继日志中。
  3. 备库读取中继日志的事件,将其重放到备库数据库之上
    备库会启用sql线程,从中继日志中读取事件并在备库中执行,从而实现备库数据的更新。当SQL线程追赶上I/O线程时,中继日志通常已经在系统中缓存,所以中继日志的开销很低。SQL线程执行的事件也可以通过配置选项来决定是否写入其自己的二进制日志中。

总结:
这种复制架构实现了获取事件和重放事件的解耦,允许这两个过程异步进行。也就是说,I/O线程能独立于SQL线程工作,但这种架构也限制了复制的过程,其中最重要的一点是在主库上并发运行的查询在备库上只能串行化执行

怎么配置复制架构

通常有三步:

  1. 在每台服务器上创建复制账号
    mysql>GRANT REPLICATION SLAVE.REPLICATION CLIEENT ON *.* TO repl@'192.168.0.% ' IDENTIFIED BY 'password'
  2. 配置主库和备库

主库:需要打开二进制日志,并配置一个独一无二的服务器id,在my.cnf中修改

log_bin = mysql-bin
server_id=10

备库:

log_bin=msql-bin
server_id=2
relay_log=/var/lib/mysql/mysql-reply-bin (中继日志的位置和命名)
log_salve_updates=1 (允许备库将其重放的时间也记录到自身的二进制日志中)
read_only=1 (只读权限)

重启。

  1. 通知备库连接到主库并从主库复制数据。
    使用CHANGE MASTER TO语句开始复制
mysql>CHANGE MASTER TO MASTER_HOST='server1',
          >MASTER_USER='repl',
          >MASTER_PASSWORD='password',
          >MASTER_LOG_FILE='mysql-bin.000001',
          >MASTER_LOG_POS=0

启动复制

mysql>START SLAVE

推荐的复制配置

  1. 在主库上二进制日志最重要的选项是sync_binlog: sync_binlog=1
    如果开启了该选项,Mysql每次在提交事务前会将二进制日志同步到磁盘中,保证服务器奔溃是不会丢失事件

复制的原理

基于语句的复制(逻辑复制)

基于语句的复制模式下,主库会记录哪些造成数据更改的查询,当备库读取并重放这些查询时,实际上只是把主库上执行过的SQL再执行一遍。
优点:

  • 不会使用太多的带宽
  • 实现相当简单,简单的记录和执行这些语句,就能保持主备同步

缺点:
很多情况下通过基于语句的复制模式无法正确复制。

基于行的复制

将实际数据记录到二进制日志中,跟其他数据库的实现比较相像。
优点:

  • 几乎没有基于行的复制模式无法处理的场景
  • 可以减少锁的使用
  • 占用更少CPU

缺点:

  • 找不到要修改的行时,基于行的复制可能会导致复制停止

复制拓补

可以在任意的主库和备库之间建立复制,只有一个限制:每一个备库只能有一个主库。
基本原则:

  • 一个Mysql备库实例只能由一个主库
  • 每个备库必须有一个唯一的服务器ID
  • 一个主库可以有多个备库
  • 如果打开了log_salve_updates选项,一个备库可以把其主库上的数据变化传播到其他备库

常用的拓补结构

  • 一主库多备库
  • 主主复制
  • 环形复制
  • 主库-分发主库-多个备库
  • 树形
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335