1、简介
数据库运⾏时,⼀些因素可能会导致服务运⾏不正常,⽤户访问数据受阻。对于互联⽹公 司,尤其是购物⽹站⽽⾔,这种情况造成的损失是⽆法估量的。因此,对数据库进⾏“备份” 也是必不可少的操作。当主要的数据库死机时,系统能够快速地切换到备⽤的数据库上。本 章将详细介绍数据库集群中的主从复制原理和操作流程。
2、主从复制集群的⼯作流程如下
(1)主服务器上⾯的任何修改都会通过⾃⼰的I/O线程保存在⼆进制⽇志⾥。
(2)从服务器上⾯也会启动⼀个I/O线程,通过配置好的⽤户名和密码连接到主服务器上⾯ 请求读取⼆进制⽇志,然后把读取到的⼆进制⽇志写到本地的⼀个中继⽇志的末端,并将读 取到的主服务器端的⼆进制⽇志的⽂件名和位置记录到master-info⽂件中,以便在下⼀次读 取的时候能够清楚地告诉主服务器:我需要某个⼆进制⽇志的某个位置之后的⽇志内容,请 发给我。
(3)从服务器的SQL线程检测到中继⽇志中新增加了内容后,会⻢上解析⽇志中的内容,并 在⾃身执⾏。需要注意,每个从服务器都会收到主服务器⼆进制⽇志中的全部内容的副本, 除⾮另⾏指定,否则,从服务器将执⾏来⾃主服务器⼆进制⽇志⽂件的所有的操作语句。另 外,从服务器每次进⾏同步时,都会记录⼆进制⽇志坐标(坐标包含⽂件名和从主服务器上 读取的位置,即master-info),以便下次连接使⽤。由于每个从服务器分别记录了当前⼆进制 ⽇志的位置,因此可以断开从服务器的连接,重新连接,然后恢复处理。
(4)在从服务器上删除的数据,在主服务器上重新创建,从服务器并不会同步过来,所以不要轻易的在从服务器上做删除操作。
3、基本架构
在 MySQL 的主从复制集群中,主数据库既要负责写操作⼜要负责为从数据库提供⼆进制⽇ 志,这⽆疑增加了主数据库的压⼒。此时可以将⼆进制⽇志只给某⼀个从服务器使⽤,并在 该从服务器上开启⼆进制⽇志,将该从服务器⼆进制⽇志分发给其他的从服务器;或者,这 个从服务器不进⾏数据的复制,只负责将⼆进制⽇志转发给其他的从服务器。这样,不仅可 以减少主服务的压⼒,还可以提⾼整体架构的性能。
⼀主多从原理如图所示
4、 多源复制架构
MySQL 5.7开始⽀持多源复制架构,即多个主服务器连接同⼀个从服务器(多主⼀从)。
多源复制中加⼊了⼀个叫作Channel的概念,每⼀个Channel都是⼀个独⽴的Slave,都有 ⼀个IO线程和⼀个SQL线程, 基本原理和普通的复制⼀样。 在对 Slave执⾏ CHANGEMASTER 语句时,只需要在每个语句最后使⽤for channel 关键字来进⾏区分即 可。
需要注意,在使⽤这种架构时,需要在从数据库的my.cnf配置⽂件中将master-inforepository、relay-log-info-repository参数设置为TABLE, 否则系统会报错。 相⽐于传统的⼀主⼀从、多主多从,在多源复制架构中,管理者可以直接在从数据库中进⾏ 数据备份, 不会影响线上业务的正常运⾏。
多源复制架构将多台数据库连接在⼀起,可以实 现合并表碎⽚,管理者不需要为每个数据库都制作⼀个实例,减少了维护成本,使⽤这种⽅ 式在后期进⾏数据统计时也会⾮常⾼效。
5、多主多从复制
在⼀主的情况下,主节点发⽣故障会影响全局的写⼊,设置双主或者多主集群可以避免单点 故障的发⽣。
前⾯介绍过的⼀主⼀从架构为基础,只需要集群中再加⼊⼀个主服务器master2和⼀个从 服务器slave2即可实现双主双从和多源复制架构。
6、复制模式
MySQL主从复制的⽅式可以分为异步复制、同步复制和半同步复制。
1.异步复制
异步复制为MySQL默认的复制⽅式, 主数据库执⾏完客户端提交的事务后会⽴即将结果返 给客户端,并不关⼼从数据库是否已经接收并进⾏了处理。 从⽇志的⻆度讲,在主数据库将 事务写⼊⼆进制⽇志⽂件后,主数据库只会通知dump线程发送这些新的⼆进制⽇志⽂件, 然后主数据库就会继续处理提交操作,并不考虑这些⼆进制⽇志已经传到每个从数据库节点 上。在使⽤异步复制模式时,如果主数据库崩溃,可能会出现主数据库上已经提交的事务并 没有传到从数据库上的情况,如果此时将从数据库提升为主数据库,很有可能导致新主数据 库上的数据不完整。
2.同步复制
同步复制是指主数据库向从数据库发送⼀个事务,并且所有的从数据库都执⾏了该事务后才会 将结果提交给客户端。因为需要等待所有的从数据库执⾏完该事务,所以在使⽤同步复制 时,主数据库完成⼀个事务的时间会被拉⻓,系统性能受到严重影响。
3.半同步复制
半同步复制介于同步复制与异步复制之间,主数据库只需要等待⾄少⼀个从数据库节点收到 并且更新⼆进制⽇志到中继⽇志⽂件即可,不需要等待所有从数据库给主数据库反馈。如此 ⼀来,不仅节省了很多时间,⽽且提⾼了数据的安全性。另外, 由于整个过程产⽣通信,所 以建议在低延时的⽹络中使⽤半同步复制。
环境
系统 :Redhat 9
mariadb版本:10.5.16
主机一:master 192.168.200.133
主机二:salve 192.168.200.128
步骤
先给两台设备进⾏命名为master和savle
[root@admin ~]# hostnamectl set-hostname master
[root@admin ~]# bash
[root@master ~]#
[root@localhost ~]# hostnamectl set-hostname salve
[root@localhost ~]# bash
[root@salve ~]#
对两台设备进⾏关闭防⽕墙和selinux操作
[root@master ~]# systemctl stop firewalld.service
[root@master ~]# systemctl disable firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@master ~]# setenforce 0
[root@salve ~]# systemctl stop firewalld.service
[root@salve ~]# systemctl disable firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@salve ~]# setenfo