| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> kafka控制器,复制与存储小结 -> 正文阅读 |
|
[大数据]kafka控制器,复制与存储小结 |
【README】
【1】kafka内部原理【1.1】broker-消息中心点1)broker:一个独立的kafka服务器节点;也称为发送消息的中心点;
2)zk存储的kafka集群信息的节点列表
查看zk中的 broker id
【1.2】控制器1)控制器定义:集群里第一个启动的broker通过在zk创建临时节点 /controller 让自己成为控制器; 其他broker也尝试创建 controller 节点,若已存在,则报错;其他 broker 会在控制器节点上创建 zk watch 对象,这样非控制器节点可以收到控制器节点状态变更的通知;(干货——这种方式可以确保一个集群只能有一个控制器存在,防止脑裂问题) 2)控制器选举策略:一旦控制器被关闭或与zk断开,其他broker通过watch对象就会收到控制器消失的通知,这些 非控制器broker 会竞争在 zk 上创建 controller节点,谁最先创建成功,谁就是集群控制器; 然后其他broker在控制器节点上创建 zk watch对象;
3)控制器实验 step1) 查看 控制器和控制器纪元
显然, epoch是6,控制器是broker1; step2)停止掉 broker1;? 这个时候,broker2,3 会竞争选举为控制器;我们再次查看控制器,发现控制器现在是broker2了;且 epoch自增为7;?
4)控制器作用
【补充】脑裂指两个节点同时认为自己是集群控制器;? 5)zk的作用
【1.3】复制复制功能是kafka架构的核心;在kafka 文档里,kafka把自己描述为 一个分布式的,可分区的,可复制的提交日志服务;(kakfa的日志就是数据或消息); 【1.3.1】副本1)数据存储 kafka使用主题来组织数据(逻辑);使用分区为单位来读写数据(物理); 为什么说kakfa以分区为单位读写? 是因为我们创建带有分区数和副本数的主题后, kakfa会创建以这个分区命名的文件夹,分区文件夹下存储消息内容,索引文件等; ?2)主题,分区,副本关系
3)副本类型?
补充1:跟随者副本在成为不同步副本前的时间是通过 replica.lag.time.max.ms 来配置; 补充2:跟随者从首领副本复制消息时的请求,与消费者从首领副本消费消息时发出的请求是一样的; 【1.4】处理请求1)broker处理请求过程
?2)常见请求类型
【注意】
3)客户端怎么知道请求发送到哪里呢? 3.1)客户端在发送请求前,先发送元数据请求;
3.2)客户端会缓存这些元数据信息;
? 【1.4.1】生产请求1)生产者acks有3个值;
2)首领副本所在broker收到生产请求后,会对请求做一些验证:
【1.4.2】获取请求1)首领副本所在broker收到获取请求后,会根据客户端指定的请求偏移量从分区里读取消息; 2)kafka使用 零复制技术 向客户端发送消息,即kafka直接把消息从文件发送到网络通道,而不经过任何中间缓冲区;(干货——这是kakfa与大部分数据库不一样的地方,其他数据库在把数据发送到客户端前,会把数据保存到本地缓存)
3)消费者客户端只能读取已经被写入所有同步副本的消息,而不是所有消息
4)扩展 ISR, HW高水位
小结: 消费者只能看到已经复制所有副本的消息; 【1.4.3】其他请求OffsetCommitRequest, 偏移量提交请求; OffsetFetchRequest; ListOffsetsRequest; 【1.5】物理存储1)kafka的基本存储单元是分区; 分区会在所属broker上的kafka数据根目录下新建名为分区名的文件夹,如 hello04-2(主题为hello04的2号分区文件夹),kafka数据根目录由 server.properties 中的 log.dirs 来指定; 2)主题,分区,副本关系
?【1.5.1】分区分配1)创建指定分区和副本数的topic来做实验
查看分区详情
查看具体存储数据的文件夹,以broker1为例;? 根据topic详情,我们知道 broker1 存储了topic hello11的1号和2号分区; 且它是2号分区首领所在的broker ; 进入 broker1的kafka数据根目录, ? ?进入其中一个分区文件夹查看? hello11-1 ,如下: 再查看分区文件夹前,我们先写入10条消息; 指定topic hello11, 1号分区;
查看分区文件夹下的文件 ; 2) kafka的分段存储; 因为在一个大文件里查找和删除消息很耗时;所以把一个分区分成若干片段进行存储;默认情况下,一个片段存储1g数据,为了实验,这里我修改为 1k,可以在 server.properties文件中设置 log.segment.bytes=1024 来实现; 3)kafka的稀疏索引
例如: 索引值 1~100 指向 数据文件1.log中的消息1到消息100的消息范围的起始地址; refer2 Apache Kafka ; 当消费者指定消费某个offset记录时, kafka集群通过二分查找从索引文件找出包含offset的索引值,通过索引值找到对应数据文件的起始地址,然后从起始地址开始顺序读取对应offset的消息; 【1.5.2】文件格式1)kafka 使用零复制技术给消费者发送消息,避免了对生产者已经压缩过的消息进行解压和再压缩;? 2)普通消息与压缩消息格式 ? ?可以看出,多个压缩消息共用同一个消息头,从而减少消息大小; 【References】
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:45:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |