2019-06-03 MySQL主从复制知识与应用实践(1)

1. MySQL主从复制

MySQL数据库的主从复制技术与使用scp/rsync等命令进行的异机文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制技术是其软件自身携带的功能,无须借助第三方工具,而且,MySQL的主从复制并不是直接复制数据库磁盘上的文件,而是将逻辑的记录数据库更新的binlog日志发送到需要同步的数据库服务器本地,然后再由本地的数据库线程读取日志中的SQL语句并重新应用到MySQL数据库中,从而即可实现数据库的主从复制。

1. MySQL主从复制介绍

MySQL数据库支持单向、双向、链式级联、环状等不同业务场景的主从复制。在复制过程中,一台服务器(实例)作为主数据库(Master)。接收来自用户的、对其内容的更新,而一个或多个其他的服务器则作为从服务器(Slave),接收来自主服务器binlog文件的日志内容,然后将该日志内容解析出的SQL语句重新应用到其他从服务器中,使得主从服务器数据达到一致。
如果设置了链式级联复制,那么,从服务器本身除了作为从服务器之外,也会同时作为其下面从服务器的主数据库服务器。链式级联复制形式类似于A==>B==>C。
下面两个为单向主从复制架构逻辑图,此架构只能在Master服务器端进行数据写入。

一主一从逻辑图
一主多从逻辑图

以下为双向主主复制逻辑架构图,此架构可以在Master服务器1端或Master服务器2端进行数据写入,或者在两端同时写入数据(需要经过特殊设置)。

双向主主复制逻辑图

以下为线性级联单向双主复制逻辑架构图,此架构只能在Master服务器1端进行数据写入,工作场景Matser服务器1和Master服务器2作为主主互备,Slave服务器1作为从库,中间的Master服务器2需要进行特殊的设置。

线性级联单向双主复制逻辑图

以下为环状级联单向多主同步逻辑架构图,任意一个点都可以写入数据,此架构比较复杂,属于极端环境下的“作品”,一般场景应慎用。

环状级联单向多主同步逻辑架构图

在当前的生产环境中,MySQL主从复制默认都是异步的复制方式,即不是严格实时的数据同步,但是在正常
情况下带给用户的体验几乎都是实时的。

2. MySQL主从复制企业级应用场景

MySQL主从复制集群技术使得MySQL数据库支持大规模高并发的读写操作成为可能,同时又能有效地解决物理服务器宕机场景的数据备份和进行快速业务切换的问题。对于企业生产环境来说,MySQL主从复制主要有以下几个重要的应用场景。

1. 从服务器作为主服务器的实时数据备份

主从服务器架构的设计,可以大大加强MySQL数据库架构的健壮性。例如,当主服务器出现问题时,我们可以人工切换或设置成自动切换到从服务器继续提供服务,此时从服务器的数据和宕机时的主数据库几乎是一致的。
利用MySQL的主从复制技术进行数据备份,在硬件故障、软件故障、人为在数据库外误操作的场景下,该数据备份是有效的;但对于人为地在数据库中执行drop、delete等语句删除数据库的情况,从库的备份功能就没有用了,因为从服务器也会执行删除的语句。

2. 主从服务器实现读写分离,从服务器实现负载均衡

MySQL主从服务器架构可通过程序(PHP、Java等)或代理软件(maxscale、atlas)实现对用户(客户端)的请求按读和写进行分离访问,即让从服务器仅仅处理用户的select(查询)请求,以降低用户查询的响应时间及同时在主服务器上读写所带来的访问压力。对于更新的数据(例如update、insert、delete语句)仍然会交给主服务器处理,以确保主服务器和从服务器保持实时同步。
百度、淘宝、新浪等绝大多数的网站都是用户浏览的页面多于用户发布内容的页面,因此通过在从服务器上接收只读请求,就可以很好地减轻主库的读压力,且从服务器可以很容易地扩展为多台,使用LVS进行负载均衡(读写分离软件自身大多也有负载均衡的功能),效果就非常棒了,这就是数据库的读写分离架构。

一主多从读写分离及从库负载均衡架构逻辑图
3. 根据业务重要性对多个从服务器进行拆分访问

根据公司的业务,可以对几个不同的从服务器进行拆分。例如,有为外部用户提供浏览查询服务的从服务器,有内部DBA用来进行数据备份的从服务器,还有为公司内部人员提供访问的后台、脚本、财务统计、日志分析及供开发人员查询使用的从服务器。这样的拆分除了能够减轻主服务器的压力之外,还可以使得数据库对外部用户浏览、内部用户业务处理及DBA的备份操作等互不影响。具体如何对从服务器进行拆分可以用下面的简单架构来说明:

MySQL主从复制根据业务的重要性拆分从库的方案

3. MySQL主从读写分离实现方案

(1)通过程序实现读写分离(需要程序支持)
PHP和Java程序都可以通过设置多个连接文件轻松地实现对数据库的读写分离,即当语句关键字为select时,就去连接读库的连接文件,若为update、insert、delete时,则连接写库的连接文件。
通过程序实现读写分离的缺点就是需要开发人员对程序进行改造,程序本身无法直接支持读写分离。
(2)通过开源的软件实现读写分离
Maxscale、Atlas、Mycat等代理软件也可以实现读写分离的功能,并且无须对应用程序做任何修改,而且它们还支持负载均衡等功能;缺点是又引入了单点服务,并且稳定性不如程序实现好。
(3)大型门户独立开发DAL层综合软件
百度、阿里等大型门户都有开发牛人,会花大力气开发适合自己业务的读写分离、负载均衡、监控报警、自动扩容、自动收缩等一系列功能的DAL层软件。
MySQL读写分离的基本逻辑图如下图所示:

MySQL读写分离的基本逻辑图

4. MySQL主从复制原理

MySQL主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个MySQL数据库(Master)复制到另一个MySQL数据库(Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在Slave端,另外一个线程(binlog dump线程)在Master端(MySQL 5.6起SQL线程可以是多个)。
要实现MySQL的主从复制功能,首先必须打开Master端的binlog日志功能。因为整个复制过程实际上就是Slave从Master端获取binlog日志,然后再在Slave上以相同的顺序执行获取的binlog日志中所记录的各种SQL操作,从而实现主从数据一致的功能。

[mysqld]
log_bin = /application/mysql/logs/oldboy-bin    ---路径/application/mysql/logs/要提前创建,路径非必须,其中oldboy-bin是binlog日志的前缀

5. MySQL主从复制原理及过程

1)在Slave服务器上执行start slave命令开启主从复制开关,主从复制开始进行。
2)此时,Slave服务器的I/O线程会通过在Master上已经授权的复制用户权限请求连接Master服务器,并请求从指定binlog日志文件的指定位置之后开始发送binlog日志内容。
3)Master服务器接收到来自Slave服务器的I/O线程的请求之后,其上负责复制的binlog dump线程会根据Slave服务器的I/O线程请求的信息,分批读取指定binlog日志文件所指定位置之后的binlog日志信息,然后返回给Slave端的I/O线程。返回的信息中除了binlog日志内容之外,还包括在Master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定的更新位置。
4)当Slave服务器的I/O线程获取到Master服务器上I/O线程发送的日志内容及日志文件和位置点之后,会将binlog日志内容依次写入到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxxxxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取Master端新binlog日志时,能够告诉Master服务器需要从新binlog日志的指定文件及位置开始请求新的binlog日志内容。
5)Slave服务器端的SQL线程会实时地检测本地Relay Log中I/O线程新增加的日志内容,然后及时地把Relay Log文件中的内容解析成SQL语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行和应用这些SQL语句,并将当前应用中继日志的文件名及位置点记录在relay-log.info中。

MySQL主从复制基本原理逻辑图

小结:

  • 主从复制是异步的逻辑的SQL语句级的复制
  • 复制时,主库有一个binlog dump线程,从库有两个线程,I/O线程和SQL线程
  • 从MySQL 5.6起,Slave服务器端的SQL线程可以是很多个
  • 实现主从复制的必要条件是主库要开启记录binlog的功能
  • 用于复制的所有MySQL节点配置中的server-id都不能相同
  • binlog文件只记录对数据库有更改的SQL语句,不记录任何查询以及未对数据库做出更改的语句
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容