首页 > 人工智能 > 机器学习 > OpenMLDB 跨机房容灾方案
在单集群部署环境下,OpenMLDB 具备集群内节点级别的高可用能力。但若受到机房断电或者自然灾害等不可抗拒因素,则将造成的机房或大部分节点无法正常运转的情况,从而引发该集群状态异常,导致在线服务中断。为此,OpenMLDB 提供了一个跨机房容灾方案来解决该问题。在该方案中,用户可以在多个异地机房,分别部署独立的 OpenMLDB 集群,并且将这多套 OpenMLDB 集群设置成为主从复制模式。在这种部署架构下,如果主集群无法提供服务,用户可以进行主从切换,从而保证业务不中断。
关于名词的进一步解释可以查看 OpenMLDB 的在线模块架构文档:
主从集群的整体技术架构如下图所示:
主从集群之间的同步信息,主要包含数据同步和元信息同步两部分。
对于主从集群的初始状态,可以为以下状态之一:
元信息同步发生在主从集群的 nameserver 之间。具体的过程如下:
主从集群之间的数据同步主要通过 binlog 进行,其总体的同步逻辑如下:
主集群 nameserver 离线
从集群 nameserver 离线
主集群 tablet 离线
从集群 tablet 离线
主集群不可用
通过运维命令,提升从集群为主集群。同时,业务方的写流量和读流量需要切换到当前的新的主集群下,该流量的切换过程需要由业务方系统来完成。
从集群不可用
业务方原有在从集群上的读流量(如果有),需要全部切换到主集群下。该流量的切换过程需要由业务方系统来完成。
集群启动后默认为主集群。通过命令可以将一个集群添加为另一个集群的从集群,或者进行切换、移除。
主从集群的管理在 NS client 下进行操作,可以使用如下命令启动 NS client。
$ ./bin/openmldb --zk_cluster=172.27.2.52:12200 --zk_root_path=/onebox --role=ns_client
其中
zk_cluster 是 ZooKeeper 地址,
zk_root_path 是集群在 ZooKeeper 的根路径,
role 是启动的角色需指定为
ns_client
关于 NS client 的更多信息,可以参考运维 CLI。
可以使用命令
addrepcluster 来添加一个从集群,其使用格式为:
addrepcluster $zk_cluster_follower $zk_root_path_follower $cluster_alias
比如需要添加的从集群的 ZooKeeper 地址为
10.1.1.1:2181,OpenMLDB 在该 ZooKeeper 上的根路径为
10.1.1.2:2181 /openmldb_cluster,添加以后的从集群别名为
prod_dc01,则可以在主集群的 NS client 上执行如下命令进行从集群的添加:
addrepcluster 10.1.1.1:2181,10.1.1.2:2181 /openmldb_cluster prod_dc01
可以执行命令
removerepcluster 来删除一个从集群,比如删除上面添加的从集群
prod_dc01:
removerepcluster prod_dc01
switchmode 命令可以修改集群的角色。参数可以为
leader 或者
normal。如果需要把从集群提升成主集群,参数设置为 leader。如果要修改为普通的集群,参数设置为 normal。
switchmode leader
showrepcluster 命令可以查询所有从集群,输出结果类似:

Q1: 如何解决分布式的“脑裂”问题?
A1:在分布式环境中,经常会遇到“脑裂”问题。所谓脑裂,简单来说就是在某些非正常状态下(比如由于网络阻塞),两个集群选举出了不同的 leader。Raft 之类的一致性协议能很好的解决类似问题,如要求 leader 必须获取半数以上的投票。
OpenMLDB 的选主和这些协议不太一样,OpenMLDB 是由 ZooKeeper 和 nameserver 来选主的。节点是否下线通过 ZooKeeper 中 ephemeral node 实现,nameserver 选主的时候从该集群的所有 follower 中选择 offset 最大的一个作为新的 leader,所以本质上来说 OpenMLDB 的主从集群方案不会出现脑裂的问题。
Q2: 如何判断主集群不可用,需要进行主从切换?
A2: 目前 OpenMLDB 在集群整体不可用的状态上并不会自动判断或自动切换,设计主从集群方案主要是为了应对如机房断电等重大事故。
因此目前需要人为主观去判断主集群是否处于不可用状态,从而需要进行主从切换。造成主集群不可用的常见原因如:整个集群的服务器不可抗拒原因无法访问、ZooKeeper 无法恢复、部分 tablet 下线导致无法恢复或者恢复时间过长等。
Q3: 是否可能在某些情况下会数据丢失?
A3: 虽然主从集群方案增加了多一层的高可用机制,但是也不能保证数据完全不丢失,以下情况依然会出现数据丢失,相关问题均会在后续版本进行修复或者优化:
Q4: 是否可以支持多个从集群
A4: 一个主集群可以支持多个从集群,只要在主集群上执行添加从集群命令 addrepcluster 进行添加即可。
Q5: 和业界其他主从集群方案的比较?
A5:
列举了两个业界常用数据库作为比较 —— TiDB 和 MySQL,OpenMLDB 的做法和这两个在架构上比较相似。TiDB 将数据从 TiKV 传到 TiFlash 也是通过类似方式完成的,TiFlash 有一个 Learner 的概念类似于 OpenMLDB 从集群的 leader。TiKV 会把数据同步到 Learner 上面,然后再由 Learner 去做集群内的数据同步。MySQL 的主从复制,跟我们做法也是类似的,它也是通过 binlog,将数据定期地同步到从集群上面,从集群再进行 binlog 的集群内读取和同步。
目前主从集群方案在实验阶段,其核心功能都已经开发完毕,并且进行了充分的测试。目前主要遗留问题为:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70026745/viewspace-2935255/ ,如需转载,请注明出处,否则将追究法律责任。