在 Apache Kafka 中,ISR 的全称是 In-Sync Replicas,中文通常翻译为“同步副本集”。
简单来说,ISR 是 Kafka 为了保证数据高可靠性和高可用性而维护的一个“健康副本池”。它是 Kafka 副本(Replication)机制中的核心概念。
为了让你更直观地理解,我为你整理了以下核心要点:
1. 核心定义 📖
在 Kafka 的每个分区(Partition)中,数据会有多个副本,分为 Leader(领导者) 和 Follower(追随者)。
● Leader:处理所有的读写请求。
● Follower:被动地从 Leader 拉取数据,进行同步。
ISR 就是指那些与 Leader 保持“充分同步”的副本集合。 这个集合是动态的,不仅包含 Leader 自己,也包含那些“紧跟” Leader 步伐的 Follower。
2. ISR 的工作机制 ⚙️
ISR 不是一个静态列表,而是一个会根据网络状况和 Broker 负载自动伸缩的集合:
● 加入 ISR(In-Sync): 当一个 Follower 启动后,如果它能持续、及时地从 Leader 拉取数据并写入本地日志,Leader 就会认为它是同步的,并将其纳入 ISR 列表。
● 移出 ISR(Out-of-Sync): 如果某个 Follower 因为网络延迟、Broker 负载过高或宕机,导致它在一定时间内(由参数 replica.lag.time.max.ms 控制,默认 30 秒)没能拉取数据或落后太多,Leader 就会把它踢出 ISR 列表。
3. ISR 的关键作用 🛠️
ISR 机制主要解决了分布式系统中“一致性”与“可用性”之间的矛盾:
● 数据不丢失(高可靠性):
当生产者(Producer)发送消息时,如果设置 acks=all (或 acks=-1 ),Kafka 会等待 ISR 中的所有副本都成功写入消息后,才向生产者确认收到。这意味着只要 ISR 中有一个副本存活,数据就不会丢失。
● 故障自动
转移(高可用性):
如果当前的 Leader 挂了,Kafka 的控制器(Controller)会从 ISR 列表中选举一个新的 Leader。因为 ISR 中的副本都是与原 Leader 同步的,所以新选举出的 Leader 拥有最新的数据,服务可以无缝衔接,不会造成数据丢失。
4. 核心参数与权衡 ⚖️
Kafka 允许你通过参数在“性能”和“可靠性”之间做选择:
你可以把 ISR 想象成一个“预备役委员会”:
● 只有表现好、跟得上 Leader 节奏的 Follower 才能进这个委员会(ISR)。
● 一旦 Leader “牺牲”(宕机),就立刻从这个委员会里提拔一个新的 Leader 接班。
● 这样既保证了数据的安全(接班人数据是最新的),又不会因为某个慢节点拖慢整个系统的写入速度。