Kafka系列六集群管理

news2024/11/25 22:37:18

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech

集群

Kafka 在搭建集群的时候需要借助 Zookeeper 来进行集群成员(Brokers)的管理。每一个 Broker 都有一个唯一标识 broker.id,用于自己在集群中的身份标识。可以在配置文件 server.properties 进行配置,或者由 Kafka 自己生成。

当有多个 Broker 时,需要选举出一个 Broker 作为整个集群的 Controller。Controller是 Kafka 的核心组件,它的主要作用是在 Zookeeper 的帮助下管理和协调控制整个Kafka集群。集群中的任意一台 Broker 都能充当 Controller 的角色,但是,在整个集群运行过程中,只能有一个Broker成为Controller。也就是说,每个正常运行的Kafka集群,在任何时刻都有且只有一个Controller。

Controller职责大致分为 5 种:主题管理,分区重分配,Preferred leader选举,集群成员管理(Broker上下线),数据服务(向其他Broker提供数据服务)。

Broker 的注册

在每一个 Kafka Broker 启动的时候,会向 Zookeeper 的 /brokers/ids 路径下创建一个临时节点,并将自己的 Broker ID 写入,从而注册到 Zookeeper 中。

在选举 Controller 时,所有的 Broker 会在 Zookeeper 上创建一个 /controller 节点,由于 Zookeeper 上的节点不会重复,因此只会有一个 Broker 能成为 Controller。

当 broker 出现宕机或者主动退出从而导致其持有的 Zookeeper 会话超时时,会触发注册在 Zookeeper 上的 watcher 事件,此时 Kafka 会进行相应的容错处理;如果宕机的是 controller broker 时,还会触发新的 controller 选举。

副本机制

为了保证集群的高可用性,Kafka 的分区可以设置为多副本的,这样在某个副本丢失的情况下,可以从其他的副本中获取信息。副本是对于 Partition 而言的,一个 Topic 有多个 Partition,每个 Partition 又有自己的副本,分为 Partition Leader 和 Partition Follower。

Partition Follower 定期从 Partition Leader 同步数据,主从之间会有同步延迟,因此每个分区都会有一个 ISR (in-sync Replica)列表,用于维护认为是同步的、可用的副本列表。对于 ISR 而言,Partition Leader 必定在其中,而 Partition Follower 则需要满足以下条件才能被认为是同步副本:

  1. 与 Zookeeper 之间有一个活跃的会话,即必须定时向 Zookeeper 发送心跳;
  2. 在规定时间内从 Partition Leader 那里低延迟地获取过消息。

假设有三个 Topic,分别是 A、B、C,每个 Topic 都有 3 3 3 个分区,每个分区又有 3 3 3 副本,则各个分区副本在集群的分布示意图如下:

kafka-replication

副本消息的同步

当 Producer 发布消息到某个 Partition 时,无论 Partition 有多少副本,与之对接的一定是 Partition Leader。Partition Leader 会向消息写入内存,之后等待刷盘线程写入磁盘。之后每个 Partition Follower 会从 Partition Leader 获取数据进行同步。

Partition Follower 收到消息并写入 Log 后,会向 Partition Leader 发送 Ack 信号。一旦所有的 Partition Follower 都返回 Ack 信号,则表示该条信息在集群中已经 commit,则 Partition Leader 也会向 Producer 发送 Ack 信号。

为了提高性能,每个 Follower 在接收到数据后就立马向 Leader 发送 ACK,而非等到数据写入 Log 中。因此对于已经 commit 的消息,Kafka 只能保证它被存在于多个副本的内存中,而不能保证它们被持久化到磁盘中,也就不能完全保证异常发生后该条消息一定能被 Consumer 消费。

在 Kafka 的副本同步机制中,Producer 可以通过配置 request.required.acks 来指定不同的数据一致性等级。

  • request.required.acks = 0:Producer 不需要等待来自 Partition Leader 的 Ack 信号,直接发送下一条消息。这种情况不能保证信息会被 Partition Leader 存储,存在数据丢失的风险。
  • request.required.acks = 1:Producer 等待来自 Partition Leader 的 Ack 信号之后,才能发送下一条信息。这种情况可以保证信息被 Partition Leader 存储,但是不能保证所有的 Partition Follower 已经完成同步。如果 Partition Leader 宕机而消息又还没同步到 Partition Follower,则该条信息会丢失。
  • request.required.acks = -1:表示 Producer 等待来自 Partition Leader 和所有 Partition Follower 的 ACK 确认之后,才发送下一条消息。在这种情况下,无论什么情况都不会发生消息的丢失,除非所有 Partition Follower 节点都宕机了。

上面三种不同值的设置,性能依次递减,但数据健壮性则依次递增。

副本 Leader 的选举

实际上,leader 选举的算法非常多,比如 Zookeeper 的 Zab、Raft 以及 Viewstamped Replication。而Kafka所使用的 leader 选举算法更像是微软的 PacificA 算法。

Kafka 在 Zookeeper 中为每一个 partition 动态的维护了一个 ISR,这个 ISR 里的所有 replica 都跟上了 leader,只有 ISR 里的成员才能有被选为leader的可能(unclean.leader.election.enable=false)。在这种模式下,对于 f+1 个副本,一个 Kafka topic 能在保证不丢失已经 commit 消息的前提下容忍 f 个副本的失败,在大多数使用场景下,这种模式是十分有利的。事实上,为了容忍 f 个副本的失败,“少数服从多数”的方式和 ISR 在 commit 前需要等待的副本的数量是一样的,但是 ISR 需要的总的副本的个数几乎是“少数服从多数”的方式的一半。

上文提到,在 ISR 中至少有一个 follower 时,Kafka 可以确保已经 commit 的数据不丢失,但如果某一个partition的所有replica都挂了,就无法保证数据不丢失了。这种情况下有两种可行的方案:

  • 等待ISR中任意一个replica“活”过来,并且选它作为leader
  • 选择第一个“活”过来的replica(并不一定是在ISR中)作为leader

如果一定要等待ISR中的replica“活”过来,那不可用的时间就可能会相对较长。而且如果ISR中所有的replica都无法“活”过来了,或者数据丢失了,这个partition将永远不可用。选择第一个“活”过来的replica作为leader,而这个replica不是ISR中的replica,那即使它并不保障已经包含了所有已commit的消息,它也会成为leader而作为consumer的数据源。默认情况下,Kafka采用第二种策略,即unclean.leader.election.enable=true,也可以将此参数设置为false来启用第一种策略。

参考文章

  • https://juejin.cn/post/6844903950009794567
  • https://shuyi.tech/archives/kafka-series-05-replica-copy-mechanism
  • https://cloud.tencent.com/developer/news/863931
  • https://www.cnblogs.com/aidodoo/p/8888628.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/953218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

问道管理:“出海”势头强劲 A股公司半年报彰显中国制造全球竞争力

“出海”是2023年我国企业开展的关键词之一。从国内企业组团出海抢订单,到我国出口“新三样”,上半年的多项经济热门、亮点均与出海相关。 上市公司2023年半年报亦折射企业出海的积极改变。Choice数据显示,到记者发稿时已披露半年报的4566家…

M1卡控制位解析

一、M1卡介绍 非接触式传输数据和供电 工作频率为 13.56 MHz 16 位 CRC 数据完整性检验、奇偶校验、位编码、位计数 典型票务交易时间小于 100 毫秒(包括备份管理) 支持随机 ID(7 字节 UID 版本) 工作距离可达…

Linux之web服务器

目录 www简介 常见Web服务程序介绍 服务器主机 主要数据 浏览器 网址及HTTP简介 URL http请求方法 状态码 MIME(Multipurpose Internet Mail Extension) www服务器的类型 静态网站 动态网站 Apache服务的搭建 Apache的安装 准备工作 htt…

【Flutter】Flutter 使用 collection 优化集合操作

【Flutter】Flutter 使用 collection 优化集合操作 文章目录 一、前言二、安装和基本使用三、算法介绍四、如何定义相等性五、Iterable Zip 的使用六、优先队列的实现和应用七、包装器的使用八、完整示例九、总结 一、前言 大家好!我是小雨青年,今天我要…

【LeetCode-中等题】105. 从前序与中序遍历序列构造二叉树

文章目录 题目方法一:递归 题目 方法一:递归 preorder [3,9,20,15,7] inorder [9,3,15,20,7] 首先根据 preorder 找到根节点是 3然后根据根节点将 inorder 分成左子树和右子树 左子树 inorder [9]右子树 inorder [15,20,7]这时候3是根节点 3的左子树…

C++信息学奥赛1178:成绩排序

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int arr[n]; // 创建大小为 n 的整型数组 arrstring brr[n]; // 创建大小为 n 的字符串数组 brrfor(int i0;i<n;i) cin>>brr[i]>>ar…

数据库设计的六个基本步骤

按照规范设计的方法&#xff0c;考虑数据库及其应用系统开发全过程&#xff0c;可将数据库设计分为以下6个阶段&#xff0c;分别为&#xff1a; 1.需求分析&#xff0c; 2.概念结构设计&#xff0c; 3.逻辑结构设计&#xff0c; 4.物理结构设计&#xff0c; 5.数据库实施&…

Ceph IO流程及数据分布

1. Ceph IO流程及数据分布 1.1 正常IO流程图 步骤&#xff1a; client 创建cluster handler。client 读取配置文件。client 连接上monitor&#xff0c;获取集群map信息。client 读写io 根据crshmap 算法请求对应的主osd数据节点。主osd数据节点同时写入另外两个副本节点数据。…

MES在人工智能方面的应用

MES&#xff08;制造执行系统&#xff09;在人工智能方面的应用主要集中在优化制造流程、提高生产效率和质量控制等方面。以下是一些MES在人工智能领域的应用案例&#xff1a; 1. 预测性维护&#xff1a;通过收集和分析生产设备的传感器数据&#xff0c;结合机器学习算法&am…

Tauri打包windows应用配置中文界面

使用 Tauri Rust 开发桌面应用&#xff0c;在 windows 系统上&#xff0c;打包后安装包名称后缀、安装界面、相关说明默认都是英文的。如果要默认显示为中文&#xff0c;则需要在 tauri.conf.json 中配置相应参数。 前言 默认情况下&#xff0c;在 windows 系统打完的 mis 包…

苹果照片丢失了?三招教你快速找回珍贵照片

照片记录了我们生活中的无数美好瞬间&#xff0c;能够帮助人们重新唤起那些珍贵的记忆。平时&#xff0c;大家也喜欢通过分享照片来让家人和朋友更加了解自己的生活。 如果手机上的照片不小心误删或者莫名丢失&#xff0c;请不必过度焦虑。小编为大家整理了适合果粉恢复苹果照…

中途接手项目,项目经理何如顺利交付?

有一个新项目&#xff0c;因为项目不被公司领导看中&#xff0c;项目金额小&#xff0c;对公司没有多少价值&#xff0c;且客户要求较多&#xff0c;但是碍于客户是熟人又不得不做&#xff0c;原来的项目经理承受不住压力离职&#xff0c;公司打算将这个项目交付这个我&#xf…

Doris行权限入门实战

Doris行权限原理 Doris支持了行级数据权限&#xff0c;当多租户模式使用的是共享表模式的情况下该功能能很方便的帮用户数实现行级权限控制。 Doris的行级权限是通过安全策略(ROW POLICY)实现的。 具体做法为&#xff1a;用户在指定表上创建安全策略并授权到具体的用户&#…

word 插入 高亮代码

word 插入高亮代码&#xff1a; 方法1&#xff1a;直接复制 IDE 中的内容&#xff08;优&#xff1a;随时随地复制&#xff0c;保留vscode格式。缺&#xff1a;其他IDE的格式可能就不好看了&#xff09;方法2&#xff1a;代码复制到网站 highlightcode.com&#xff0c;高亮后再…

函数返回多个值的应用

还是通过一个编程的例子来介绍函数返回多个值的应用。 举例&#xff1a;编写一个C 函数&#xff0c;该函数在一个字符串中找到可能的最长的子字符串并打印出来&#xff0c;该字符串是由同一字符组成的。 分析&#xff1a;这个字符串是存放在字符数组里的&#xff0c;要打印出来…

开源埋雷?一文带你看清安全风险!

导读 当前&#xff0c;国际形势中不稳定、不确定和不安全因素日益突出&#xff0c;各个行业中都存在没有硝烟的战争。在信息技术领域&#xff0c;由于去年俄乌冲突爆发&#xff0c;Oracle、SAP公司宣布暂停俄罗斯所有业务&#xff0c;Github考虑限制俄开发人员访问开源代码存储…

JS三座大山 —— 原型和原型链

系列文章目录 内容链接2023前端面试笔记HTML52023前端面试笔记CSS3 文章目录 系列文章目录前言一、原型是什么&#xff1f;二、原型链是什么&#xff1f;2.1 原型链全方面解析2.2 为什么构造函数也有原型&#xff1f; 总结 前言 理解原型和原型链可以帮助我们更好地理解 Java…

YOLOv5:解读general.py

YOLOv5&#xff1a;解读general.py 前言前提条件相关介绍general.pyclip_boxesscale_boxes ★ \bigstar ★xywh2xyxynon_max_suppression ★ ★ ★ \bigstar\bigstar\bigstar ★★★未完待续 参考 前言 记录一下自己阅读general.py代码的一些重要点&#xff0c;方便自己查阅。…

Java基础笔试题(一)

系列文章目录 Java基础知识题(一) Java基础知识题(二) Java基础知识题(三) Java基础知识题(四) Java基础知识题(五) 文章目录 系列文章目录 模块1 单选题1 单选题2 单选题2 单选题4 单选题5 模块2 单选题1 单选题2 补充一&#xff1a;理解is-a&#xff0c;has…

【python爬虫】5.爬虫实操(歌词爬取)

文章目录 前言项目&#xff1a;寻找周杰伦分析过程代码实现重新分析过程什么是NetworkNetwork怎么用什么是XHR&#xff1f;XHR怎么请求&#xff1f;json是什么&#xff1f;json数据如何解析&#xff1f;实操&#xff1a;完成代码实现 一个总结一个复习 前言 这关让我们一起来寻…