Pinterest 是一个进行图片分享的社交站点。他们使用 Kafka 作为中心化的消息传输工具,用于数据摄取、流处理等场景。随着用户数量的增加,Kafka 集群也越来越庞大,对它的管理日趋复杂,并变成了运维团队的沉重负担,因此他们研发了 Kafka 集群自愈和工作负载均衡工具 DoctorKafka,最近他们已经在 GitHub 上将该项目开源。
根据 Pinterest 的数据工程师 Yu Yang 的博客文章介绍,该网站已经有 1.75 亿以上的用户,Pin 图片的数量超过了 1000 亿,目前,他们在云端运行了 1000 个以上的 Kafka broker。
在这样的规模下,每周他们都会遇到 Kafka broker 的故障,有时候一天之内就会遇到好几次。当 broker 出现故障时,待命的工程师需要及时将已经处于死亡状态的 broker 替换掉,从而尽可能减少数据丢失的风险。他们有时候还需要在 broker 之间转移工作负载,以保证整体负载的均衡。在替换 broker 和重新平衡工作负载时,需要非常小心地创建和编辑分区重分配文件(partition reassignment file)并手动执行 Kafka 脚本命令。这些操作会明显增加团队的负担。
为了扩展 Kafka 服务的运维规模,Pinterest 构建了 DoctorKafka,这是一项 Kafka 集群自愈和工作负载均衡的服务。DoctorKafka 能够探测到 Kafka broker 的故障并自动将故障 broker 的负载转移给健康的 broker。现在,Pinterest 已经在 GitHub 上将该项目开源。
高层架构
DoctorKafka 由三部分组成,如下图所示:
图 1 DoctorKafka 的高层架构
图 2 DoctorKafka 的前端页面
图 3 DoctorKafka 的集群视图
需要注意的是,DoctorKafka 只会采取有把握的操作,对于不确定的情况,它会给出告警。
DoctorKafka 的实际运行过程
每个 broker 上都会运行一个指标收集器,它会收集 Kafka broker 输入和输出的网络流量指标以及每个副本(replica)的状态。图 4 展现了指标收集器所收集的 broker 的部分状态。即便采用副本配额配置(replication quota setting,在 Kafka 0.10.1 之后可用的特性),主题分区的重分配通常也会带来额外的网络流量并且会影响到指标,因此,指标收集器在收集指标时会明确报告某个主题分区正在进行重分配。
图 4 指标收集器所收集到的 broker 状态
DoctorKafka 服务启动之后,它会首先读取 broker 最近 24 到 48 小时的状态,基于此,DoctorKafka 会推断每个副本工作负载所需的资源。因为 Kafka 工作负载主要是网络密集型的,DoctorKafka 主要关注副本的网络带宽使用情况。
DoctorKafka 在启动之后,会阶段性地检查每个集群的状态。当探测到 broker 出现故障时,它会将故障 broker 的工作负载转移给有足够带宽的 broker。如果在集群中没有足够的资源进行重分配的话,它会发出告警。与之类似,当 DoctorKafka 进行工作负载平衡时,它会识别出网络流量超出配置的 broker,并将工作负载转移给流量更少的 broker,或者是执行更优的领导者选举(leader election)方案来转移流量。
DoctorKafka 已经在 Pinterest 运行了数月之久,并帮助其运维人员管理着 1000 个以上的集群。现在,他们将其开源,对于 Pinterest 的工程师来说,开源是非常重要的事情。读者可以访问该项目的 GitHub 地址获取源码和相关文档。