导语:本文介绍了腾讯云消息队列 CKafka 监控的最佳实践指南,帮助开发者免除繁琐的运维工做,并快速发现问题,提升工做效率。web
消息队列 CKafka(Cloud Kafka)是基于开源 Apache Kafka 消息队列引擎,提供高吞吐性能、高可扩展性的消息队列服务。消息队列 CKafka 完美兼容 Apache Kafka 0.九、0.十、1.一、2.4 版本接口,在性能、扩展性、业务安全保障、运维等方面具备超强优点,让您在享受低成本、超强功能的同时,免除繁琐运维工做。缓存
产品特色:安全
收发解耦:有效解耦生产者、消费者之间的关系。在确保一样的接口约束的前提下,容许独立扩展或修改生产者 / 消费者间的处理过程。服务器
削峰填谷:消息队列 CKafka 可以抵挡突增的访问压力,不会由于突发的超负荷的请求而彻底崩溃,有效提高系统健壮性。微信
顺序读写:消息队列 CKafka 可以保证一个 Partition 内消息的有序性。和大部分的消息队列一致,消息队列 CKafka 能够保证数据按照顺序进行处理,极大提高磁盘效率。网络
异步通讯:不少时候,用户不想也不须要当即处理消息。消息队列提供了异步处理机制,容许用户把一个消息放入队列,但并不当即处理它。想向队列中放入多少消息就放多少,而后在须要的时候再去处理它们。session

Producer 和 Consumer架构
Producer (生产者):生产者即数据的发布者,该角色将消息发布到 Kafka 的 topic 中。broker 接收到生产者发送的消息后,broker 将该消息追加到当前用于追加数据的 segment 文件中。生产者发送的消息,存储到一个 partition 中,生产者也能够指定数据存储的 partition。app
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。一个分区只属于一个主题。
高吞吐
消息队列 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 同时消费同一条消息,多元化(队列模式、发布订阅模式)。
多副本
多副本设计可加强系统可用性、可靠性。
[1] 架构图 & 监控指标

相关概念:
Broker:kafka 服务器
Topic:消息类别
Partition:物理上的概念,一个 Topic 能够包含多个 Partition
Offset:消息在 partition 的惟一序号
Producer:生产者,负责发布消息
Consumer:消费者,负责消费消息
Consumer Group:消费者分组,消费者标签,用于将消费者分类
Zookeeper 集群:存储 meta 数据、leader 选举、故障容错等
[2] 全量指标列表
Period 为 60 秒和 5min



注:上方表格加粗的为核心指标
[3] 告警核心指标 & 最佳阈值

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 返回的最大消息数量。
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 预设面板 总览:


《不要再乱下载JDK了:Elasticsearch在国产化ARM环境下的首个大坑》
《腾讯云中间件团队在Service Mesh中的实践与探索》

扫描下方二维码关注本公众号,
了解更多微服务、消息队列的相关信息!


本文分享自微信公众号 - 腾讯云中间件(gh_6ea1bc2dd5fd)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。