Kafka 集群如何实现数据同步

news2024/10/5 23:29:02

Kafka 介绍

Kafka 是一个高吞吐的分布式消息系统,不但像传统消息队列(RaabitMQ、RocketMQ等)那样能够【异步处理、流量消峰、服务解耦】

还能够把消息持久化到磁盘上,用于批量消费。除此之外由于 Kafka 被设计成分布式系统,吞吐量和可用性大大提高

Kafka 角色

  • kafka 客户端
    • 生产者(producer):也叫发布者,负责创建消息
    • 消费者(consumer):也叫订阅者,负责消费(读取)消息
  • Kafka 服务端(broker)
    • leader:对外提供读写服务
    • follower:不提供服务,负责向 leader 同步数据

Topic(主题)和 partition(分区)

topic 就是消息发布的地方,消费者通过订阅 topic 来消费到对应的消息

为了提高吞吐量,实现 topic 的负载均衡,Kafka 在 topic 下又引用了分区(partition)的概念,每个 topic 可以被划分成多个分区

分区允许消息在 Topic 下水平分割和存储,每个分区都是一个有序且不可变的消息队列,消费者可以以并行的方式消费同一个 topic 中的消息

PS:topic 是逻辑上的概念,消息真正是存储到 partition 中去的

例如某个 topic 下被划分成 n 个分区,那么这个 topic 的并发度就提高 n,同时可以支持 n 个 consumer 并行消费该 topic 中的消息

log(日志)

对于每一个 topic ,Kafka 都会维护一个分区日志
 


每个分区都是一个有序的、不可变的消息队列,且可以持续地添加消息。消息在分区中分配了唯一的序列号,被称为偏移量(Offset)

offset 用来唯一的标识分区中每一条记录

Kafka 会保留所有分区中的消息,不会自动删除消息。消息的保留策略由 Kafka 配置参数控制,消息可以在一定时间或达到一定大小后过期,过期的消息会被删除

消费者在 Kafka 中只保留自己的 Offset,用于标识它在分区中的位置。通常情况下,当 消费者消费消息时,它的 Offset 会线性增加,表示它已经消费了这些消息

消费者可以选择将 Offset 重置为更旧的值,从而重新开始读取消息

每个消费者实例唯一负责一个分区,Kafka 只保证分区内的记录是有序的,而不保证主题中不同分区的顺序

Kafka 集群

Kafka 是分布式架构,有集群(cluster)的概念

Kafka 中的一个实例被称为 broker,它接收生产者的消息并存入磁盘,消费者连接 broker 消费消息

多个 broker 组成一个 Kafka cluster,集群内某个 broker 会成为集群控制器(cluster controller),负责管理整个 Kafka 集群,包括分配分区给 broker,监控 broker 等

分区被复制成了多个副本(replica)然后均分在不同的 broker 上 ,其中一个副本 Leader,其他的是 Follower

创建副本的单位是 topic 的 分区

正常情况下,每个分区都有一个 leader 和零或多个 followers 。这样即使某个 broker 发生故障,其他 broker上的副本仍然可以继续提供服务
 


那如何将所有的副本均匀分布在不同 broker 上呢?

分配副本的算法如下:

  • 将所有 broker(假设共 n 个 broker)和待分配的分区排序
  • 将第 i 个分区分配到第(i mod n)个 broker上
  • 将第 i 个分区的第 j 个副本分配到第((i + j) mode n)个 broker 上

如何实现数据同步?

我们先来看下 Kafka 中的 ISR(In-Sync Replicas) 机制

既然每个 leader 下面都有至少一个 follower,于是便有了 ISR,ISR 就是 Kafka 动态维护的一组同步副本集合

ISR 中所有的 follower 都与 leader 保持同步状态,而且 leader 也在 ISR 列表中,只有在自己 ISR 列表中的副本才能参与 leader 竞选

当生产者写入数据时,leader 更新数据,follower 是怎么知道 leader 更新然后去同步数据的呢?

follower 会通过定期向 leader 发送 fetch 请求来实现数据同步,这个是由 fetcher 线程来负责的

当一个副本被选举成为 follower 后,会启动副本的 fetcher 线程,随后 Follower 会定期向 Leader 发送心跳请求,以保持连接,并发送 fetch 请求来获取最新的数据

如果 follower 发现自己的 LEO(Log End Offset,日志结束偏移量)与 Leader 的 LEO 有差距时,会触发同步数据请求,以便将自身日志同步至 Leader 的对应位置,确保与 Leader 的数据保持一致

如果一个 follower 在指定时间内(配置字段为 replica.lag.time.max.ms)没有发送 fecth 请求或者没有追上 leader 的 LEO,就会从 ISR 中移除

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

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

相关文章

Qt 软件调试(二)使用dump捕获崩溃信息

Qt应用程序异常崩溃该怎么办&#xff0c;生成dump文件再回溯分析&#xff0c;可以快速且准确的帮助我们定位到崩溃的点。那么&#xff0c;本章我们分享下如何在Qt中生成dump文件。 一、使用minudump捕获崩溃信息 #include <QCoreApplication> #include <QDir> #i…

判断序列Series中的值是否都不一样 PandasSeries中的方法:is_unique()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断序列Series中的值是否都不一样 PandasSeries中的方法&#xff1a; is_unique() 选择题 请问下列程序运行的的结果是&#xff1a; import pandas as pd s1 pd.Series([1,2,3]) print("…

[PyTorch][chapter 64][强化学习-DQN]

前言&#xff1a; DQN 就是结合了深度学习和强化学习的一种算法&#xff0c;最初是 DeepMind 在 NIPS 2013年提出&#xff0c;它的核心利润包括马尔科夫决策链以及贝尔曼公式。 Q-learning的核心在于Q表格&#xff0c;通过建立Q表格来为行动提供指引&#xff0c;但这适用于状态…

现货黄金区间交易的两个要点

在现货黄金市场中&#xff0c;我们常碰到横盘区间行情。有区间&#xff0c;就终究会出现突破&#xff0c;因为金价不可能缺乏方向而一直在区间内运行。那既然要突破&#xff0c;我们又应当如何应对和交易呢&#xff1f;下面我们就来讨论一下。 切忌在突破发生时马上跟随突破方向…

EI期刊完整程序:MEA-BP思维进化法优化BP神经网络的回归预测算法,可作为对比预测模型,丰富内容,直接运行,免费

适用平台&#xff1a;Matlab 2020及以上 本程序参考中文EI期刊《基于MEA⁃BP神经网络的建筑能耗预测模型》&#xff0c;程序注释清晰&#xff0c;干货满满&#xff0c;下面对文章和程序做简要介绍。 适用领域&#xff1a;风速预测、光伏功率预测、发电功率预测、碳价预测等多…

leetcode刷题详解三

2. 两数相加 思路&#xff1a;直接加&#xff0c;注意进位条件不要用if&#xff0c;核心代码在于sum l1->val l2->val carry; ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* dummy new ListNode();ListNode* dummy_head dummy;int carry 0;int …

OSG编程指南<十>:OSG几何体的绘制

1、场景基本绘图类 在 OSG 中创建几何体的方法比较简单&#xff0c;通常有 3 种处理几何体的手段&#xff1a; 使用松散封装的OpenGL 绘图基元&#xff1b;使用 OSG 中的基本几何体&#xff1b;从文件中导入场景模型。 使用松散封装的OpenGL 绘图基元绘制几何体具有很强的灵活…

完美解决:vue.js:6 TypeError: Cannot read properties of undefined (reading ‘0‘)

Vue项目出现以下报错&#xff1a; 原因&#xff1a; 在渲染的时候&#xff0c;不满足某个条件而报错&#xff0c;或者某个属性丢失或后台没传过来导致 我这里出现的原因是后台给我传递过来的数组中&#xff0c;其中有一条少传了一个我在渲染时需要用的属性&#xff0c;没让后台…

毅速:3D打印随形透气钢为解决模具困气提供了新助力

在模具行业中&#xff0c;困气是一个较常见的问题。解决困气问题的方法有很多&#xff0c;透气钢就是其一。传统的制造的透气钢往往存在一些不足&#xff0c;如加工难度大、无法满足复杂形状的需求等。随着3D打印技术的发展&#xff0c;一种新型的随形透气钢技术逐渐崭露头角&a…

HBase数据模型杂谈

1.概述 HBase是一个稀疏、多维度、排序的映射表&#xff0c;这张表的索引是行键、列族、列限定符和时间戳。 每个值是一个未经解释的字符串&#xff0c;没有数据类型。用户在表中存储数据&#xff0c;每一行都有一个可排序的行键和任意多的列。表在水平方向由一个或者多个列族…

【Jenkins】jenkins发送邮件报错:Not sent to the following valid addresses:

jenkins报错未能发送邮件到指定邮箱 注意&#xff1a;这是在系统配置中修改 在系统配置》邮件通知中添加配置信息 注意&#xff1a;这个是在项目的配置下修改 配置完成后&#xff0c;重新执行发送邮件成功&#xff01;&#xff01;&#xff01;

AI动画制作 StableDiffusion

1.brew -v 2.安装爬虫项目包所必需的python和git等系列系统支持部件 brew install cmake protobuf rust python3.10 git wget pod --version brew link --overwrite cocoapods 3.从github网站克隆stable-diffusion-webui爬虫项目包至本地 ssh-add /Users/haijunyan/.ssh/id_rs…

API 设计:使用 Node.js 和 Express.js 的综合教程

API&#xff08;应用程序编程接口&#xff09;设计涉及创建一个高效而强大的接口&#xff0c;允许不同的软件应用程序相互交互。 说明 本教程将指导您使用 Node.js 和 Express.js 作为核心技术来规划、设计和构建 API。但是&#xff0c;这些原则可以应用于任何语言或框架。我们…

NX二次开发UF_CURVE_ask_curve_inflections 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_inflections Defined in: uf_curve.h int UF_CURVE_ask_curve_inflections(tag_t curve_eid, double proj_matrx [ 9 ] , double range [ 2 ] , int * num_infpt…

手写一个简单版的Spring

1. 创建一个工程及初始化 创建Java工程 创建对应的包 config&#xff1a;为配置类包 service&#xff1a;定义的将要被自己写的Spring容器管理的组件bean spring&#xff1a;里面定义自己写的Spring的类文件&#xff0c;包含子包anno注解包 test&#xff1a;定义测试类 2.…

生物识别访问面临风险

安全公司 Blackwing Intelligence 发现了多个允许您绕过Windows Hello 身份验证的漏洞。 戴尔 Inspiron 灵越 15、联想 ThinkPad T14 和 Microsoft Surface Pro X笔记本电脑上会出现这种情况&#xff0c;原因是设备中集成了来自Goodix、Synaptics 和 ELAN的指纹传感器。 所有…

C#,数值计算——插值和外推,Powvargram的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Functor for variogram v(r)ar^b, /// where b is specified, a is fitted from the data. /// </summary> public class Powvargram { private do…

情感对话机器人的任务体系

人类在处理对话中的情感时&#xff0c;需要先根据对话场景中的蛛丝马迹判断出对方的情感&#xff0c;继而根据对话的主题等信息思考自身用什么情感进行回复&#xff0c;最后结合推理出的情感形成恰当的回复。受人类处理情感对话的启发&#xff0c;情感对话机器人需要完成以下几…

在新疆乌鲁木齐的汽车托运

在新疆乌鲁木齐要托运的宝! 看过来了 找汽车托运公司了 连夜吐血给你们整理了攻略!! ⬇️以下&#xff1a; 1 网上搜索 可以在搜索引擎或专业的货运平台上搜索相关的汽车托运公司信息。在网站上可以了解到公司的服务范围、托运价格、运输时效等信息&#xff0c;也可以参考其他车…

Ubuntu中安装搜狗输入法教程(详细图文教程)

习惯了使用搜狗输入法&#xff0c;这里总结了Ubuntu系统下安装搜狗输入法的详细教程&#xff0c;每个步骤都很详细&#xff0c;耐心安装。 搜狗输入法是一款功能强大、使用方便的输入法&#xff0c;能够有效提升用户在Ubuntu系统中的输入体验。 目录 一、下载搜狗安装包1.1 搜…