Kafka高可用实现原理
数据存储格式
Kafka的高可靠性的保障来源于其健壮的副本(replication)策略。一个Topic可以分成多个Partition,而一个Partition物理上由多个Segment组成。
Segment分2部分:索引文件和数据文件。索引文件保存元数据,记录了消息在数据文件中的偏移(offset),消息有固定物理结构,保证了正确的读取长度。
Segment文件带来好处:方便过期文件清理。只需要整体删除过期的Segment。以追加的方式写消息,顺序写磁盘极大提高了效率。
读取某offset消息的步骤变为:通过二分查找,找到offset所在Segment。通过Segment的索引文件,找到offset所在数据文件的物理偏移。读取数据。
副本复制与同步
从外部来看Partition类似一个不断增长,存储消息的数组,每个Partition有一个类似MySQL binlog的文件用来记录数据的写入。有两个新名词,HW(HighWatermark)表示当前Consumer可以看到Partition的offset位置,LEO(LogEndOffset)表示当前Partition最新消息的offset,各个副本单独维护。为了提高消息可靠性,Partition有N个副本。
N个副本中,有一个Leader,余下N-1个Follower。Kafka的写操作只在Leader副本上进行。通常这种副本写有两种方式:
Leader写日志文件成功即返回成功。这样如果Follower在同步完数据前Leader当机,数据丢失。这种方式带来较高效率。
Leader等待Follwer写日志成功并收到返回的acks后,才返回成功。这样Leader当机,重新选举的Leader与当机Leader数据一致,数据不丢失。但因为要等待Follwer返回,效率较慢。一般采用少数服从多数的选举方式,如果要应对f个副本当机,则至少需要2f+1个副本并使中的f+1个写成功。
Kafka没有使用上述机制。它实现了ISR(In-Sync Replication)的机制。
ISR(In-Sync Replication)机制
Leader维护一个副本队列(包含Leader自己),会及时将慢响应的Follwer剔除,并将追上Leader数据的Follower重新加入副本队列。
这样要保证数据高可靠所需要的副本数更少。比如应对2台机器的当机,ISR机制只需要3个副本。而上述机制2则需要2*2+1个副本。这样有效节约了大约一半的存储空间。
Leader当机,新的Leader是从ISR中按顺序选出。Leader恢复后成为Follower,删除上一个HW后所有数据后,从新的Leader进行同步。
数据可靠性配置
以下逻辑,可以保证一定程序数据可靠。当然副本越多,min.insync.replicas越大,则越可靠,但实际情况需要根据场景在效率与数据可靠上做权衡。
副本数设置为3。副本是Kafka实现HA的基础,通过replication.factor配置
min.insync.replicas设置为2。ISR副本队列中副本最小个数。极端情况下,ISR中只有一个Leader副本,若Leader当机则服务不可用。因此至少配置为2个。若ISR中副本小于这个数字,Producer返回异常。
配置Leader选举条件unclean.leader.election.enable=false,只允许Leader从ISR队列中选出。
request.required.acks=-1(等待ISR中的所有Follower都收到数据才返回成功),producer.type=sync(同步调用)
以上,保证了一个副本所在机器当机,Kafka仍提供服务,且数据正确未丢失。
数据去重
以上配置,保证了只要Leader返回成功,即不存在数据丢失。但考虑一种情况,Producer提交写请求到Leader后,Producer到Leader网络断开,此时Producer认为写失败。但实际,Follower正常同步到了Leader数据,HW更新。
此时Producer因为发送失败,会重发消息。此时Kafka中存在重复数据。这需要在Consume时业务逻辑中去重。Kafka本身不保证数据不重复。
Kafka高效的几个原因
1)架构层面
1. 一个Topic多Partition部署实现并行处理,线性扩展
2. ISR副本复制机制实现性能与可用性的平衡
2)磁盘优化
1. Partition中顺序写磁盘
2. mmap实现内存批量写磁盘,减少I/O次数
3)网络优化
1. sendfile系统调用实现零拷贝,减少上下文切换
2. Producer批量发送,减少网络I/O次数
3. 支持数据压缩
Kafka高可用实现原理的更多相关文章
- Kafka高可用环境搭建
Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Linkedin于2010年贡献给 ...
- Kafka 高可用设计
Kafka 高可用设计 2016-02-28 杜亦舒 Kafka在早期版本中,并不提供高可用机制,一旦某个Broker宕机,其上所有Partition都无法继续提供服务,甚至发生数据丢失对于分布式系统 ...
- kafka高可用探究
kafka高可用探究 众所周知 kafka 的 topic 可以使用 --replication-factor 数和 partitions 数来保证服务的高可用性 问题发现 但在最近的运维过程中,3台 ...
- Kafka —— 基于 ZooKeeper 搭建 Kafka 高可用集群
一.Zookeeper集群搭建 为保证集群高可用,Zookeeper集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本Zookeep ...
- Kafka 学习之路(二)—— 基于ZooKeeper搭建Kafka高可用集群
一.Zookeeper集群搭建 为保证集群高可用,Zookeeper集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本Zookeep ...
- Kafka 系列(二)—— 基于 ZooKeeper 搭建 Kafka 高可用集群
一.Zookeeper集群搭建 为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本 Zooke ...
- 入门大数据---基于Zookeeper搭建Kafka高可用集群
一.Zookeeper集群搭建 为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本 Zooke ...
- Kafka高可用实现
数据存储格式 Kafka的高可靠性的保障来源于其健壮的副本(replication)策略.一个Topic可以分成多个Partition,而一个Partition物理上由多个Segment组成. Seg ...
- Kafka高可用的保证
zookeeper作为去中心化的集群模式,消费者需要知道现在那些生产者(对于消费者而言,kafka就是生产者)是可用的. 如果没有zookeeper每次消费者在消费之前都去尝试连接生产者测试下是 ...
随机推荐
- 一、SQLite学习
由于公司业务拓展,需要开发一个基于ASP.NET Core2.0+AdminLTE架构的后台管理系统,数据库选择方面,选择了使用SQLite轻便. SQLite:一个软件库,实现自给自足,无服务器,零 ...
- HashSet和ArrayList有什么区别
hashSet存储的是无序,不可重复,无索引 ArrayList存储的是有序,可重复,有索引
- UNIX发展史简介
1965年贝尔实验室(Bell Labs).通用电气(General Electric)和麻省理工学院(MIT)欲共同打造MULTICS(Multiplexed Information and Com ...
- 在springboot中用redis实现消息队列
环境依赖 创建一个新的springboot工程,在其pom文件,加入spring-boot-starter-data-redis依赖: <dependency> <groupId&g ...
- boost库的安装
1.网上下载boost_1_67_0.zip,解压 2.双击boost_1_67_0/bootstrap.bat文件,生成bjam.exe,b2.exe. 3.打开命令行运行 bjam stage - ...
- Java反射《二》获取构造器
package com.study.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Invocation ...
- Java并发编程_wait/notify和CountDownLatch的比较(三)
1.wait/notify方法 package sync; import java.util.ArrayList; import java.util.List; public class WaitA ...
- mac以及centos下安装Elasticsearch 以及权限管理插件
Elasticsearch安装(提前系统需要安装java环境)mac安装 brew install elasticsearch centos安装 下载ElasticSearch安装包,https:// ...
- Linux系统命令行中vim编辑器取消高亮显示
由于在使用vim编辑代码的时候不小心忘记首先输入i(insert)模式,导致写的代码出现了棕黄色的阴影显示 摸索了很久终于找到了解决方法: 1.退出vim编译器 2.在在命令行下输入:nohl,回车 ...
- Alpha 冲刺 (6/10
Alpha 冲刺 (6/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.组织会议 2.帮助队员解决 ...