kafka存储机制与读写流程
2019独角兽企业重金招聘Python工程师标准>>>
存储机制
kafka用topic对消息进行归类,每一个topic可以分为多个分区,分区中的消息不重复,每个分区又有很多个segment(段),segment是在磁盘上就是一对文件,包含index和log文件,两种文件名相同,后缀不同
每个topic的第一个segment的两种文件都是00000000000000000000.index和00000000000000000000.log,后来新产生的文件名都以上一个segment中最有一条消息的offset(偏移量)结束,不足20个字符的用0填充,如图。
kafka数据被消费后虽然不会被立即删除,但不可能一直不删除,kafka根据两个设置定时检测做删除操作
1. 基于时间:log.retention.hours=168 2. 基于大小:log.retention.bytes=1073741824
满足任何一个都会删除之前的segment,记住不是删除某一个消息,删除的最小单位是segment
写流程
先上图
步骤:
1.连接ZK集群,从ZK中拿到对应topic的partition信息和partition的Leader的相关信息
2.连接到对应Leader对应的broker
3.将消息发送到partition的Leader上
4.其他Follower从Leader上复制数据
5.依次返回ACK
6.直到所有ISR中的数据写完成,才完成提交,整个写过程结束
因为是描述写流程,没有将replica与zk的心跳通讯表达出来,心跳通讯就是为了保证kafka高可用。一旦Leader挂了,或者Follower同步超时或者同步过慢,都会通过心跳将信息报告给ZK,由ZK做Leader选举或者将Follower从ISR中移动到OSR中
读流程
步骤:
1.连接ZK集群,从ZK中拿到对应topic的partition信息和partition的Leader的相关信息
2.连接到对应Leader对应的broker
3.consumer将自己保存的offset发送给Leader
4.Leader根据offset等信息定位到segment(索引文件和日志文件)
5.根据索引文件中的内容,定位到日志文件中该偏移量对应的开始位置读取相应长度的数据并返回给consumer
高可用
replication(复制)
topic的每个partition都有1到N个分区,每个分区有多个replica,多个replica中有一个是Leader,其他都是Follower,Leader负责响应producer和consumer的读写请求。一旦有数据写到Leader,则所有的Follower都会从Leader中去同步数据,但并非所有Follower都能及时同步,所以kafka将所有的replica分成两个组:ISR和OSR。ISR是与Leader数据同步的Follower,而OSR是与Leader数据不同步的Follower
Leader failover(Leader失败恢复)
为了保证数据一致性,当Leader挂了之后,kafka的controller默认会从ISR中选择一个replica作为Leader继续工作,选择的条件是:新Leader必须有挂掉Leader的所有数据。
如果为了系统的可用性,而容忍降低数据的一致性的话,可以将"unclean.leader.election.enable = true" ,开启kafka的"脏Leader选举"。当ISR中没有replica,则会从OSR中选择一个replica作为Leader继续响应请求,如此操作提高了Kafka的分区容忍度,但是数据一致性降低了。
broker failover(broker失败恢复)
broker挂了比单个partition的Leader挂了要做的事情多很多,因为一个broker上面有很多partition和多个Leader。因此至少需要处理如下内容:
1.更新该broker上所有Follower的状态
2.从新给Leader在该broker上的partition选举Leader
3.选举完成后,要更新partition的状态,比如谁是Leader等
kafka集群启动后,所有的broker都会被controller监控,一旦有broker宕机,zk的监听机制会通知到controller,controller拿到挂掉broker中所有的partition,以及它上面的存在的leader,然后从partition的ISR中选择一个Follower作为Leader,更改partition的follower和leader状态。
contoller failover(controller失败恢复)
当 controller 宕机时会触发 controller failover。每个 broker 都会在 zookeeper 的 "/controller" 节点注册 watcher,当 controller 宕机时 zookeeper 中的临时节点消失,所有存活的 broker 收到 fire 的通知,每个 broker 都尝试创建新的 controller path,只有一个竞选成功并当选为 controller。
转载于:https://my.oschina.net/u/3049601/blog/1826985
kafka存储机制与读写流程相关推荐
- Kafka 存储机制
个人总结,以官网为准 如有错误,欢迎指出 存储方式 在底层的硬盘上,kafka会在对应的配置目录下,创建topic-partitionId的目录,如下.如果是多broker的情况下,会使用partit ...
- kafka logManager类 kafka存储机制
logManager类:管理kafka数据log的类,包括数据clean,flush等操作 Log类:每个tplog的对象 logSegment:每个tplog目录下的文件对象 filemessage ...
- 《深入理解大数据:大数据处理与编程实践》一一3.3 HDFS文件存储组织与读写...
本节书摘来自华章计算机<深入理解大数据:大数据处理与编程实践>一书中的第3章,第3.3节,作者 主 编:黄宜华(南京大学)副主编:苗凯翔(英特尔公司),更多章节内容可以访问云栖社区&quo ...
- kafka工作流程及文件存储机制
1.kafka工作流程 如图topicA有3个分区,每个分区有两个副本(包含一个leader,一个follower),发送消息可以一个一个的发送,也可以批量发送,0,1,2这种是offset偏移量,每 ...
- Kafka文件存储机制及offset存取
Kafka是什么 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx ...
- Kafka文件存储机制那些事
Kafka是什么 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx ...
- Kafka整体结构图、Consumer与topic关系、Kafka消息分发、Consumer的负载均衡、Kafka文件存储机制、Kafka partition segment等(来自学习资料)
##1. Kafka整体结构图 Kafka名词解释和工作方式 Producer : 消息生产者,就是向kafka broker发消息的客户端. Consumer : 消息消费者,向kafka ...
- kafka 不同分区文件存储_Kafka 系列(二)文件存储机制与Producer架构原理怎样保证数据可靠性??...
文章目录 Kafka工作流程及文件存储机制 工作流程: topic底层存储: Producer生产者架构: 一:分区存储策略: 1.分区的原因: 2.分区的原则: ProducerRecord构造器: ...
- Kafka文件的存储机制
Kafka文件的存储机制 同一个topic下有多个不同的partition,每个partition为一个目录,partition命名的规则是topic的名称加上一个序号,序号从0开始. 每一个part ...
最新文章
- RxJava 过滤操作符 distinct 和 distinctUntilChanged
- RabbitMQ 入门系列(6)— 如何保证 RabbitMQ 消息不丢失
- 微型计算机组成原理考试,全国高等教育自学考试计算机组成原理模拟试题
- Python将DataFrame的某一列作为index
- 一文告诉你,大数据在智慧医疗领域发挥的作用
- 第四范式荣获2020年度信创工委会 “卓越贡献成员单位”称号
- 以高并发著称的 Go 如何与 MySQL 搭档应对千亿级数据?
- java给界面添加滚动条_Java Swing学习笔记:要求会默写或熟练的,GUI,控件,设置列或行,加滚动条,新界面...
- Shiro学习总结(3)——Apache Shiro身份认证
- STM32F103单片机ADC功能使用
- css3如何链如外部字体,微信小程序引入外部字体总结(针对安卓加载缓慢问题)...
- 黑马程序员 NSString,NSMutableString
- SQL2000和SQL2005同时安装问题(转载)
- 网页报错404:The origin server did not find 的原因(持续更新带图并总结了其他博客的内容)
- springboot防止表单重复提交_Spring Boot 使用 AOP 防止重复提交
- qt程序报错“C:\Program Files (x86)\SogouInput\Components\ 15:10:44: 程序异常结束。”
- linux手动rpm升级glibc,升级glibc库到glibc-2.14.1
- 马尔可夫链模型--通俗
- flutter代码中使用Android/ios原生生命周期
- 移动简报026—智慧餐厅出新服务:吃饭用微信就可排队;支付宝上线银行卡安全险:盗刷最高获赔 50 万;高德正式发布车载导航App...
热门文章
- html中hover有静止的命令,我可以通过JavaScript禁用CSS:hover效果吗?
- 【ES6】Proxy对象
- 汕头金山中学2021高考成绩查询,2019汕头市金山中学录取分数线及2019高考成绩喜报...
- Linux初学(Linux命令行的使用)
- linux对文件的描述,对Linux文件系统的简单理解
- C++_泛型编程与标准库(一)
- php 操作mssql,php操作mssql
- 排序与查找实验报告java,查找排序实验报告 - 范文大全 - 作文仓库-www.zuowencangku.com...
- java rtmp_搭建rtmp直播流服务之2:使用java实现ffmpeg命令接口化调用(用java执行ffmpeg命令)...
- 怎么把MySQL的数据传入JTable,如何直接从数据库中将数据填充到Jtable