运维实践 | OpenMLDB 跨机房容灾方案

news2024/9/24 9:24:31

背景
在单集群部署环境下,OpenMLDB 具备集群内节点级别的高可用能力。但若受到机房断电或者自然灾害等不可抗拒因素,则将造成的机房或大部分节点无法正常运转的情况,从而引发该集群状态异常,导致在线服务中断。为此,OpenMLDB 提供了一个跨机房容灾方案来解决该问题。在该方案中,用户可以在多个异地机房,分别部署独立的 OpenMLDB 集群,并且将这多套 OpenMLDB 集群设置成为主从复制模式。在这种部署架构下,如果主集群无法提供服务,用户可以进行主从切换,从而保证业务不中断。

架构

名词定义

  • 主集群:能支持读写的集群,并且可以给从集群同步数据。一个主集群可以有多个从集群。
  • 从集群:只提供读请求的集群,数据和主集群保持一致;可以在需要的时候切换为主集群;可以部署多个。
  • 分片 leader:主分片,接收读写数据。
  • 分片 follower:从分片,只接受分片 leader 同步过来的数据,目前不接受客户端的直接写请求。
  • offset:本文 offset 特指 OpenMLDB 的 binlog 所保存的数据偏移量,该值越大,说明保存有更多的新鲜数据。

关于名词的进一步解释可以查看 OpenMLDB 的在线模块架构文档:https://openmldb.ai/docs/zh/main/reference/arch/online_arch.html

目标

  • 主集群支持写操作,主从集群都可以支持读操作
  • 一个主集群可以有多个从集群作为备份
  • 主集群出现意外不可用时能够手动切换,让其中一个从集群提升为主集群
  • 能够自动处理主集群或者从集群内部节点下线不可用(包括 nameserver 和 tablet)的情况

技术方案

主从集群的整体技术架构如下图所示:
file
主从集群之间的同步信息,主要包含数据同步和元信息同步两部分。

初始状态

对于主从集群的初始状态,可以为以下状态之一:

  • 主集群和从集群的数据均为空
  • 主或从集群不为空,主从集群的表名以及 schema 一致,并且主集群 offset 大于等于从集群的 offset,否则会报错。

元信息同步

元信息同步发生在主从集群的 nameserver 之间。具体的过程如下:

  • 建立好主从关系之后,主集群的 nameserver 会向从集群同步主集群的表信息,从集群创建相应的表。注意,主从集群节点数不需要一致,但是每张表的分片数需要保持一致。
  • 主集群的 nameserver 每隔一段时间获取从集群的表拓扑信息

数据同步

主从集群之间的数据同步主要通过 binlog 进行,其总体的同步逻辑如下:

  • 单集群内部:leader → followers 同步数据
  • 主从集群之间:主集群 leader → 从集群 leader 同步数据
    下图可视化列举了该同步逻辑和数据流方向。
    file

假设有一个从集群,表为三副本。其具体过程为:主集群分片的 leader 会创建两个 replicator 线程来负责集群内部数据同步,以及 1 个 replicator 线程来负责同步数据到从集群的 leader;从集群的 leader 会创建两个 replicator 线程,分别给从集群内部的 followers 同步数据。

replicator 的具体同步逻辑如下:

  • 读取 binlog 并把数据传给 follower
  • follower 收到数据,添加到本地 binlog,同时写到本地分片表中

默认情况下,replicator 会不断读取最新的 binlog,如果没有最新数据写入就会等待一小段时间(默认为 100ms),再尝试读取。在同步时效性要求比较高的场景下,可以修改默认配置(参数 binlog_sync_wait_time,详见文档配置文件),减少等待时间,但是可能会增加 CPU 的资源消耗。

集群内部自动故障转移

主集群 nameserver 离线

  • 主集群中主 namserver 离线之后,主集群中的备 nameserver 就会升级为主 nameserver,更新从集群中表的拓扑信息到新的主 nameserver
  • 主集群中备 nameserver 离线,不做任何操作

从集群 nameserver 离线

  • 从集群中主 nameserver 离线之后,从集群中的备 nameserver 就会升级为主 nameserver。主集群向从集群获取表拓扑信息时,返回错误,主集群就会读取从集群的 ZooKeeper 信息,以获取最新的主 nameserver,然后更新表拓扑信息
  • 从集群中备 nameserver 离线之后不做任何操作

主集群 tablet 离线

  • 主集群内做故障转移,相应的分片选出新的 leader
  • 新的 leader 重新和从集群中分片所在的 tablet 建立数据同步关系

从集群 tablet 离线

  • 从集群做故障转移,相应的分片选出新的 leader
  • 主集群 nameserver 获取从集群表拓扑结构发现已经有变化,删除对应变化分片的数据同步关系并重新建立

主从集群间手动故障转移

主集群不可用
通过运维命令,提升从集群为主集群。同时,业务方的写流量和读流量需要切换到当前的新的主集群下,该流量的切换过程需要由业务方系统来完成。
从集群不可用
业务方原有在从集群上的读流量(如果有),需要全部切换到主集群下。该流量的切换过程需要由业务方系统来完成。

主从集群搭建实践

集群启动后默认为主集群。通过命令可以将一个集群添加为另一个集群的从集群,或者进行切换、移除。

启动 NS client

主从集群的管理在 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 命令可以查询所有从集群,输出结果类似:
file

FAQ

Q1: 如何解决分布式的“脑裂”问题?
A1:在分布式环境中,经常会遇到“脑裂”问题。所谓脑裂,简单来说就是在某些非正常状态下(比如由于网络阻塞),两个集群选举出了不同的 leader。Raft 之类的一致性协议能很好的解决类似问题,如要求 leader 必须获取半数以上的投票。
OpenMLDB 的选主和这些协议不太一样,OpenMLDB 是由 ZooKeeper 和 nameserver 来选主的。节点是否下线通过 ZooKeeper 中 ephemeral node 实现,nameserver 选主的时候从该集群的所有 follower 中选择 offset 最大的一个作为新的 leader,所以本质上来说 OpenMLDB 的主从集群方案不会出现脑裂的问题。

Q2: 如何判断主集群不可用,需要进行主从切换?
A2: 目前 OpenMLDB 在集群整体不可用的状态上并不会自动判断或自动切换,设计主从集群方案主要是为了应对如机房断电等重大事故。
因此目前需要人为主观去判断主集群是否处于不可用状态,从而需要进行主从切换。造成主集群不可用的常见原因如:整个集群的服务器不可抗拒原因无法访问、ZooKeeper 无法恢复、部分 tablet 下线导致无法恢复或者恢复时间过长等。

Q3: 是否可能在某些情况下会数据丢失?
A3: 虽然主从集群方案增加了多一层的高可用机制,但是也不能保证数据完全不丢失,以下情况依然会出现数据丢失,相关问题均会在后续版本进行修复或者优化:

  • 主集群内部 tablets failover 后,新选出来的 leader 的 offset 比从集群中的 leader 的 offset 小,会造成两者 offset 差值之间的这部分数据丢失
  • 主从切换过程中,如果主集群有写流量,那么可能会造成部分未及时从原有主集群同步到从集群的数据丢失
  • 从集群表格拓扑发生变化,并且主集群尚未捕获,此时如果执行主从切换,会造成从拓扑结构发生变化到切换成功之间的数据丢失

Q4: 是否可以支持多个从集群
A4: 一个主集群可以支持多个从集群,只要在主集群上执行添加从集群命令 addrepcluster 进行添加即可。

Q5: 和业界其他主从集群方案的比较?
A5: file
file
列举了两个业界常用数据库作为比较 —— TiDB 和 MySQL,OpenMLDB 的做法和这两个在架构上比较相似。TiDB 将数据从 TiKV 传到 TiFlash 也是通过类似方式完成的,TiFlash 有一个 Learner 的概念类似于 OpenMLDB 从集群的 leader。TiKV 会把数据同步到 Learner 上面,然后再由 Learner 去做集群内的数据同步。MySQL 的主从复制,跟我们做法也是类似的,它也是通过 binlog,将数据定期地同步到从集群上面,从集群再进行 binlog 的集群内读取和同步。

开发进度

目前主从集群方案在实验阶段,其核心功能都已经开发完毕,并且进行了充分的测试。目前主要遗留问题为:

  • SQL 命令目前只有创建表、删除表、以及数据插入操作可以主从集群自动同步,其余命令(比如 SQL 上线,修改 TTL 等)目前尚不支持自动同步,需要手动在主从集群上分别执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

悉数美剧《黑客军团》中的黑客工具

本篇文章中主要列举《Mr. Robot》电视剧中主要用到的黑客工具,并对它们所对应的现实中的黑客工具做一简要介绍。Mr. Robot2015年美剧出了一部关于黑客题材的电视剧,相信爱看黑客电视剧、电影的同学们已经看过或者正在追这部神秘的《Mr. Robot》&#xff…

零基础学MySQL(四)-- 数据库最常用的操作【查询基础篇 -- 单表查询】

目录📔一、最简单的 select 语句1️⃣基本语法2️⃣基本练习3️⃣补充说明(1) 使用表达式对查询的列进行运算(2) 在 select 语句中可使用 as 语句取别名📕二、使用 where 子句进行过滤查询1️⃣基本语法2️⃣在 where 子句中经常使用的运算符3️⃣基本练…

4道面试题让你了解 ThreadLocal 的那点小秘密

我收集了4个面试中出现频率较高的关于ThreadLocal的问题: 什么是ThreadLocal?什么场景下使用ThreadLocal?ThreadLocal的底层是如何实现的?ThreadLocal在什么情况下会出现内存泄漏?使用ThreadLocal要注意哪些内容&…

工赋开发者社区 | 事件驱动架构要避开的 5 个陷阱

事件驱动架构非常强大,非常适合用在分布式微服务环境中。事件驱动架构提供了解耦的架构、更容易实现的可伸缩性和更高程度的弹性。请求应答(客户端和服务器)与事件流(发布和订阅)但是,与请求和应答类型的架…

防范DDOS攻击的最佳方法

Botnets是由多个感染的计算机(称为"bots"或"zombies")组成的网络。这些感染的计算机受到攻击者的控制,可以同时发送大量的数据流量到目标网站,导致DDoS(分布式拒绝服务)攻击。Botnets也可以用于从感染的计算机中获取私人信息,传播病毒和蠕虫,或者执…

Git使用个人访问令牌提交代码到仓库

文章目录前言解决方法1、创建自己的token2.1、使用token(classic)2.2、使用token(方法二)参考链接前言 2021年8月13日开始,GitHub在使用Git操作远程仓库时不再支持使用用户名密码形式进行身份验证,需使用个人访问令牌。 使用Git操作GitHub仓库时使用用户…

整合spring cloud云服务架构 - 企业分布式微服务云架构构建

1. 介绍 Commonservice-system是一个大型分布式、微服务、面向企业的JavaEE体系快速研发平台,基于模块化、服务化、原子化、热插拔的设计思想,使用成熟领先的无商业限制的主流开源技术构建。采用服务化的组件开发模式,可实现复杂的业务功能。…

电脑开不了机怎么办?排查这3种情况

电脑开不了机不一定是电脑故障损坏的问题,也可能是硬件或者是线路松动导致的。电脑开不了机的原因有很多,电脑开不了机怎么办?我们先来了解下主要是哪些原因,排查出原因才好对症下药。 操作环境: 演示机型:…

Leetcode刷题注意点

时间复杂度:一个句子被执行多少次。 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度 列表可以用.append() 添加数据 字符串 用 s q 这个写法。 03 此题关键是哈希表的运用。 dic set() 表示取出nums中的key 并且set里面元素不重复 53…

python多光谱遥感数据处理、图像分类、定量评估及机器学习方法应用

普通数码相机记录了红、绿、蓝三种波长的光,多光谱成像技术除了记录这三种波长光之外,还可以记录其他波长(例如:近红外、热红外等)光的信息。与昂贵、不易获取的高光谱、高空间分辨率卫星数据相比,中等分辨…

2023年广州Java培训机构排行榜来啦,快来围观!

到底哪个Java培训机构靠谱?Java培训怎么选?如何在千万培训机构中一眼寻觅到自己的唯一所爱?别疑惑,别迷茫,小编带着2023最新数据来了,保证你看完有“山重水复疑无路,柳暗花明又一村”的豁然开朗感&#xf…

在线 OJ 项目(四) · 前端设计与项目总结

一、页面设计题目列表页题目详情页二、获取到后台数据实现思路遇到换行问题小结引入 ace.js三、项目总结接下来将实现 online-oj 项目的前端界面。 先随便从各大网站上下载网页模板~ 因为好看的前端网页设计需要美工的,我们只是程序员… 一、页面设计 但是我们可…

【可解释性机器学习】详解Python的可解释机器学习库:SHAP

详解Python的可解释机器学习库:SHAPSHAP介绍SHAP的用途SHAP的工作原理解释器Explainer局部可解释性Local Interper单个prediction的解释多个预测的解释获取单个样本的Top N个特征值及其对应的SHAP值全局可解释性Global Interpersummary_plotFeature ImportanceInter…

SkyWalking 极简入门

SkyWalking 极简入门1.概述1.1 概念1.2 功能列表1.3 整体架构1.4 官方文档2. 搭建 SkyWalking 单机环境2.1 Elasticsearch 搭建2.2 下载 SkyWalking 软件包2.3 SkyWalking OAP 搭建2.4 SkyWalking UI 搭建2.5 SkyWalking Agent2.5.1 Shell2.5.2 IDEA3. 搭建 SkyWalking 集群环境…

【4】Linux实用操作

学习笔记目录 初识Linux--入门Linux基础命令--会用Linux权限管控--懂权限Linux实用操作--熟练实战软件部署--深入掌握脚本&自动化--用的更强项目实战--学到经验云平台技术--紧跟潮流 各类小技巧(快捷键) ctrl c强制停止 Linux某些程序的运行&am…

AI作画:文心一格赋能艺术与设计创作

针对视觉内容创作门槛高、耗时长等行业痛点问题,百度推出了基于文心大模型的AI艺术创作产品文心一格。通过文心一格核心系统的技术创新,让AI作画普惠大众,提升创作效率。目前,文心一格产品已经对外发布使用,大众用户均…

Docker容器基本操作

docker中的容器就是一个轻量级的虚拟机,是镜像运行起来的一个状态,本文就先来看看容器的基本操作。 查看容器 查看容器 启动docker后,使用docker ps命令可以查看当前正在运行的容器: 查看所有容器 上面这条命令是查看当前正在…

[强网杯 2019]高明的黑客

目录 信息收集 正则测试 python脚本 getshell 信息收集 $_GET[ganVMUq3d] ; eval($_GET[ganVMUq3d] ?? ); $_GET[jVMcNhK_F] ; system($_GET[jVMcNhK_F] ?? ); $_GET[cXjHClMPs] ; echo {$_GET[cXjHClMPs]}; 下载gz解压后得到几千个php文件,简单看…

【项目实战】count(1) 、count(col)、count(*) 如何选择?

一、背景 有时候会看业务执行的情况,如查看多少用户已经领取了礼品等,需要看数据库的计数或统计用户使用情况时,往往会使用聚合函数COUNT(),聚合函数有很多种,列出如官网的截图 而其中常用的聚合函数主要是包括以下&…

Linux常用命令——readelf命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) readelf 用于显示elf格式文件的信息 补充说明 readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持…