腾讯云 TDMQ for Apache Pulsar 多地区高可用容灾实践

作者介绍

林宇强

腾讯云高级工程师

专注于消息队列、API网关、微服务、数据同步等 PaaS 领域。有多年的开发和维护经验,目前在腾讯云从事 TDMQ Pulsar 商业化产品方向的研发工作。

导语

本文将从四个维度,深入剖析 Pulsar 在多可用区高可用领域的容灾策略。首先,我们将从整体架构的角度切入,洞察其设计之精髓;其次,我们将探寻 Pulsar 在云原生领域的努力;再者,我们将聚焦 Pulsar 在高可用方面的设计,展现其稳健可靠的特性;最后,我们延申拓展 Pulsar 在跨地区同步方面的未来规划。

整体架构

image.png

腾讯云 TDMQ Pulsar 版,简单来说,就是把 Pulsar 这个开源消息系统放到了腾讯公有云上,让大家能更方便地使用。这个系统主要包括三个核心部分:ZK(ZooKeeper)、BK(BookKeeper)和 Broker。

因为我们用的是腾讯云,所以 ZooKeeper 部分就直接用了云上的服务,省去了自己维护的麻烦。而 BK 和 Broker 部分,则是由我们自己来管理和维护的。当然,我们也对这些部分做了一些扩展,主要是为了更好地和云环境集成。

在公有云上提供服务,我们主要关注的是如何与云的标准功能对接。比如,我们添加了计费、云 API 接口、管理控制以及云监控等功能。这些都是为了让我们的产品能具备云服务应有的基础设施能力。

另外,我们也增强了系统的可观测性。你可能不知道,可观测性主要看三个东西:Metrics(度量指标)、Log(日志)和 Trace(追踪)。我们这里主要提供了 Trace 功能,能记录每一条消息从生产到存储再到投递的全过程,这样你就能在云上直接看到消息流转的完整链路。

我们还基于 Pulsar 自带的功能,开发了一套 Metrics 数据采集链路,这些数据会接入到我们的云监控系统中,与云服务的标准相统一。

再来说说我们的整体架构。与开源模式相比,我们增加了一个叫 Lookup Service 的模块。Lookup Service 是地域级别的模块,每个地区只部署一套,用于同一个地区所有 Broker 集群的路由、寻址功能,是基于 Pulsar Http Lookup Service 进行二次开发的。这个模块的作用就像 RocketMQ 里的 NameServer 一样,负责调度。它可以根据需要,把一个租户或者一个命名空间调度到我们底层的任何一个物理集群上,实现了在物理机群之间的灵活调度和漂移。

我们的整个架构已经全面容器化了,所有的模块都是在容器上部署的,这样更加灵活和高效。

云原生与有状态服务

接下来是关于我们在容器化相关做的一些考量,容器化主要核心的关键点在于 BK 它是一个有状态的服务,所以我们就要考虑怎么在容器上去实现有状态服务的对接。

image.png

以下是云原生与有状态服务的三个关键点:

● 节点:计算+存储+网络;

● 有状态服务:存储+网络;

● 可插拔:云盘+弹性网卡。

一个节点从功能上大致可以拆分成三部分:容器和虚机

● 计算:CPU、内存等;

● 存储:磁盘;

● 网络:网卡。

有状态服务,核心:

● 节点标识:Hostname、IP、K8s 域名等;

● 节点绑定的存储空间:系统盘、数据盘;

● 节点绑定的网络标识:IP、K8s 域名等。

核心问题:

● 存储:云盘,只需保证节点重启时能够重新绑回之前的同一块盘。

● 网络:弹性网卡,节点重启时绑回之前 IP 对应的弹性网卡。

关键在于确保每个服务实例有一个固定的 IP 地址和对应的磁盘存储。CPU 和内存资源则可以在云资源池中灵活分配,无需固定绑定。只要服务实例的 IP 地址和磁盘映射保持不变,即便它在资源池中迁移到其他节点,也能保持其有状态服务的特性,就像它一直在同一个节点上运行一样。

所以实际上我们有状态服务,要考虑的就是存储和网络该怎么弹性的去做插拔,为了实现这一点,我们利用腾讯云的能力,采用云盘作为存储,弹性网卡提供网络服务。这使得每个 Pod 或机器都能在资源池中自由移动,无论迁移到哪个节点,只要正确挂载相应的弹性网卡和云盘,就能保持服务的连续性和稳定性。

这样的设计极大地减轻了我们对资源分配的担忧。云上的资源可以根据需要灵活调配,无需担心资源不足或紧急扩容的问题。同时,也避免了繁琐的机器申请和审批流程,提高了工作效率。

此外,我们还遵循云原生的不可变原则。一旦 Pod 启动,其内部的进程、程序和配置都保持不变。这种不可变性有助于确保服务的稳定性和可预测性,避免了因配置修改或命令执行不当而引入的风险。

这样有什么好处呢?

● CPU、内存可以随时切换任意机器。

● 基于云的计算资源池,不再担心机器库存问题,补充机器的流程耗时问题,紧急扩容时到处腾挪机器的问题。

● 规范和稳定性:基于云原生的规范,容器启动后即为不可变服务,不会出现服务上线后,人工上机器该配置等非标操作,引发各种后续问题。

变更流程

变更流程是我们在云原生和容器场景下,进行集群变更的标准化过程。这包括集群的扩容、缩容、新集群的创建或配置升级。

image.png

流程的前几个步骤,如确定规格和渲染配置,与云服务的常规发货流程相似。但关键的环节是我们的部署流程,特别是针对 Pulsar 集群的部署。

首先,我们需要构建或购买 ZK(ZooKeeper)服务。在云环境下,我们可以直接购买并使用 ZK。

接下来是 BK(BookKeeper)的初始化和部署。在 BK 部署之前,需要对 ZK 中的相关元素进行初始化。

随后,我们进行 Broker 的初始化,并创建接入点,以便与公有云服务进行网络连接。

由于整个流程相当复杂,并且包含许多依赖关系,我们选择使用 Helm 进行流程编排。Helm 的可编程性使我们能够精确地控制流程的各个环节。例如,在部署 Broker 之前,必须先部署 BK,并确保至少有两个 BK 节点启动后,Broker 才能开始启动。

通过使用 Helm,我们可以自动化处理各种依赖关系,从而统一整个流程。无论是创建新集群、升级配置,还是进行扩容或缩容,都可以遵循相同的流程,只是可能会跳过某些步骤,如在进行升级操作时,可能会跳过初始化步骤。

高可用

部署拓扑

关于高可用性的核心,我们首先需要关注的是如何进行拓扑规划。

image.png

多可用区部署主要涵盖三个要点。

● ZK(ZooKeeper):为了实现多可用区部署,至少需要3个可用区,其布局应遵循1-1-1或2-2-1的模式,图示为1-1-1布局。这种配置能确保任何一个可用区发生故障时,系统仍能保持可用性。

● BK(BookKeeper):这是一个有状态服务,需要确保磁盘数据与IP地址的对应关系维持不变。这一点对于有状态容器的实现至关重要。

● Broker:这是一个无状态服务,因此,理论上只要剩下一台机器能够承受住所有流量,服务就仍然可用。

为了实现 Pulsar 的多可用区高可用性,通常需要至少三个节点分布在三个可用区。这是因为 ZooKeeper 需要满足半数以上的节点保持可用。例如,如果 ZooKeeper 规划了三个节点,为了满足半数可用性并确保在一个可用区故障后,其余可用区能正常运行,就需要至少三个可用区,节点分布可以是1-1-1。如果是五个 ZooKeeper 节点,那么可以采用2-2-1的布局,以确保任意一个可用区故障后,剩余两个可用区的节点总数仍超过一半。

BK 作为有状态服务,其核心是确保存活的BK节点数量要多于 Broker 设计的多副本数量。因为 Pulsar 的 Topic 存储使用了多副本策略,所以只要 BK 的存活节点数量大于其多副本数量,理论上系统就能保持可用性。此外,机架感知可能会对 BK 的数量产生一定影响。

相比之下,Broker 的处理就简单多了。由于它是无状态服务,因此即使在一个包含六个节点的拓扑中,仅剩一个节点,只要这个节点能承受住所有流量,服务就仍然是可用的。

因此,在讨论高可用性时,我们更多关注的是如何配置 BK,因为 ZooKeeper 的配置模式相对简单且为人们所熟知。

BK 的高可用

关于BK的高可用性,我们主要考虑了以下四个方面来达成这个目标:

● 多可用区部署:举例来说,我们计划在三个不同的可用区域进行部署。

● 多副本:利用 Pulsar 的内置功能,我们强调数据的安全性。当某个副本发生故障时,其他副本可以确保数据的完整性和可恢复性。

● 机架感知:此功能有助于系统了解并优化数据的物理存储位置,从而提高数据的可靠性和访问速度。

● 变更可用性:主要依赖于 Pulsar 的 Auto Recovery 模块。当有多个副本时,若其中一个 BK 节点发生故障或宕机,部分数据的副本数可能会少于预期。此时,Auto Recovery 功能会自动启动,补充和恢复所需的副本数量。但需要注意的是,我们设计这个功能仅在需要变更时启动,而非长期运行,以避免产生不必要的数据冗余或错误。

image.png

多副本

Pulsar 本身提供了一个 Quorum 机制来确保数据的安全性和可靠性,这主要涉及到三个关键参数:

● Ensemble Quorum:指的是当某个 Topic 需要写入数据时,必须选择的 BK 节点数量。只有当选择的 BK 节点数量大于或等于 Ensemble 设定的值时,Topic 才能正常写入数据。

● Write Quorum:这个参数决定了在 Ensemble 中选择多少个节点来写入数据。例如,如果 Ensemble 设定为三个节点,而 Write Quorum 选择两个节点,那么系统会从这三个节点中选择两个进行数据写入。

● Ack Quorum:数据写入完成后,需要等待足够数量的节点发送确认(Ack)信号,只有当收到这么多 Ack 后,系统才会向客户端报告写入成功。

image.png

在讨论 BK 节点写入数据的流程中,我们更关注 Ensemble Quorum参数。如果我们设定 Ensemble 为3,那么系统会选择3个 BK 节点进行写入。Pulsar 的设计特点是采用条带化写入方式,这意味着同一条消息会被分别写入不同的 BK 节点。例如,如果 Write Quorum 设定为2,那么同一条消息的一部分会写入第一个和第二个 BK 节点,下一条消息会写入第二个和第三个BK节点,以此类推,这种方式可以确保所有BK节点的负载均衡,并充分利用每个BK节点的能力。

总的来说,这是我们通过利用Pulsar的多副本功能来提供数据的安全性和可靠性的方式。

机架感知

这个模型相当于我们有三个区域,每个区域都有两个存储节点,所以总共有六个节点。为了确保数据的高可用性,我们需要保证每一条信息都至少在两个区域有备份。但是,如果我们不进行特定设置,有可能会出现一条信息的两个备份都存储在同一个区域的情况。这样,如果该区域出现故障,这条信息就会完全丢失。

因此,我们需要控制信息的写入方式,确保每个信息的两个备份都分布在两个不同的区域。Pulsar的存储节点机架感知功能就提供了这样的能力。

在设计时,我们将每个可用区看作是一个机架,因此有三个可用区就相当于有三个机架。当我们设定参数时,如果选择“332”模式,那就意味着有6个存储节点。如果一个区域失效,就只剩下4个节点。在理论上,此时的最大副本数可以设为4,但通常建议设为2或3,具体取决于你的副本策略是“221”还是“332”。

关于机架感知,关键参数region感知开关应让其保持关闭状态,因为我们没有多个区域,所以这样设置较为简便。

另一个关键参数是最小机架数,这个参数能确保每条信息的副本都分布在多个机架上,机架在这里对应着我们的可用区。例如,如果我们想要信息至少分布在两个区域,那就将最小机架数设为2。这样,即使三个可用区中有一个发生故障,也能确保所有消息都仍然至少剩下一份副本可用。这些设置与Pulsar的多副本功能和机架感知功能相配合,共同实现了存储节点的多区域可用性。

延伸:跨地区同步

接下来,我将介绍一下我们未来要提供的能力,主要是跨地区同步。

image.png

跨地区同步对用户来说,就像在广州和上海各购买了一个服务实例,并将这两个实例联动起来。联动后,两个实例的元数据和消息会进行双向同步。如果用户的业务主要在广州,那么通常他们会直接通过广州本地的服务进行访问。但如果广州的服务出现故障,我们可以通过域名解析切换,让用户通过另一条路径访问到上海的服务。

由于上海的服务一直与广州保持数据同步,虽然可能会有一定的延迟,但大部分数据都可以恢复。只有一种极端情况,就是在切换时,广州可能堆积了一些未处理的消息,这些消息在上海可能无法及时消费。这时,只能等待广州的服务恢复后,再切换回去重新消费这些消息。

对于用户来说,如果想要访问其他地区的服务,比如上海,他们需要使用云联网等云上策略。但这种方式需要接受跨地区的时延,国内地区间的时延通常是几十毫秒,而跨半个地球的时延可能达到两三百毫秒。

关于跨地区时延的影响,主要分为元数据和消息同步两个方面。元数据主要涉及Topic的创建和消费等场景。一般来说,Topic不会频繁变更。如果在灾难切换时有Topic创建且未同步,可能需要人工到远端集群创建topic,或者制定灾难场景下的快速应急预案。

此外,还有一些特殊业务场景,如跨境电商,需要在全球多个地区进行交易,但离线报表需要汇总到国内处理。这时,可以在不同地区部署服务实例,并将数据同步到国内进行报表处理。同时,各地区的在线业务订阅和离线订阅也可以实现全球多地区的联动。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(3)

1.需求分析: 我们现在已经能够让这片地形出现在任意地方,只要角色走在这片地形上,就能够产生痕迹,但这片区域总是需要人工指定,又无法把这片区域无限扩大(显存爆炸),因此尝试使角色无…

DS:堆的结构与实现

欢迎来到Harper.Lee的学习世界!博主主页传送门:Harper.Lee的博客主页想要一起进步的uu可以来后台找我哦! 一、堆的概念与结构 1.1 堆的概念 堆(Heap)是完全二叉树中的一种,分为大根堆和小根堆。 特点&#…

LabVIEW与Python的比较及联合开发

LabVIEW和Python在工业自动化和数据处理领域各具优势,联合开发可以充分发挥两者的优点。本文将从语言特性、开发效率、应用场景等多个角度进行比较,并详细介绍如何实现LabVIEW与Python的联合开发。 语言特性 LabVIEW 图形化编程:LabVIEW使用…

Element-UI入门

目录 1.什么是Element-UI 2.作用 3.版本历史 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.代码示例 7.未来展望 8.总结 1.什么是Element-UI Element-UI 是由饿了么前端团队开发的一套基于 Vue.js 的桌面端组件库。提供了一整套 UI 组件,使开发者能够快速构…

C语言笔记第13篇:自定义类型(联合union和枚举enum)

1、联合体 1.1 联合体类型的声明 像结构体一样,联合体也是由一个或多个成员构成,这些成员可以是不同的类型。 但是编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用一块内存空间,所以联合体也叫&#xff1a…

KEIL5如何打开KEIL4的GD工程

GD官方提供的很多KEIL例程为KIEL4的版本,读者使用的时候可能会碰到使用KEIL5打开KEIL4的工程会报错以及无法找到芯片选型的问题,具体表现如下图所示。 我们该怎么办呢? 下面为大家介绍两种方法: 第一种方法是在keil4的工程后缀u…

MySQ中CONCAT函数使用

在MySQL数据库管理系统中,处理和连接字符串是一项常见的操作。本文将介绍几个常用的字符串连接函数,包括CONCAT(), CONCAT_WS(), GROUP_CONCAT()以及其他相关函数,这些功能可以极大地简化数据库查询中的字符串操作。 1. CONCAT() 函数 CONC…

19、Go Gin框架集成Swagger

介绍: Swagger 支持在 Gin 路由中使用一系列注释来描述 API 的各个方面。以下是一些常用的 Swagger 注释属性,这些属性可以在 Gin 路由的注释中使用: Summary: 路由的简短摘要。Description: 路由的详细描述。Tags: 用于对路由进行分类的标…

掌握SVG基础:从零开始学习

格栅图可以实现图片的清晰显示,但这也意味着如果要在各种设备上使用格栅图,就会增加大量不同规格的格栅图,以适应各种尺寸的设备。这也直接导致资源文件体积的增加,矢量图没有这个问题。本文将SVG代码编写与即时设计工具相结合&am…

五款软件推荐:U盘数据不小心删除了?帮你快速找回!

U盘数据不小心删除了怎么恢复?U盘是一种便携式存储设备,因其小巧轻便而广受欢迎。但是,U盘也常常会遇到数据丢失的问题。当U盘数据丢失时,需要找到一款可靠的数据恢复软件来恢复数据。 接下来为大家推荐5款好用的免费U盘数据恢复软…

Soildworks学习笔记(一)

1.如何添加M3,M4等螺丝孔: 有时候异形孔向导显示灰色是因为没有退出草图选项卡,选择异形孔向导就可以进行异形孔的设定和放置: solidwork放置螺丝孔以及显示螺纹的问题_.16-m3 solidwork-CSDN博客 2.如何修剪线条: 如何倒圆角或…

【AI基础】第四步:保姆喂饭级-langchain+chatglm2-6b+m3e-base

在第三步手动安装chatglm2-6b时,已经可以通过web进行交互。langchain重新封装了一下AI框架,提供更加友好的开发功能,类似于AI届的spring框架。langchain的安装过程也类似于上一步说的:【AI基础】第三步:纯天然手动安装…

LabVIEW 用于 MES 系统和卡钳上位机检测

LabVIEW 确实可以用于制造执行系统(MES)的开发以及卡钳上位机检测。以下是详细说明: 使用 LabVIEW 开发 MES 系统 数据采集与处理:LabVIEW 擅长实时数据采集和处理,可以连接多种传感器和设备,获取生产线上…

在线按模板批量生成文本工具

具体请前往:在线按模板批量生成文本工具

AIGC作答《2024年高考作文|新课标I卷》能拿多少分?

AIGC作答《2024年高考作文|新课标I卷》能拿多少分? 一、前言二、题目三、作答 一、前言 如火如荼的2024年高考圆满落幕,在如此Happy的时刻,AIGC技术正以其前所未有的热度席卷全球。它不仅改变了我们获取信息的方式,也…

Web IDE 在线编辑器综合实践(Web IDE 技术探索 三)

前言 前面两篇文章,我们简单讲述了 WebContainer/api 、Terminal 的基本使用,离完备的在线代码编辑器就差一个代码编辑了。今天通过 monaco editor ,来实现初级代码编辑功能,讲述的是整个应用的搭建,并不单独针对monac…

6.9总结

Vue生命周期 生命周期:指一个对象从创建到销毁的整个过程生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期的方法(钩子) mounted:挂载完成,Vue初始化成功,HTML渲…

找出链表倒数第k个元素-链表题

LCR 140. 训练计划 II - 力扣(LeetCode) 快慢指针。快指针臂慢指针快cnt个元素到最后; class Solution { public:ListNode* trainingPlan(ListNode* head, int cnt) {struct ListNode* quick head;struct ListNode* slow head;for(int i …

Java Web学习笔记29——Vue路由

Vue路由: 前端路由:点击菜单栏,地址栏会发生变化,会显示对应的组件。 URL中的Hash(#号后面的部分)与组件之间的对应关系。 Hash是/dept,那么就是部门管理组件; Hash是/emp, 那么…

计算机网络简答题

第一章 计算机网络 1.因特网是一个世界范围的计算机网络,记一个互联了遍及全世界的计算机设备的网络。 2.计算机网络将众多分散的、自治的(一台坏了不影响其他)计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 3.计算机网络的组…