当前位置: 首页 > news >正文

三、Kafka集群

一、Kafka集群的概念

1、目的

高并发、高可用、动态扩展。

主备数据架构、双活节点、灾备数据中心。

如果是服务的地理范围过大也可以使不同的集群节点服务不同的区域,降低网络延迟。

2、Kafka集群的基本概念

1)复制(镜像)

kafka的分区数据支持复制操作。

2)天生的集群功能

搭建集群的能力使Kafka在消息中间件市场上有很强的竞争力。

Kafka天生支持分布式、集群、动态扩容。

RocketMQ和Kafka比较相似,在Kafka的功能基础上做了一些增强。

二、搭建Kafka集群

1、修改配置文件参数

配置文件名称:config/server.properties 

broker.id=0

kafka broker 在集群中的唯一标识,每一个broker节点的id都不同。 

由于所有kafka节点都注册到了相同的ZooKeeper集群中,所以需要一个唯一标识做区分。

listeners=PLAINTEXT://127.0.0.1:9092       

配置为本机的IP地址

zookeeper.connect=127.0.0.1:2181

配置ZooKeeper的连接地址,所有kafka节点都配置相同的ZooKeeper集群。

如果ZooKeeper有多个节点,那么就需要配置多个ZooKeeper地址。

2、启动ZooKeeper

启动一台kafka自带的ZooKeeper。

nohup ./zookeeper-server-start.sh ../config/zookeeper.properties -> zk.log &

3、启动Kafka

nohup ./kafka-server-start.sh ../config/server.properties -> kafka.log & 

4、集群的结构

三、Kafka集群的特点

1、集群创建主题

./kafka-topics.sh --bootstrap-server 127.0.0.1:9020 --create --topic allwe_1 --partitions 2 --replication-factor 2

./kafka-topics.sh                                    // 创建主题脚本

--bootstrap-server 127.0.0.1:9020        // 指定连接的Kafka节点,实际上连接的是集群

--create --topic allwe_1                         // 指定要创建的主题名称

--partitions 2                                         // 指定分区数,这里是2个分区 

--replication-factor 2                             // 指定复制因子,表示每个分区复制几份,一般有几台kafka节点就设置为几,如果超过就会让相同的分区分布在同一台kafka节点上,没什么实际作用。

2、集群创建的主题结构

可以看到,在每一个kafka节点中,保存的数据都是一样的,在相同主题中,每一个分区都有几个备份(复制体),并且是一主多从的结构。

但是,每一个分区的首领副本分布的位置却不同,有的在broker 1上,有的在broker 2上,这是因为kafka自动将分区的首领副本做了离散操作,避免一台kafka掉线影响过大。

3、控制器

控制器的本质:

在启动kafka集群的时候,会选择一个控制器,本质就是一个broker节点。

在集群中所有broker指向的控制器是同一个,可以看到图片里选择的控制器就是broker.id=0。

控制器的作用:

1、被选择为控制器的broker不但需要做broker的工作,还要做【首领副本】的选举工作。

4、首领副本(Leader)

首领副本的本质:

首领的本质是一个数据副本。

在集群中创建主题的时候,针对一个主题的不同分区,会选举一个首领副本,每个分区只有一个首领副本。

相同主题不同分区的首领副本一般会岔开分布到不同的broker,这样就能维持高可用。

客户端在生产、消费消息的时候,只会和首领副本交互,跟随者副本仅仅是复制首领副本的数据。这一点类似Redis的主从架构。

5、跟随者副本(Follower)

跟随者副本的数量被参数--replication-factor(复制因子)决定,replication-factor减去 1 (首领副本的数量)就是跟随者副本的数量。

跟随者副本不会与客户端做交互,只是额外保存了一份首领副本的数据。如果首领副本所在的broker掉线,跟随者副本才有可能会转正为首领副本与外界交互。

6、查询Topic的详细信息

./kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --describe

主题信息

Topic:laoli                        // 主题名称

TopicId:                           // 主题ID 

PartitionCount:2              // 主题分区数

RepliocationFactor:2      // 主题复制因子 - 每一个分区复制的份数

分区信息

Topic:laoli                         // 所属主题名称

Partition:0                         // 分区序号

Leader:0                           // 此分区的Leader副本存储在哪个broker上,这里的broker_id=0

Replicas:0,1                     // 分区副本保存在哪些broker上

Isr:0,1                               // 

如果一个kafka集群有2个broker,创建一个3分区的主题,复制因子为1,那么主题的分区副本如何分布?

由于每一个分区只有一个Leader副本,那么就要看这三个Lader副本分别分布在哪个Broker上。

四、Kafka集群处理请求的内部机制

1、连接kafka集群中的哪一台?

在kafka客户端中,连接任意一台kafka服务器都可以实现消息的发送、消费。

比如生产者连接的是服务器A,消费者连接的是服务器B,也是可以正常工作的。

2、消息生产的ACKS

1)生产者角度

发送确认的ACK机制,用来表示发出去一条消息后,生产者需要接收到多少条发送成功的确认回复才认为发送成功。

ACKS = 0:默认配置下,生产者发送消息的ACKS数量为0,表示只要发送出去了,就认为发送成功了。

ACKS = 3:表示需要有最少三个分区副本收到该消息,且返回了成功的回复后,才认为发送成功了。

ACKS = all / -1:表示需要所有的分区副本都回复成功。(数量=min.insync.replicas参数配置的数值,默认=3)

2)消费者角度

站在消费者的角度,只有生产者消息确认数达到ACKS,消费者才能接收这条消息。

如果追求性能:min.insync.replicas = 1。leader同步成功了就返回成功。但是如果leader宕机必然会丢失数据。

如果追求数据安全:min.insync.replicas = 副本数。如果出现任意一台broker掉线,那么发送消息返回失败。

如果追求均衡:min.insync.replicas = 中间数。实际上broker掉线是一个小概率事件,多台broker掉线的概率更小,所以没必要配置很大的ACKS。

Kafka以权衡的方式配置ACKS的数值。

数值越大,消息丢失概率小,消费者接收数据越慢。

数值越小,消息丢失概率大,消费者接收数据越快。

3)消费者客户端的重要参数

group.id :消费者所加入的消费者群组id。

auto.offset.reset:首次消费的偏移量,earliest-最早的偏移量,latest-最近的偏移量。

enable.auto.commit:true-自动提交(默认),false-手动提交(.commitAsync()-异步提交不重试;.commitSync()-同步提交一直重试)。

auto.commit.interval.ms:自动提交的间隔时间,默认5000ms。

3、消息获取的ISR

五、Kafka的存储机制

kafka的最小存储单元是“分区”。

相关文章:

三、Kafka集群

一、Kafka集群的概念 1、目的 高并发、高可用、动态扩展。 主备数据架构、双活节点、灾备数据中心。 如果是服务的地理范围过大也可以使不同的集群节点服务不同的区域,降低网络延迟。 2、Kafka集群的基本概念 1)复制(镜像) kaf…...

[数据结构]堆

堆,本质是一颗完全二叉树。属于非线性结构。 代码实现可参考树的代码。 函数介绍: //此堆是小堆,大堆操作部分与小堆相反 void InitHeap(Heap* cat) {assert(cat);cat->arr NULL;cat->capacity cat->size 0; } void DestroyHeap(Heap* cat) {assert(…...

UDP-鼠李糖合成酶基因的克隆与鉴定-文献精读76

何首乌中UDP-鼠李糖合成酶基因FmRHM1/2的克隆与鉴定 摘要 UDP-鼠李糖是一种由UDP-鼠李糖合酶(RHM)催化合成的鼠李糖供体,而鼠李糖是鼠李糖苷化合物的重要组成部分,植物中只有少数基因编码的酶参与UDP-鼠李糖生物合成。本研究基于…...

【H2O2|全栈】JS进阶知识(四)Ajax

目录 前言 开篇语 准备工作 基本概念 原生JS使用AJAX 创建AJAX对象 设置请求方式和地址 设置请求头 发送请求 get方式发送 post方式发送 获取响应数据 AJAX状态码和HTTP状态消息 错误捕获 原生JS封装AJAX方法 $ 调用AJAX方法 结束语 前言 开篇语 本系列博客…...

Spring IOC的工作流程

Spring IOC的工作流程 好的,这个问题我会从几个方面来回答。 IOC是什么 Bean的声明方式 IOC的工作流程 IOC的全称是 Inversion Of Control,也就是控制反转,它的核心思想是把对象的管理权限交给容器。(展示图 1) &…...

从新手到专家:7款电脑平面设计软件评测

平面设计在时尚、广告等多个领域扮演着重要角色,而创作出独特且富有创意的设计作品则需要依赖优秀的电脑平面设计软件。市场上的电脑平面设计软件众多,每款软件都有其独到之处。本文将为你推荐几款值得关注的电脑平面设计软件,并分析它们的特…...

【C++】如何让C++字符串更快、C++的小字符串优化

二十三、如何让C字符串更快、C的小字符串优化 1、如何让C字符串更快? 如果程序中有很多字符串操作,比如格式化文本(日志记录),那是非常糟糕的,因为字符串操作是很慢的。字符串string和它相关的很多函数很可能会自动分配内存&…...

C++《list》

在本篇当中我们将学习STL中的list,在此list就是我们之前在数据结构学习过的链表,在本篇中我们要来了解list当中的成员函数该如何使用,由于list各个函数的接口和之前学习过的vector类型,因此在学习list的使用就较为轻松。在lis篇章…...

strongswan中METHOD定义

strongswan中使用METHOD来定义函数(方法),如下get_first函数定义。 METHOD(linked_list_t, get_first, status_t,private_linked_list_t *this, void **item) {if (this->count 0)return NOT_FOUND;*item this->first->value;ret…...

Rive 动画框架竟然支持响应式布局,全平台动画框架开启全新 UI 交互能力

没用过 Rive 的可能对于 Rive 还不熟悉,其实之前已经介绍过 Rive 好几次,例如《Rive 2 动画库「完全商业化」》 和《给掘金 Logo 快速添加动画效果》 等文章都介绍过 Rive ,之所以会接触 Rive 到, 也是因为多年前想在 Flutter 平台…...

MQ的详细大全知识点

MQ(Message Queue)是一种在分布式系统中广泛应用的消息中间件,它基于“先进先出”的数据结构原理,用于在不同系统之间传递消息。MQ通过提供接口给各个系统调用,实现了发送者和接收者之间的解耦,使得系统之间…...

AI图像相似性搜索对比:VIT, CLIP, DINO-v2, BLIP-2

图像相似性搜索的核心在于一个简单的想法:图像可以表示为高维空间中的向量。当两个图像相似时,它们的向量应该在这个空间中占据相似的位置。我们可以通过测量角度(或余弦相似度)来确定这些向量的相似程度。如果角度小,…...

【tomcat系列漏洞利用】

Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用。主要组件:服务器Server,服务Service,连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。一个Container…...

前端学习-盒子模型(十八)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 盒子模型组成 边框 语法 边框简写 代码示例 表格的细线边框 语法 内边距 内边距复合写法 外边距 外边距典型应用 外边距合并 清除内外边距 总结 前…...

【C++】类和对象(十二):实现日期类

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的实现日期类&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1 /!/>/</>/<运算符重载2 /-//-运算符重载(A) 先写&#xff0c;再通过写(B…...

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《提升系统频率支撑能力的“车-氢”柔性可控负荷协同构网控制》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...

异或的性质

交换两个变量的值&#xff0c;不使用第三个变量。 即a3,b5,交换之后a5,b3; 有两种解法, 一种用算术算法, 一种用^(异或) a a b; b a - b; a a - b; or a a^b;// 只能对int,char… b a^b; a a^b; or a ^ b ^ a; 异或交换两个变量值的方法是利用了异或运算的特性。下面是…...

新一代Webshell管理器

工具介绍 游魂是一个开源的Webshell管理器&#xff0c;提供更为方便的界面和更为简单易用的功能&#xff0c;可配合或代替其他webshell管理器&#xff0c;帮助用户在各类渗透场景中控制目标机器。游魂不仅支持常见的一句话webshell以及常见Webshell管理器的功能&#xff0c;还…...

「iOS」——知乎日报一二周总结

知乎日报仿写 前言效果Manager封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写&#xff0c;主要完成了首页的仿写&#xff0c;进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…...

windows C#-匿名类型

匿名类型提供了一种方便的方法&#xff0c;可用来将一组只读属性封装到单个对象中&#xff0c;而无需首先显式定义一个类型。 类型名由编译器生成&#xff0c;并且不能在源代码级使用。 每个属性的类型由编译器推断。 可结合使用 new 运算符和对象初始值设定项创建匿名类型。 …...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

AIGC 基础篇 Python基础 02

1.bool类型 书接上回&#xff0c;我们上次最后讲了三大数据类型&#xff0c;除了这三个之外&#xff0c;Python也有bool类型&#xff0c;也就是True和False。 a 2 print(a1) print(a2) 像这里&#xff0c;输出的内容第一个是False&#xff0c;因为a的值为2&#xff0c;而第…...

大语言模型解析

1. Input Embedding embedding&#xff1a;将自然语言翻译成index 每个index对应一个embedding&#xff0c;embedding需要训练&#xff0c;embedding是一个数组...