开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(三):MyCat-架构剖析-MyCat 主从切换实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/757/detail/13300
MyCat-架构剖析-MyCat 主从切换实现
内容介绍:
一、MyCat 主从切换概述
二、MyCat 主从切换实现
MyCat 主从切换架构,这节我们主要从两个方面讲解,一方面是 MyCat 主从切换概述,另一方面是 MyCat 主从切换的实现。MyCat 主从切换指的是基于 MyCat 的读写分离衍生出来的。
一、MyCat 主从切换概述
MyCat 实现 MySQL 读写分离的目的在于降低单节点数据库的访问压力,原理就是让主数据库执行增删改操作,从数据库执行查询操作,从主库查询的操作通过从库执行, 利用 MySQL 数据库的复制机制将 Master 的数据同步到 slave 上。
当我们实现了 MyCat 的读写分离后,我们就需要考虑一个问题,读写分离的读组主节点和写组主节点,以及读组从节点和写组从节点,当主节点或者从节点挂掉之后会怎样呢?当我们主节点挂掉了,也就是 slave 既要承担自己本身的写操作也要承担主节点的读操作,而 slave 挂掉后 master 节点既要充当读操作,也要承担写操作,那么这个过程我们可以手动切换数据,但过程相对繁琐,我们这一章就是讲解如何自动切换。当 master 宕机后,slave 承载的业务如何切换到 master 继续提供服务,以及 slave 宕机后如何将 master 切换到 slave 上。手动切换数据源很简单,但不是运维工作的首选,本节重点就是讲解如何实现自动切换。
MyCat 的读写分离依赖于 MySQL 的主从同步,也就是说 MyCat 没有实现数据的主从同步功能,但是实现了自动切换功能。
下边我们会讲到两种切换方式一种是自动切换,另一种是基于 MySQL主从同步状态的切换,我们现将自动切换
1.自动切换
这个自动切换是 MyCat 主从复制的默认配置,当主机或从机宕机后,MyCat 自动切换到可用的服务器上。我们不需要手动操作,假设写服务器为M,读服务器为s,则:
正常时,写 M 读 s;
当 M 宕机后,也就是主节点挂掉了,读写 s ;恢复M后,写 s,读 M;
当 s 宕机后,就是从节点宕机,读写 M; 恢复 s 后,写 M,读 s; 那么我们如何去配置自动切换呢,其实很简单,我们只需要在 dateHost 中配置一个参数,就是 swichType ,之前讲过 swichType 的取值有 3 个,一个是 -1,一个是 1,一个是2,如果 -1 代表的是不开启自动切换,就是说宕机之后,我们什么操作都不做,然后第二个就是 1,代表自动切换,所以要想自动切换我们只需要把 swichType 的值改为 1。如果 swichType 配置是 2 ,那么就是基于 MySQL 主从同步状态的切换。
2.基于 MySQL 主从同步状态的切换
这种切换方式与自动切换不同,MyCat 检测到主从数据同步延迟时,会自动切换到拥有最新数据的 MySQL 服务器上,防止读到很久以前的数据。
假如我们现在有两组数据库,前者是主数据库,然后在主数据库中还有一个从数据库,那么主从复制实际上就是把主数据库中的东西同步到从数据库中,那么在同步过程中可能会出现这种现象,即当我们从主节点中写入了一小截数据,然后从节点需要抓取二进制日志写入到写入到中继日志,然后再通过中继日志完成主从复制。但是当我们主节点中写入了一小截数据,但是从节点并未从做中继日志,或者说正在从做中继日志,这个时候有用户查询了这个从节点,那么这时候刚刚写入的数据在查询时是没有的,因为正在读取日志,从而主从数据出现延迟问题,而下面这个机制就可以检测这种延迟,如果主从同步存在延迟,这个时候它就会将它切换到最新的这库中的数据同步到从数据库当中,切换到最新的 MySQL 服务器中 ,我们就可以读到最新的数据,那么它的原理实际上是检测 MySQL 主从同步当中的三项配置,
我们打开远程连接的工具,在 157 服务器和 158 服务器安装了两台 MySQL,也在两者上配置了主从复制的工具,输入密码进去之后,我们通过输入的指令就可以了解到主从复制的一个状态,往上走我们可以看到 slave _Io_ Running, slave_sQL_Running 这两项代表的就是主从同步的状态是否正常,除了这两项,我们在这一块还要关注 seconds _Behind _Master 看看这一项是不是 0,如果不是,说明这一项存在一定程度的延迟,这种很小的延迟是允许存在的,不能说一定不会存在延迟,只不过看我们业务系统中能不能容许这种延迟,对于我们检查同步状态的时候检查的就是这三个参数。
原理就是通过检查 MySQL 的主从同步状态( show slave status )中的 seconds _Behind _Master、 slave _Io_ Running, slave_sQL_Running 三个字段,来确定当前主从同步的状态以及主从之间的数据延迟。
Seconds _Behind_Master 为 0 表示没有延<迟>,数值越大,则说明延迟越高。
二、MyCat 主从切换实现
基于延迟的切换,则判断结果集中的 s1ave_IO_Running、Slave_sQL_Running 两个个字段是否都为 yes,
以及 Seconds_Behind_Master 是否小于配置文件中配置的 slaveThreshold 的值,如果有任何一个条件不满足,则切换。 主要流程如下,这里我们会发送一个心跳包到 MySQL 数据库
这里有一个心跳检测机制,会分为两个心跳机制,我们要辨别心跳是属于哪个后端,这里我们会发送一个心跳包到 MySQL 数据库
,如果响应时数据识别失败,那么就会跳转到自动切换。数据出来之后,查看是否可用,将活动数据源指向新的数据源。
这个时候看看 swichType 的值是否是 2,这个时候我们判定最后 MySQL 是否出现宕机,如果没有宕机,这个时候还要进行判定,判定是否符合延迟切换,如果心跳数据识别成功后看满足延迟切换条件,什么时候达到延迟切换的条件呢,之前有说明(结果集中的 slave_IO_Running、Slave_sQL_Running 两个个字段都为 yes,以及 Seconds_Behind_Master 小于配置文件中配置的 slaveThreshold 的值,这个时候就认为不存在延迟,不可以进行切换,
如果上面三个条件有一个不是 yes,或者 Seconds_Behind_Master 的值大于配置文件中的值,如果任何一个条件不满足,则基于延迟切换),还有集群切换条件。
在这里我们只需要知道两种切换方式,一种是自动切换,另一种是基于延迟切换。自动切换是宕机之后的操作,而基于延迟的切换就是如果这个数据存在延迟,我再进行延迟切换,那么这是基于刚才那三个参数。