导语
由 StreamNative 主办的 Pulsar Meetup Beijing 2023 在2023年10月14日完美落幕,本次活动大咖云集,来自腾讯、滴滴、华为、智联招聘、RisingWave 和 StreamNative 的行业专家们一起,深入探讨 Pulsar 在生产环境中的最佳应用实践,共享 Pulsar 社区的最新发展和动态。
本次 Meetup,腾讯云高级工程师林宇强为大家带来了议题为《Apache Pulsar 在腾讯云上的最佳实践》的精彩演讲,接下来的篇幅将从系统架构、设计思路、寻址服务、跨集群迁移、跨地域容灾几个方面详细为大家介绍 Apache Pulsar 在腾讯云上的最佳实践。
Pulsar 系统架构
上图是一个很常见的 Pulsar 部署架构,ZK 采用了腾讯云 TSE ZK;对接内部的配置中心、CICD 平台可以实现标准化部署,其余的 Bookie 和 Broker 和开源自建的部署模式差别不大。
这里需要介绍下腾讯云自研部分的诊断三件套:Metrics,Trace,日志采集。
Metrics:Broker 自研采集→上报 Monitor 集群 Topic →Pulsar Sink 聚合预处理→腾讯云监控。这里值得说明的是我们在 Broker 和云监控之间加了一层 Pulsar Broker 集群(Monitor 集群)作为缓冲,并使用 Pulsar 自带的 Sink 来进行 Metrics 数据的预处理,因为该监控链路是地域级别,比如广州地区只部署一套,而对外提供业务服务的 Broker 集群数则规模较多,总的 Topic 数规模大,故而需要中间增加一层来缓解对云监控的压力,这是量变引发质变的结果。
Trace:Broker 自研采集→Trace 日志→Filebeat 上报→APM,这也是演进的结果。原先的架构是 Skywalking 采集→内存排队上报→APM,这种架构看似简单,但是当 Broker 的流量规模到达一定程度时,Trace 产生的速度高于上报的速度,导致内存不断增长进而 OOM,因此 Trace 最终也是回归原始,放弃 Skywalking,利用磁盘承受住短时的洪峰。当然,也有一部分业务持续高流量,造成上报永远追不上 Trace 日志的产生,这种情况下也只有两种做法:对于对消息轨迹不强求的业务,关闭 Trace 上报;对于流量大并且对轨迹仍然有要求的,只能通过升配的方式,调大 Filebeat 的可用核心数硬抗。
CLS日志采集:Metrics 和 Trace 由于和 Broker 自身的逻辑有强耦合,我们只能针对 Broker 进行定制化开发。但是日志采集是个普适性功能,因此我们直接采用腾讯云 CLS 来实现我们的目的:日志采集汇总,根据环境、地区、集群分类,关键字监控,日志长时间存档,关键字告警等。
Lookup Service:Lookup Service 是个地域级别的模块,每个地区只部署一套,用于同一个地区所有 Broker 集群的路由、寻址功能,这个模块后续会重点介绍。
设计背景及思路
介绍完 Pulsar 系统架构,接下来介绍一下我们在腾讯云场景下所面临的问题及解决思路。
容器化
虽然 Pulsar Broker 可以称作为云原生消息队列,但是实际上,Broker在运行时是有状态的,比如:Topic 和 Broker 之间的归属关系。
因此我们在进行容器化的时候,整体的思路就是让 Pod 和 VM 尽可能划上等号,于是我们做了以下设计:
Topic 规模大
Topic 数多会引发以下问题:
产品形态多样
腾讯云 Pulsar 目前提供两种产品形态,对应底层就是部署架构的多样性,当然,这会对应最终每个实例的售卖价格和腾讯云本身的成本。
接入方式
腾讯云 Pulsar 提供了多种网络接入方式,网络接入即 Broker 和 Client 之间的网络连通关系。
内网接入在本质上和常规的公司内自建使用类似,Broker 和 Client 都处在同一个内网之中,且二者之间是完全互通的,Client 连接的 IP 也都是 Broker 的节点原始 IP,无任何网络转换。
VPC 即虚拟私有网络,每个用户可以创建多个VPC,每个VPC下又可以创建多个子网。想了解更多可查看:https://cloud.tencent.com/document/product/215/20046。
两个 VPC 之间通常是无法互通的,比如图上的10.0.0.0/8和192.168.0.0/16,除非使用云联网、对等连接等 VPC 之间的互通产品,但是这个不在我们的讨论范围。
如图所示,Broker 部署在10.0.0.0/8,而 Client 在192.168.0.0/16,那么这时候,Client 想要访问 Broker 就变得不可能。
在云网络场景,VPC 提供了云虚拟网关(仅内部组件)来支持两个 VPC 之间的互通,我们便称之为跨网络平面互通。
当然,其本质就是做网络映射,比如:
这也就是 Pulsar 这个服务在云服务场景所要面对的问题。
前面介绍了 VPC 接入,其实公网接入和 VPC 接入也是类似的。
唯一的差别是:
寻址服务
下面我们来介绍下腾讯云的寻址服务的思路来源,也是寻址服务的价值所在。
RocketMQ 架构参考
我们看下 RocketMQ 的服务,其架构分为 NameServer 和 Broker。
优缺点:
Pulsar 这样做部署架构简单,不会额外多出一个 NameServer 服务,但是同样也失去了 Topic 在物理集群之间的调度能力。
RocketMQ 虽然多出了一个模块,但是其提供的集群调度能力,是一种非常重要的运维能力。
这种调度能力,恰恰是云服务所需要的,有了这种调度能力,我们的云服务才能对集群有可运维性和灵活的资源调度方式。
多网络 Lookup
如前面所说,在云服务场景,针对 Pulsar Broker,我们需要提供的内网、VPC、公网三种网络接入场景,和 Pulsar Broker 本身提供的 Lookup 能力的矛盾。使用寻址模块,便有以下好处:
Lookup 时序
前面介绍了很多寻址模块和寻址流程,这里来重点介绍下 Pulsar-Client 的寻址时序,来补充下对前面的介绍,以及科普下 Pulsar Client 的机制:
这就是 Pulsar-Client 初始化一个 Producer/Consumer 的步骤。
我们的寻址模块切入点在哪呢?
就是第一和第二步,如图所示,在这两个步骤中间加入一层代理层,这样就可以在寻址返回结果上针对多网络接入、Topic 和物理集群从属关系调度上做一些篡改,以达到我们的目的。
集群间调度
上图是我们加入寻址模块后,Pulsar 架构上的改变,整个架构就变得和 RocketMQ 有点类似,有一个中央元数据服务用来管理 Topic 资源和物理计算资源之间的关系。
跨集群迁移
前面铺垫了这么多,介绍了寻址模块以及架构上的优化,接下来介绍下在此之上我们所做的产品化能力——跨集群迁移。
跨集群迁移特指一个租户从物理集群1迁移到物理集群2,两个集群同时提供服务,在线热切换,Client 轻微感知。
如图所示,整个流程也很简单,寻址服务保存了租户和物理集群的路由关系,路由关系一变更,即集群迁移变更。
基于 Pulsar Lookup 寻址的协议,路由关系的切换粒度可以做到租户粒度、Namespace 粒度、Topic 粒度、分区粒度。
切换的方式:路由切换+Topic unload
机制上来说,这个切换流程很简单,难点在前置准备工作上:
消息同步
消息同步比较简单,我们采用了 Pulsar 自带的 GEO-Replicator 功能,这里不再赘述。
进度同步
这里简单介绍下进度同步的机制。
跨地区容灾
地区容灾,也是我们基于寻址服务的架构改进后,所开发出的产品化能力。
本质和跨集群迁移类似,但是由于跨地区的网络时延问题,在侧重点上有所不同:
如图所示,假设我们的 Pulsar 实例在广州地区,Client 也在广州地区,但是由于不可抗力,导致广州地区的 Pulsar 实例全部宕机,并且短时间内无法迅速恢复,我们可以暂时将 Client 的流量切到上海地区的容灾实例,来保证 Client 在线业务的迅速恢复。
该方案是面对地区级别灾难场景下的容灾,因为每个地区本身已经是多可用区部署(同城多机房),因此整个地区不可用的概率较低,因此跨地区容灾的整个产品设计侧重主要用于应急,而不是为了像跨集群迁移一样的热切换,需要做到非常严格的双向同步。
总结
我们先从腾讯云 Pulsar 的整体架构讲起,介绍了在腾讯云的场景下所需要面对的问题,引出了寻址模块(Lookup Service),并介绍了寻址模块的引入对于 Pulsar 的部署架构上的优化。随后介绍了 Lookup Service 解决的两个核心问题:多网络 Lookup 和集群间调度,并保证对客户端接入的无感知和对架构的低侵入性。由于寻址模块的存在,我们便能基于它做进一步的产品化能力,跨集群迁移和跨地区容灾,从而能够在不同级别的灾难场景下都能提供相应的修复措施和运维能力。
未来,我们还会继续在容灾能力、Pulsar 周边生态对接、存储优化等方面继续努力,以提供成本更低、稳定性更高的 Pulsar 产品。