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服务器端进行数据写入。

8938649-24dd3ba60d932238.png
一主一从逻辑图
8938649-e621fdd180885dfd.png
一主多从逻辑图

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

8938649-94fffc9513475867.png
双向主主复制逻辑图

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

8938649-dc8a74c8abdef600.png
线性级联单向双主复制逻辑图

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

8938649-0d71703294d58ec6.png
环状级联单向多主同步逻辑架构图

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

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

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

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

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

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

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

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

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

8938649-559a932598ed3da2.png
MySQL主从复制根据业务的重要性拆分从库的方案

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

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

扫描二维码关注公众号,回复: 6442929 查看本文章
8938649-147846b79e143719.png
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中。

8938649-f8723a8e5572c9f6.png
MySQL主从复制基本原理逻辑图

小结:

  • 主从复制是异步的逻辑的SQL语句级的复制
  • 复制时,主库有一个binlog dump线程,从库有两个线程,I/O线程和SQL线程
  • 从MySQL 5.6起,Slave服务器端的SQL线程可以是很多个
  • 实现主从复制的必要条件是主库要开启记录binlog的功能
  • 用于复制的所有MySQL节点配置中的server-id都不能相同
  • binlog文件只记录对数据库有更改的SQL语句,不记录任何查询以及未对数据库做出更改的语句

转载于:https://www.jianshu.com/p/9c93ba194b9d

猜你喜欢

转载自blog.csdn.net/weixin_33895695/article/details/91145113