MySQL之高可用架构详解

目录
  • 引言
  • mysql高可用
  • 一主一备:
  • mysql主从同步的几种模式:
  • 总结

引言

“高可用”是互联网一个永恒的话题,先避开mysql不谈,为了保证各种服务的高可用有几种常用的解决方案。

服务冗余:把服务部署多份,当某个节点不可用时,切换到其他节点。服务冗余对于无状态的服务是相对容易的。

服务备份:有些服务是无法同时存在多个运行时的,比如说:nginx的反向代理,一些集群的leader节点。这时可以存在一个备份服务,处于随时待命状态。

自动切换:服务冗余之后,当某个节点不可用时,要做到快速切换。

总结起来就是 冗余+故障转移 。

mysql高可用

mysql的高可用也是同样的思路,首先要有多个mysql实例提供服务,其次就是当某个实例挂掉时,可以自动切换流量。同时mysql作为存储,节点之间数据同步也是一个难题(换句话说,有状态的服务都面临这个问题)。

一主一备:

mysql的各种高可用架构,都脱离不了mysql实例之间的数据同步,因此,我们先介绍下最简单的一主一备架构下mysql的数据同步流程。

上图是主从数据同步的一个示意图。

master节点有dump进程把binlog中的数据发送到slave节点,

slave节点有io进程接收数据写入relay log,

slave节点的sql进程根据relay log写入数据。

这里还要延伸一点,binlog存在三种形式:statement、row、mixed。

statement:就是把每一条sql记录到binlog中。

row:是把每一行修改的具体数据记录到binlog中。

mixed:mysql会灵活的区分,需要记录sql还是具体修改的记录。

只记录sql的话binlog会比较小,但是有些sql语句在主从同步数据的时候,可能会因为选择不同的索引在数据同步过程中出现数据不一致。记录row的话就可以保证主从同步不会存在sql语意偏差的问题,同时row类型的日志在做数据恢复的时候也比较容易,但是row会导致binlog过大。

mysql主从同步的几种模式:

异步模式:
在这种同步策略下,主库按照自己的流程处理完数据,会直接返回结果,不会等待主库和从库之间的数据同步。 优点:效率高。 缺点:master节点挂掉之后,slave节点会丢失数据。全同步模式: 主库会等待所有从库都执行完sql语句并ack完成,才返回成功。 优点:有很好的数据一致性保障。 缺点:会造成数据操作延迟,降低了mysql的吞吐量。半同步模式:主库会等待至少有一个从库把数据写入relay log并ack完成,才成功返回结果。 半同步模式介于异步和全同步之间。

半同步的复制方案是在mysql5.5开始引入的,普通的半同步复制方案步骤如下图:

master节点写数据到binlog,并且执行sync操作。master发送数据给slave节点,同时commit主库的事务。收到ack后master节点把数据返回给客户端。

这种数据提交模式叫: after_commit

after_commit 模式存在问题: 主库等待ack时,事务已经commit,主库的其他事务可以读到commit的数据,这个时候如果master崩溃,slave数据丢失,发生主从切换,会导致出现幻读。 为了解决这个问题mysql5.7提出了新的半同步复制模式: after_sync

把主库的事务提交放到了ack之后,避免了上述问题。 mysql5.7还引入了 enhanced multi-threaded slave (简称mts)模式, 当slave配置 slave_parallel_workers >0并且
global.slave_parallel_type =‘logical_clock’,可支持一个schema下,slave_parallel_workers个worker线程并发执行relay log中主库提交的事务,极大地提高了主从复制的效率。 mysql5.7半同步功能可以通过
rpl_semi_sync_master_wait_slave_count 参数配置slave节点ack的个数,认为主从同步完成。

基于mysql主从同步数据越来越完善,效率越来越高,也就引出了第一种mysql的高可用架构: 基于mysql自身的主从同步方案,常用的一种部署架构是: 用户通过vip访问master和slave节点,每个节点采用keepalved探索。配置主从关系,进行数据同步。

基于mha的高可用架构: 部署一份mha的manager节点,在mysql各个实例部署mha node节点。mha可以实现秒级的故障自动转移。 当然mysql节点之间的数据同步还要依赖mysql自身的数据同步方式。

mgr(mysql group replication)模式: 感觉mysql官方更看好mgr集群方案,但是目前我还不知道国内有哪一家公司在使用。 mgr集群是由所有的mysql server共同组成的,每个server都有完整的副本数据,副本之间基于row格式的日志和gtid来做副本之前的数据同步,采用paxos算法实现数据的一致性保障。 mgr架构要比前面讲述的半同步和异步同步数据的方式要复杂,具体可以参照 官网

总结

mysql的高可用架构没有银弹,了解其原理,选择符合自己业务场景的部署架构就可以了。

到此这篇关于mysql之高可用架构详解的文章就介绍到这了,更多相关mysql高可用架构内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐