kafka 复制集——概念模型

背景

在读完kafka官方文档,kafka设计里的消息交付语义一章后,给我的第一印象是内容很抽象,于是草拟和总结了给个副标题,并把相关内容进行了归类;有些生涩的句子,尽量用大白话和举例进行说明,并加入了总结。 英文链接:kafka.apache.org/documentati...

kafka 复制集的作用

kafka 复制集,是kafka 中间件 "服务高可用""数据高可靠" 的基石。复制集,背后的思想,还是利用了冗余来提高 服务的可用性和数据的可靠性。

(PS:从业多年,在生产环境经历了集群中一台broker停机,且还能让生产者和消费者无感切换,并且数据不丢的经历,只有一次。kafka中间件服务不可用和数据不丢失的情况,在实际的生产环境里, 发生的概率其实挺低的;如果kafka集群经常发生上面的情况,要么是使用姿势不对,要么是broker端的设置有问题。)

kafka 复制集在任何情况下,都能保证服务高可用,数据高可靠吗?

我的回答是,否定的。不要神话"服务高可用","数据高可靠"。所谓的高可用,高可靠,都是有一定的前提条件的。

kafka稳定运行依赖底层的网络,依赖宿主机,也依赖电力,更依赖自身运行环境。连阿里云都宕了,还要求我 全部部署在上面的kafka提供服务,除非是提供了kafka的混合云部署。

所以:kafka 数据的高可靠和不丢失,除了依赖自身的硬件和软件因素,还需要靠复制集(冗余)来保证的。它高可靠和数据不丢失的前提(抛开那些硬件和软件因素)是:只要还有ISR的复制集,就能保证数据不会丢失,并且是可靠的。 (PS:mysql 数据的高可靠和不丢失;主要是靠数据存储到磁盘上来进行保证的。它高可靠和数据不丢失的前提是:磁盘不坏,mysql是能保证数据不丢失的。

redis 虽然提供了数据不丢失的选型;但我想没人去用吧,我们用redis 主要还是看中了它飞快的读取速度,而一般不会用它当做持久化存储。所以存储在redis里的数据, 一般是不保证数据的高可靠和不丢失的。)

主从,主分区(leader partiion) ,跟随者分区(follower paritiion),

主从

kafka 服务节点(broker节点)并没有主从之分,主从的概念是针对topic下的某个partition。对于存储的单位,宏观上来说就是分区,通过分区散落在各个节点的方式的不同,可以组合出各种各样的架构图。 1个主题,3个分区,3个副本分区的架构图

主分区

图中绿色部分为 主分区。kafka生产端只会往leader分区发送数据,消费端只会往leader分区消费数据

follower分区

图中浅蓝色部分为 follower分区。follwer分区,在主分区的broker能提供服务时,不对外提供读写能力,只会从leader分区拉取数据,尽量保证自身数据和leader保持同步。

这种非传统(主机维度的主备)方式的主从设计,理论上可让集群中的每台机器都能对外,提供读写能力,并且尽量发挥出每台机器的计算能力和存储能力。

同步复制集(ISR);Unclean leader

ISR(in sync replica):

处于同步状态的分区。一个follower分区,如果和leader 分区上的数据,保持同步,则称为ISR分区。

非ISR分区:

由于broker端的处理能力,机器的不同,或者网络的原因等,并不是所有的follower分区,都能赶上leader 分区的数据。如果某些follwer 分区落后leader 分区的数据太多,则broker会标记该分区为非ISR分区。

Unclean leader:

当leader分区所在broker不能提供服务的时候,kafka会把ISR中的分区,选择一个出来做为leader分区。如果运气不好 ISR中的分区,也都宕了,让非ISR中的分区,成为了leader分区,我们就称为Unclean leader;因为这样的分区选择为leader分区对外提供服务,意味这存储在broker上的最新消息,已经丢失了。

Kafka对数据丢失的保证是基于至少一个保持同步的follwer分区。如果复制分区的所有节点都失效,则此保证不再有效。当所有复制分区都失效时,一个实用的系统需要做一些合理的事情。如果你运气不好,发生了这种情况,那么有两种选择:

  • 等待ISR中的一个复制副本复活,并选择此复制副本作为领导者(希望它仍然拥有所有数据)
  • 选择第一个复活的复制副本(不一定在ISR中)作为领导者

这是可用性和一致性之间的一个简单折衷。

默认情况下,从0.11.0.0版本开始,Kafka选择第一种策略,并倾向于等待一致的副本。如果不想要数据的一致性,则可以配置unclan.leader.election.enable为true,选择可用性优先(请慎重选择true,则意味这broker上的数据,有丢失的可能)。

总结

  • kafka高可用和数据高可靠,是靠复制集来保证的;背后的思想是对于数据和服务的冗余来实现的
  • kafka 是个分布式队列,主要是指队列的主题上的分区是分布式的
  • 分区有leader分区和follower分区,只有leader分区对 生产者和消费者提供读写服务。
  • 和leader保持数据同步的分区叫做ISR分区,如果follower分区同步的数据落后了leader分区则叫做非ISR分区
相关推荐
星云API技术支持2 分钟前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者23 分钟前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn1 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
Bs_MoneyMagnet2 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
计算机魔术师3 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端
计算机魔术师3 小时前
OpenAI的AI代理偷偷给RubyGems下毒,我们却毫无察觉
前端
甲维斯3 小时前
0代码,0建模,3句话开发一个3D游戏!
前端·游戏·游戏开发
IT_陈寒3 小时前
Vue的响应式更新把我坑惨了,原来问题出在这
前端·人工智能·后端
tingke3 小时前
别再堆 AGENTS.md 了:前端团队的 Agent 上下文分层落地指南
前端
李明卫杭州4 小时前
React 复合事件系统对比解析
前端·javascript·react.js