数据存储格式

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副本上进行。通常这种副本写有两种方式:

  1. Leader写日志文件成功即返回成功。这样如果Follower在同步完数据前Leader当机,数据丢失。这种方式带来较高效率。

  2. 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越大,则越可靠,但实际情况需要根据场景在效率与数据可靠上做权衡。

  1. 副本数设置为3。副本是Kafka实现HA的基础,通过replication.factor配置

  2. min.insync.replicas设置为2。ISR副本队列中副本最小个数。极端情况下,ISR中只有一个Leader副本,若Leader当机则服务不可用。因此至少配置为2个。若ISR中副本小于这个数字,Producer返回异常。

  3. 配置Leader选举条件unclean.leader.election.enable=false,只允许Leader从ISR队列中选出。

  4. 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高可用实现原理的更多相关文章

  1. Kafka高可用环境搭建

    Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Linkedin于2010年贡献给 ...

  2. Kafka 高可用设计

    Kafka 高可用设计 2016-02-28 杜亦舒 Kafka在早期版本中,并不提供高可用机制,一旦某个Broker宕机,其上所有Partition都无法继续提供服务,甚至发生数据丢失对于分布式系统 ...

  3. kafka高可用探究

    kafka高可用探究 众所周知 kafka 的 topic 可以使用 --replication-factor 数和 partitions 数来保证服务的高可用性 问题发现 但在最近的运维过程中,3台 ...

  4. Kafka —— 基于 ZooKeeper 搭建 Kafka 高可用集群

    一.Zookeeper集群搭建 为保证集群高可用,Zookeeper集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本Zookeep ...

  5. Kafka 学习之路(二)—— 基于ZooKeeper搭建Kafka高可用集群

    一.Zookeeper集群搭建 为保证集群高可用,Zookeeper集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本Zookeep ...

  6. Kafka 系列(二)—— 基于 ZooKeeper 搭建 Kafka 高可用集群

    一.Zookeeper集群搭建 为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本 Zooke ...

  7. 入门大数据---基于Zookeeper搭建Kafka高可用集群

    一.Zookeeper集群搭建 为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本 Zooke ...

  8. Kafka高可用实现

    数据存储格式 Kafka的高可靠性的保障来源于其健壮的副本(replication)策略.一个Topic可以分成多个Partition,而一个Partition物理上由多个Segment组成. Seg ...

  9. Kafka高可用的保证

    zookeeper作为去中心化的集群模式,消费者需要知道现在那些生产者(对于消费者而言,kafka就是生产者)是可用的.    如果没有zookeeper每次消费者在消费之前都去尝试连接生产者测试下是 ...

随机推荐

  1. 解决jar包依赖:Spring IO platform推出bom

    名词解释: BOM(bill of materials):材料清单,用于解决jar包依赖的好方法. Spring IO Platform 缘起:Spring起初只专注ioc和aop,现在已发展成一个庞 ...

  2. Python面向对象高级编程-__slots__、定制类,枚举

    当在类体内定义好各种属性后,外部是可以随便添加属性的,Python中类如何限制实例的属性? Python自带了很多定制类,诸如__slots__,__str__ __slots__ __slots__ ...

  3. python 自然语言处理(三)____条件频率分布

    条件频率分布就是频率分布的集合,每个频率分布有一个不同的“条件”,这个条件通常是文本的类别.当语料文本分为几类(文体,主题,作者等)时,可以计算每个类别独立的频率分布,这样,就可以通过条件频率分布研究 ...

  4. Uboot中汇编指令

    LDR(load register)指令将内存内容加载入通用寄存器 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到 ...

  5. 利用VisualVm和JMX远程监控Java进程

    自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建 ...

  6. PHP开发者的Linux学习之路

    谈起一个高效动态网站的构建,那就不得不提到LAMP,即Linux操作系统.Apache网络服务器.Mysql数据库.Perl.PHP或Python编程语言等开源产品所组成的网站架构框架,其最大的优势是 ...

  7. OO第一阶段总(休)结(养)分(生)析(息)

    第一次作业: 这是一次让我认识到ddl面前潜力真的可以无限大的作业. 一直以为OO是一门和数据结构一样先用几周的时间讲讲Java然后写写”Hello World”小程序再开始讲正课的我(我也不知道为什 ...

  8. tomcat 线程数与 mysql 连接数综合调优

    目前线上系统包含 数据收集+数据分析+中心服务,三个均为 tomcat,共用一个mysql服务. 由于tomcat最大线程数200 *3 =600,最大并发时,会有600个jdbc连接.当然这是极端情 ...

  9. :模板方法模式:Beverage

    #ifndef __COFFINEBEVERAGE_H__ #define __COFFINEBEVERAGE_H__ #include <iostream> using namespac ...

  10. Java 将图片转成base64,传到前台展示

    后台代码: public String getBase64(SysFile sysFile){ String imgStr = ""; try { File file = new ...