数据存储格式

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 高可用设计

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

  2. Kafka高可用环境搭建

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

  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. leetcode_11. Container With Most Water

    leetcode_11. Container With Most Water 一,问题: Given n non-negative integers a1, a2, ..., an, where ea ...

  2. Cisco Packet Tracer中两台电脑通信设置

    Cisco Packet Tracer是网络初学者仿真模拟网络环境的必备工具.今天我们来模拟下两台电脑之间的通信. Cisco Packet Tracer版本6.2.0 一.添加设备 1.这里添加一个 ...

  3. MySQL数据库引擎、事务隔离级别、锁

    MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能 ...

  4. MySQL事务及其实现

    事务定义 事务是访问并更新数据库中各个数据项的一个程序执行单元.在事务操作中,要不都做修改,要么都不做. 事务特性 事务具有ACID四个特性,分别是:原子性(Atomicity).一致性(Consis ...

  5. Unity 几何着色器

    Unity 几何着色器 shaderGeometry Shader几何着色器 Unity 几何着色器 如果学习不能带来价值,那将毫无意义 简介     在顶点和片段着色器之间有一个可选的着色器,叫做几 ...

  6. 关于spring boot 使用 mybatis plus INSERT的时候id报错

    mybatis plus 在INSERT的时候会默认自动设置插入id 我当时数据库采用的id自增. 在使用插入语句的时候并没有set  ID 但是它默认给了一大串 更改mybatis plus全局配置 ...

  7. VM虚拟机系统时间同步网络时间并登录用户自动校正时间

    原文出处: http://blog.51cto.com/wutou/1932317 VM虚拟机大家都用,我在用完后,经常使用"挂起客户机",但是这样一来,系统恢复启动很快,但是少了 ...

  8. Netty源码分析第5章(ByteBuf)---->第7节: page级别的内存分配

    Netty源码分析第五章: ByteBuf 第六节: page级别的内存分配 前面小节我们剖析过命中缓存的内存分配逻辑, 前提是如果缓存中有数据, 那么缓存中没有数据, netty是如何开辟一块内存进 ...

  9. java.io.tmpdir指定的路径在哪?

    Java.io.tmpdir介绍 System.getproperty(“java.io.tmpdir”)是获取操作系统缓存的临时目录,不同操作系统的缓存临时目录不一样, 在Windows的缓存目录为 ...

  10. yocto-sumo源码解析(九): ProcessServer.main

    前面讲到BitbakeServer实际上是一个ProcessServer,因此对ProcessServer进行了一个大略的分析集,这里着重再介绍一下ProcessServer.main. 1. 初始化 ...