一.概述

主要目的实现MySQL高可用解决方案,实现异地多活。

二.实现构思

基于MGR实现高可用异地多活

首先要基于位置信息进行分片,例如华北 华中,华南,程序层要进行ip过滤和判断,

针对不同的ip 写入到不同的分片集合中,每张表需要有一个地理位置字段。

例如获得ip为华北,

Create table xx(

id int,

Name varchar(111),

Position int)

华北 表示为0

华中表示为1

华南表示为2

根据Position 字段进行分片。

其次可以根据时间维度或者用户id,或者其他分片规则进行二次分片。

要具备二次分片的能力

每个分片节点需要提供2个slave。用于分担读请求的压力。

三.故障处理

假设 NODE1节点故障

首先NODE1节点下面的slave 停止工作,

此前通过DNS记录把NODE1的ip在指向相近的节点为NODE2

NODE2节点提供本身的华中的读写请求,并再次同时也接管了NODE1的读写请求。

实现方式 基于consul的提供服务发现和健康检查,并提供DNS切换的功能。

NODE1 故障后的恢复

首先提供最近的节点NODE2节点进行基于binlog的恢复。等数据追平,在进行slave1和slave2的数据同步,等全部同步完成后在对外提供服务。

假设 NODE2的binlog已经清理,

首先通过NODE2的slave1或者slave2上获取一份全备在NODE1节点进行恢复。

等待恢复后,则通过主从的方式把数据追平。然后在添加到MGR集群环境中。

等待数据追平,在挂着NODE1下面的slave1和slave2 等待数据追平后在提供服务

NODE1和NODE2同时故障

整个集群会停止服务,MGR集群则无法继续工作。并触发s1级别告警。

修复方法 首先修复NODE2 然后在修复NODE1

可参考NODE1故障恢复方案进行恢复

四 难点

1.首先需要中间件要支持MGR,并支持二次分片

2.需要提供全局自增id,实现。每次insert 首先要获得一个全局的自增id,避免分片的合并造成的主键冲突,和产生自增锁

3.基于consul的dns的重新指向,或者使用其他的dns api服务通过脚本来实现,但需要实现分布式的健康检查和监控。

4.目前MGR并不成熟 需要等待官方成熟的MGR 可提供生产环境,预计今年的下半年。

5.瓶颈在于网络,可以同城,不建议跨城。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐