业务需求
在集群规模小,接入服务不多的情况下,我们一般都是通过命令或者客户端API的方式去运维Kafka,随着集群规模的增加,手动去运维的方式不利于我们统一运维Kafka集群和对接入服务进行管理。且对于高可用来说,缺少了很多例如:监控,告警,服务自愈等功能。
本文会先介绍一版“能用”的Kafka运维平台应该具备什么功能
功能需求
集群管理
从Kafka集群开始,也是平时开发接入的入口,我们知道Kafka集群由两部分组成
- broker
- zookeeper
从Kafka的角度来说,并不太关注zookeeper相关的数据,或者说应该由类似于zookeeper运维平台去关注,不过由于Kafka元数据存储在zookeeper,后续监控数据需要根据zookeeper去获取,所以平台上也是需要记录zookeeper地址。
所需功能:
- 集群地址,用于连接kafka
- zookeeper,用于获取kafka元数据
- 集群节点概况
数据来源:
- 管理平台数据
- Broker数据
Topic管理
主题-Topic
Topic与集群是被包含的关系,逻辑视图上没有提现,但是在系统上要体现这一点。日常开发中,与Kafka的交互都是通过Topic,基本也是运维平台最核心的一块。
分区-Partition
Topic在Kafka中是个逻辑概念,实际交互是通过来确定交互对象的,所以也是一个主题的并发的上限。因此在对主题进行管理时,从创建时指定分区、调整分区,再到运维过程中需要的对分区进行分配、重平衡,这些功能都需要包含在内。
相关API:
KafkaAdminClient.createPartitions 增加分区
KafkaAdminClient.alterPartitionReassignments 调整现有分区/副本,2.4新增
副本-Replica
除了分区之外,还有一个副本的概念,由一个主副本和多个从副本组成,Kafka通过多副本实现系统的高可用,对外交互的只有主副本,一般我们需要保证消息不丢失的情况,会将消息写到主副本后,并不返回消息写成功,而是等待其他从副本拉取主副本数据后再返回成功,保证所有副本都存在所有数据。管理功能需要包含副本调整
相关API:
KafkaAdminClient.createPartitions 增加分区
KafkaAdminClient.alterPartitionReassignments 调整现有分区/副本,2.4新增
消息
消息不停从生产端写入,而后被消费端读取,我们需要知道消息有没有写到broker,和提供消费回溯的能力
功能:
- 消息查询
kafka是没有直接查询消息的API的,所以需要创建消费者,通过seek指定partition的offset,进而消费一定数据进行返回
相关API:
KafkaConsumer.offsetsForTimes 时间转换offset
KafkaConsumer.assign 分配分区
KafkaConsumer.seek 设置分区offset
- 消息回溯:
和消息查询基本一致,有几点差异:
- 消息回溯创建消费客户端时groupId与需要回溯的消费客户端相同
- 需要获取需要回溯Topic下的所有partition进行seek
- 需要提交重置后的offset
相关API:
KafkaAdminClient.listConsumerGroupOffsets 获取消费组所有订阅的分区和offset
KafkaConsumer.offsetsForTimes 时间转换offset
KafkaConsumer.assign 分配分区
KafkaConsumer.seek 设置分区offset
KafkaConsumer.commitSync 提交offset
监控告警
监控数据来源
除了与Kafka相关的功能性需求,运维平台必不可少的就是监控和告警,监控数据来源于Kafka的三端,都提供了JMX获取监控数据,通过任务定时抓取监控点数据。
告警规则
根据定时抓取到的监控点数据,配置告警规则,在达到预设阈值时,将告警信息推送到相关人员。
最后
在介绍了Kafka运维平台相关功能设计之后,相信大家也对运维平台有了一定的了解,当然这也只是达到“能用”的程度,还有很多功能未曾提及,例如,多租户的实现;管理相关的工单、审批;生产端、消费端相关功能;多集群备份、迁移等等。
写这类文章很难把握尺度,怕写少了不明白,写多了停不下来,(huoxu)以后有时间再写吧,感谢阅读。