作者:朱丹阳,腾讯云监控开发工程师
腾讯云消息队列 CKafka 简介
消息队列 CKafka(Cloud Kafka)是基于开源 Apache Kafka 消息队列引擎,提供高吞吐性能、高可扩展性的消息队列服务。消息队列 CKafka 完美兼容 Apache Kafka 0.9、0.10、1.1、2.4 版本接口,在性能、扩展性、业务安全保障、运维等方面具有超强优势,让您在享受低成本、超强功能的同时,免除繁琐运维工作。
产品特点:
- 收发解耦:有效解耦生产者、消费者之间的关系。在确保同样的接口约束的前提下,允许独立扩展或修改生产者 / 消费者间的处理过程。
- 削峰填谷:消息队列 CKafka 能够抵挡突增的访问压力,不会因为突发的超负荷的请求而完全崩溃,有效提升系统健壮性。
- 顺序读写:消息队列 CKafka 能够保证一个 Partition 内消息的有序性。和大部分的消息队列一致,消息队列 CKafka 可以保证数据按照顺序进行处理,极大提升磁盘效率。
- 异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
CKafka 基本概念和技术特征
01
基本概念
Producer 和 Consumer
- Producer (生产者):生产者即数据的发布者,该角色将消息发布到 Kafka 的 topic 中。broker 接收到生产者发送的消息后,broker 将该消息追加到当前用于追加数据的 segment 文件中。生产者发送的消息,存储到一个 partition 中,生产者也可以指定数据存储的 partition。
- Consumer (消费者):消费者可以从 broker 中读取数据。消费者可以消费多个 topic 中的数据。
Broker 与 Cluster
- Broker:Kafka 集群包含一个或多个服务器,服务器节点称为 broker。
- Cluster:多个 Broker 组成一个 Cluster。
Topic 与 Partition
- Topic:(主题)是一个逻辑的概念,就是作为消息的归类,每一条发送到 Kafka 的消息都有一个类别,这就是 topic。producer 负责将消息发送到特定的 topic(发送到 Kafka 集群中的每一条消息都必须指定一个 topic),而 consumer 负责订阅 topic 并进行消费。
- Partition:(分区)是物理的概念,每个 topic 包含一个或多个 Partition。一个分区只属于一个主题。
02
技术特征
高吞吐
消息队列 CKafka 中存在大量的网络数据持久化到磁盘和磁盘文件通过网络发送的过程。这一过程的性能直接影响 Kafka 的整体吞吐量,主要通过以下几点实现:
1. 高效使用磁盘:磁盘中顺序读写数据,提高磁盘利用率。
- 写 message:消息写到 page cache,由异步线程刷盘。
- 读 message:消息直接从 page cache 转入 socket 发送出去。
- 当从 page cache 没有找到相应数据时,此时会产生磁盘 IO,从磁盘加载消息到 page cache,然后直接从 socket 发出去。
2. Broker 的零拷贝(Zero Copy)机制:使用 sendfile 系统调用,将数据直接从页缓存发送到网络上。
3. 减少网络开销
- 数据压缩降低网络负载。
- 批处理机制:Producer 批量向 Broker 写数据、Consumer 批量从 Broker 拉数据。
数据持久化
消息队列 CKafka 的数据持久化主要通过如下原理实现:
- Topic 中 Partition 存储分布 在消息队列 CKafka 文件存储中,同一 Topic 有多个不同 Partition,每个 Partition 在物理上对应一个文件夹,用户存储该 Partition 中的消息和索引文件。例如,创建两个 Topic,Topic1 中存在 5 个 Partition,Topic2 中存在 10 个 Partition,则整个集群上会相应生成 5 + 10 = 15 个文件夹。
- Partition 中文件存储方式 Partition 物理上由多个 segment 组成,每个 segment 大小相等,顺序读写,快速删除过期 segment, 提高磁盘利用率。
水平扩展(Scale Out)
- 一个 Topic 可包含多个 Partition,分布在一个或多个 Broker 上。
- 一个消费者可订阅其中一个或者多个 Partition。
- Producer 负责将消息均衡分配到对应的 Partition。
- Partition 内消息是有序的。
Consumer Group
- 消息队列 CKafka 不删除已消费的消息。
- 任何 Consumer 必须属于一个 Group。
- 同一 Consumer Group 中的多个 Consumer 不同时消费同一个 Partition。
- 不同 Group 同时消费同一条消息,多元化(队列模式、发布订阅模式)。
多副本
多副本设计可增强系统可用性、可靠性。
CKafka 架构 & 监控指标
01
架构图 & 监控指标
相关概念:
- Broker:kafka 服务器
- Topic:消息类别
- Partition:物理上的概念,一个 Topic 可以包含多个 Partition
- Offset:消息在 partition 的唯一序号
- Producer:生产者,负责发布消息
- Consumer:消费者,负责消费消息
- Consumer Group:消费者分组,消费者标签,用于将消费者分类
- Zookeeper 集群:存储 meta 数据、leader 选举、故障容错等
02
全量指标列表
Period 为 60 秒和 5min
注:上方表格加粗的为核心指标
03
告警核心指标 & 最佳阈值
最佳实践
01
配置告警的核心指标及建议阈值
1. 消息服务 CKafka - 实例
磁盘使用百分比 > 80%
注:代表集群容量使用率,集群容量使用率达到 100% 会被写封禁,影响用户写入,所以需要用户注意提前扩容。
实例连接数百分比 > 80%
注:预防实例连接数过多,导致实例无法建立更多连接造成客户端无法访问 Ckafka 集群。
实例生产带宽百分比 > 80%
注:实例生产带宽百分比 (占用配额百分比),预防生产带宽过高,导致生产消息失败。
实例消费带宽百分比 > 80%
注:实例消费带宽百分比 (占用配额百分比),预防消费带宽过高,导致消费消息失败。
2. CKafka-Topic
Topic 生产流量 > 6000MB
注:按照所选择的时间粒度统计求和,需要根据需求来设置阈值的大小,预防消息生产速度过慢。
Topic 消费流量 > 6000MB
注:按照所选择的时间粒度统计求和,需要根据需求来设置阈值的大小,预防消息消费速度过慢,同时预防客户端出现 Rebalance。
3. CKafka-ConsumerGroup-Topic
主题级别未消费消息个数 > 100000
注:需要根据需求来设置阈值的大小,防止消费数据过慢,导致消息积压,预防业务中消费消息的实时性。
4. CKafka-ConsumerGroup-Partition
消费分组未消费消息数 > 100000
注:需要根据需求来设置阈值的大小,防止消费数据过慢,导致消息积压,预防业务中消费消息的实时性,同时预防客户端出现 Rebalance。
注意:如何避免客户端出现 Rebalance?
消息队列 Kafka 的 Consumer 没有独立线程维持心跳,而是把心跳维持与 poll 接口耦合在一起,如果用户消费出现卡顿会导致心跳超时,引发 Rebalance。
解决方案:
1. 尽量提高消费速度;
2. max.poll.records 设置小一点,这个参数是配置控制心跳的超时事件,可以由客户端自行设置;
3. session.timeout.ms 设置大一点,这个参数控制每次 poll 返回的最大消息数量。
02
如何在腾讯云监控中配置 Dashboard 和告警,高效发现问题
1. 配置告警
https://console.cloud.tencent.com/monitor/overview 进入腾讯云监控,选择告警配置下告警策略,并新建告警策略。
设置消息队列告警:
1. 输入策略名称
2. 输入备注
3. 选择策略类型
4. 选择消息队列 Ckafka 实例
5. 设置告警指标及触发条件
6. 选择告警渠道,包括接收对象,接收渠道,有效时段,接收语言
7. 保存
配置的 Ckafka 实例告警总览
2. 配置 Dashboard
腾讯云监控 Dashboard 提供了消息队列 CKafka 的预设面板,点击 https://console.cloud.tencent.com/monitor/overview 进入腾讯云监控,选择 Dashboard,然后选择预设 Dashboard 下的消息队列 CKafka 预设面板。
设置 CKafka 的 Dashboard:
1. 选择 CKafka 实例
2. 选择 CKafka-Topic
3. 选择 CKafka-ConsumerGroup-Topic
4. 选择 CKafka-ConsumerGroup-Partition
选择完 CKafka 实例,CKafka-Topic,CKafka-ConsumerGroup-Topic,CKafka-ConsumerGroup-Partition 之后,会自动展示出预设的 Dashboard。
消息队列 CKafka 预设面板 总览:
欢迎联系云监控小助手微信号,加群讨论:)