数据可靠性
Kafka 集群维度的数据可靠性也是通过副本来实现的,而副本间数据一致性是通过 Kafka ISR 协议来保证的。
ISR 协议的核心思想是:通过副本拉取 Leader 数据、动态维护可用副本集合、控制 Leader 切换和数据截断 3 个方面,来提高性能和可用性。
动态维护可用副本集合
怎么判断副本有异常呢?从技术实现来看,一般通过两种策略来判断。
- 副本所在节点是否宕机,如果副本的节点挂了,就认为这个副本是不可用的。那如何判断副本的节点挂了呢?那就是节点的心跳的探活机制。
- 副本的数据拉取进度是否跟不上 Leader,即副本来 Leader Pull 数据的速度跟不上数据写入 Leader 数据的速度。此时如果 Follower 一直追不上 Leader,这个 Follower 就会被踢出 ISR 集合。支持按照时间来判断落后情况,比如 Follower 落后 Leader 多久,则表示 Follower 跟不上 Leader。当然,这是一个配置,可以调整。
控制 Leader 切换和数据截断
Leader 切换的触发条件一般是节点的心跳探活失败后,由 Controller 或者元数据存储服务来触发的。
按照最终一致和多数原则,如果有 2 个副本 A 和 B 写入成功后,就会告诉客户端数据写入成功。此时,如果这两台节点同时挂掉,就会有 C 节点成为 Leader 和 C 节点不成为 Leader 两种场景。
在 Kafka 的实现中,这两种情况都是支持的,支持在 Topic 维度调整配置来选择这两个操作。所以 Kafka 的 ISR 协议的很大一部分工作,就是在代码层面处理 Leader 切换、数据阶段的操作。
安全控制
Kafka 支持 TLS/SSL 进行数据加密传输,和 RocketMQ 是一样的,都是 Java 代码的标准用法。
Kakfa 对资源的管控粒度是比较细的,主要支持对 Topic、Group、Cluster、TransactionalId、DelegationToken、User 等 6 种资源进行控制。
此文章为11月Day25学习笔记,内容来源于极客时间《深入拆解消息队列 47 讲》