携程基于BookKeeper的延迟消息架构落地实践

一、背景

QMQ延迟消息是以服务形式独立存在的一套不局限于消息厂商实现的解决方案,其架构如下图所示。

QMQ延迟消息服务架构

延迟消息从生产者投递至延迟服务后,堆积在服务器本地磁盘中。当延迟消息调度时间过期后,延迟服务转发至实时Broker供消费方消费。延迟服务采用主从架构,其中,Zone表示一个可用区(一般可以理解成一个IDC),为了保证单可用区故障后,历史投递的待调度消息正常调度,master和slave会跨可用区部署。

1.1 痛点

此架构主要存在如下几点问题:

a)服务具有状态,无法弹性扩缩容;

b)主节点故障后,需要主从切换(自动或手动);

c)缺少一致性协调器保障数据的一致性。

如果将消息的业务层和存储层分离出来,各自演进协同发展,各自专注在擅长的领域。这样,消息业务层可以做到无状态化,轻松完成容器化改造,具备弹性扩缩容能力;存储层引入分布式文件存储服务,由存储服务来保证高可用与数据一致性。

1.2 分布式文件存储选型

对于存储服务的选型,除了基本的高可用于数据一致性特点外,还有至关重要的一点:高容错与低运维成本特性。分布式系统最大的特点自然是对部分节点故障的容忍能力,毕竟任何硬件或软件故障是不可百分百避免的。因此,高容错与低运维成本将成为我们选型中最为看重的。

2016年由雅虎开源贡献给Apache的Pulsar,因其云原生、低延迟分布式消息队列与流式处理平台的标签,在开源社区引发轰动与追捧。在对其进行相关调研后,发现恰好Pulsar也是消息业务与存储分离的架构,而存储层则是另一个Apache开源基金会的BookKeeper。

二、BookKeeper

BookKeeper作为一款可伸缩、高容错、低延迟的分布式强一致存储服务已被部分公司应用于生产环境部署使用,最佳实践案例包括替代HDFS的namenode、Pulsar的消息存储与消费进度持久化以及对象存储。

2.1 基本架构

BookKeeper基本架构

Zookeeper集群用于存储节点发现与元信息存储,提供强一致性保证;

Bookie存储节点,提供数据的存储服务。写入和读取过程中,Bookie节点间彼此无须通信。Bookie启动时将自身注册到Zookeeper集群,暴露服务;

Client属于胖客户端类型,负责与Zookeeper集群和BookKeeper集群直接通信,且根据元信息完成多副本的写入,保证数据可重复读。

2.2 基本特性

a)基本概念

Entry:数据载体的基本单元

Ledger:entry集合的抽象,类似文件

Bookie:ledger集合的抽象,物理存储节点

Ensemble:ledger的bookie集合

b)数据读写

BookKeeper数据读写

bookie客户端通过创建而持有一个ledger后便可以进行entry写入操作,entry以带状方式分布在enemble的bookie中。entry在客户端进行编号,每条entry会根据设置的副本数(Qw)要求判定写入成功与否;

bookie客户端通过打开一个已创建的ledger进行entry读取操作,entry的读取顺序与写入保持一致,默认从第一个副本中读取,读取失败后顺序从下一个副本重试。

c)数据一致性

持有可写ledger的bookie客户端称为Writer,通过分布式锁机制确保一个ledger全局只有一个Writer,Writer的唯一性保证了数据写入一致性。Writer内存中维护一个LAC(Last Add Confirmed),当满足Qw要求后,更新LAC。LAC随下一次请求或定时持久化在bookie副本中,当ledger关闭时,持久化在Metadata Store(zookeeper或etcd)中;

持有可读ledger的bookie客户端称为Reader,一个ledger可以有任意多个Reader。LAC的强一致性保证了不同Reader看到统一的数据视图,亦可重复读,从而保证了数据读取一致性。

d)容错性

典型故障场景:Writer crash或restart、Bookie crash。

Writer故障,ledger可能未关闭,导致LAC未知。通过ledger recover机制,关闭ledger,修复LAC;

Bookie故障,entry写入失败。通过ensemble replace机制,更新一条新的entry路由信息到Metadata Store中,保障了新数据能及时成功写入。历史数据,通过bookie recover机制,满足Qw副本要求,夯实了历史数据读取的可靠性。至于副本所在的所有bookie节点全部故障场景,只能等待修复。

e)负载均衡

新扩容进集群的bookie,当创建新的ledger时,便自动均衡流量。

2.3 同城多中心容灾

上海区域(region)存在多个可用区(az,available zone),各可用两两间网络延迟低于2ms,此种网络架构下,多副本分散在不同的az间是一个可接受的高可用方案。BookKeeper基于Zone感知的ensemble替换策略便是应对此种场景的解决方案。

基于Zone感知策略的同城多中心容灾

开启Zone感知策略有两个限制条件:a)E % Qw == 0;b)Qw > minNumOfZones。其中E表示ensemble大小,Qw表示副本数,minNumOfZones表示ensemble中的最小zone数目。

譬如下面的例子:

minNumOfZones = 2
desiredNumZones = 3
E = 6
Qw = 3
[z1, z2, z3, z1, z2, z3]

<< · Back Index ·>>

发表回复

相关推荐

钱满素|美国底层为何不去推翻资本主义制度

经典问答一:美国底层为何不去推翻资本主义制度

· 4秒前

打麻将幽默语录经典语录

系统整理起来。我花了很多时间精力去做这件事:开了一个微信公众号,计划更新1000个口才情商技巧,非常值得反复阅读,现在已 ...

· 14秒前

段苏权83年到重庆,望着战友王光泽骸骨上的脚镣,忍不住泪流满面

解放后,起义将领田冠五曾与贺老总聊起了当年杀害王光泽的往事,曾痛哭流涕的表示悔恨,而贺老总却很大度的摆了摆手:

· 23秒前

銀行承兌匯票和商業承兌匯票的區別,尤其是這7個,知道都不簡單

銀行承兌匯票和商業承兌匯票的區別,尤其是這7個,知道都不簡單,銀行承兌匯票與商業承兌匯票均是商業匯票,其二者的區別還是...

· 33秒前

被虐待的寵物:長耳兔變剪耳兔

剪掉部分耳朵的寵物兔,真的能搖身一變成為售價較高的美洲侏儒兔?近日,海口兔子百貨出售的寵物兔疑似被剪去部分耳朵。買傢...

· 42秒前