http://blog.csdn.net/lizhitao/article/details/51718185

构建操作简单的分布式系统,尤其是对微妙的行为,最好的一门艺术是经常收集生产环境经验。Apache Kafka的普及在很大程度上归功于它的设计和操作简单。

Apache Kafka更微妙的特性之一是它的复制协议。对于单个集群不同大小工作负载情况下如何自动调优Kafka副本的工作比较棘手。这个特别困难的挑战之一是知道如何避免follower进入和退出同步副本列表(即ISR)。从用户的角度来看,如果生产者发送一批消息足够大,可能会引起Kafka Broker很多警告。这些警报表明一些主题处于“under replicated”状态,这些副本失败或死亡意味着数据没有被复制到足够数量Broker从而增加数据丢失的概率。因此,重要的是Kafka集群中处于“under replicated”中分区数要密切监控。然而,这个警告应该只有当一些Broker失效,减慢或暂停而不是生产者写不同大小消息引起的。这意外的行为和假警告来源于很多手动操作开销。在这篇文章中,我将讨论这种问题的根源以及我们如何修复它。

关键信息——根据使用经验和运行环境配置相关参数,不要靠猜测。

Kafka副本

Kafka中主题的每个Partition有一个预写式日志文件,每个Partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到Partition中,Partition中的每个消息都有一个连续的序列号叫做offset, 
确定它在分区日志中唯一的位置。 

Kafka每个主题分区有N个副本,其中n是主题的复制因子。Kafka通过多副本机制实现自动故障转移,当Kafka集群中一个Broker失效情况下仍然保证服务可用。在Kafka中发生复制时确保partition的预写式日志有序地写到其他节点上。N个replicas中。一个replica为leader,其他都为follower,leader处理对这个partition的所有读写请求,与此同时,follower会被动地去复制leader上的数据。 

Kafka必须提供日志复制算法保证,如果leader发生故障或挂掉,一个新leader被选举并且客户端的消息成功写入。Kafka确保从同步副本列表中选举一个副本为leader,或者换句话说,follower追赶leader日志。leader负责跟踪同步副本列表中所有follower滞后状态。当生产者发送一条消息到Broker,leader写入消息并复制到所有follower。消息提交之后才被成功复制到所有的同步副本。消息复制延迟受最慢的follower限制,重要的是快速检测慢副本,如果follower”落后”太多或者失效,leader将会把它从replicas同步列表中移除。Kakfa复制协议的细节有些微妙,这博客不是一个详尽的讨论的话题。你可以在这里关于Kafka复制是如何工作的。为了此讨论,我们将关注复制协议的可操作性。

partition的follower追上leader含义

Kafka中每个partition的follower没有“赶上”leader的日志可能会从同步副本列表中移除。下面用一个例子解释一下“追赶”到底是什么意思。请看一个例子:主题名称为foo 1 partition 3 replicas。假如partition的replication分布在Brokers 1、2和3上,并且Broker 3消息已经成功提交。同步副本列表中1为leader、2和3为follower。假设replica.lag.max.messages设置为4,表明只要follower落后leader不超过3,就不会从同步副本列表中移除。replica.lag.time.max设置为500 ms,表明只要follower向leader发送请求时间间隔不超过500 ms,就不会被标记为死亡,也不会从同步副本列中移除。 

下面看看,生产者发送下一条消息写入leader,与此同时follower Broker 3 GC暂停,如下图所示: 

直到follower Broker 3从同步副本列表中移除或追赶上leader log end offset,最新的消息才会认为提交。注意,因为follower Broker 3小于replica.lag.max.messages= 4落后于leader Broker 1,Kafka不会从同步副本列表中移除。在这种情况下,这意味着follower Broker 3需要迎头追赶上知道offset = 6,如果是,那么它完全“赶上” leader Broker 1 log end offset。让我们假设代理3出来的GC暂停在100 ms和追赶上领袖的日志结束偏移量。在这种状态下,下面partition日志会看起来像这样 

是什么原因导致分区的副本与leader不同步

一个副本可以不同步Leader有如下几个原因

  • 慢副本:在一定周期时间内follower不能追赶上leader。最常见的原因之一是I / O瓶颈导致follower追加复制消息速度慢于从leader拉取速度。
  • 卡住副本:在一定周期时间内follower停止从leader拉取请求。follower replica卡住了是由于GC暂停或follower失效或死亡。
  • 新启动副本:当用户给主题增加副本因子时,新的follower不在同步副本列表中,直到他们完全赶上了leader日志。

一个partition的follower落后于leader足够多时,被认为不在同步副本列表或处于滞后状态。在Kafka-0.8.2.x中,副本滞后判断依据是副本落后于leader最大消息数量(replica.lag.max.messages)或replicas响应partition leader的最长等待时间(replica.lag.time.max.ms)。前者是用来检测缓慢的副本,而后者是用来检测失效或死亡的副本

如何确定副本是滞后的

这个模型检测不同步卡住副本列表工作下所有情况都适用。它追踪follower replica时间内没有向leader发送拉取请求,表明它已经死了。另一方面,如果均匀流量模式情况下,为一个主题或多个主题设置这些参数检测模型不同步慢副本列表消息的数量会工作很好,但我们发现生产环境中它不扩展到所有主题各种工作负载。

接着上面的例子,如果主题foo获取数据速率2 msg/sec,leader单次批量接收一般不会超过3条消息,然后你知道主题参数replica.lag.max.messages设置为4。为什么?因为follower replica从leader复制消息前,已经有大批量消息写leader,follower replica落后于leader不超过3条消息 。另一方面,如果主题foo的follower replica初始落后于leader持续超过3消息,leader会从同步副本列表中移除慢副本,避免消息写延迟增加。

这本质上是replica.lag.max.messages的目标。能够检测follower与leader不一致且从同步副本列表移除。然而,主题在流量高峰期发送了一批消息(4条消息),等于replica.lag.max.messages = 4配置值。在那一瞬间,2个follower replica将被认为是”out-of-sync”并且leader会从同步副本列表中移除。 

2个follower replica都是活着,下次拉取请求他们会赶上leader log end offset并重新加入同步副本列表。重复相同的过程,如果生产者继续发送相对一批较大消息到leader。这种情况演示了当follower replica频繁在从同步副本列表移除和重新加入同步副本列表之间来回切换时,不必要触发虚假警报。 

参数replica.lag.max.messages指向核心问题。它的配置值根据队列流量大小和集群一般负载情况做出判断并设置一个合适值!

副本配置规则

笔者认为真正重要的事情是检测卡或慢副本,这段时间follower replica是“out-of-sync”落后于leader。在服务端现在只有一个参数需要配置replica.lag.time.max.ms。这个参数解释replicas响应partition leader的最长等待时间。检测卡住或失败副本的探测——如果一个replica失败导致发送拉取请求时间间隔超过replica.lag.time.max.ms。Kafka会认为此replica已经死亡会从同步副本列表从移除。检测慢副本机制发生了变化——如果一个replica开始落后leader超过replica.lag.time.max.ms。Kafka会认为太缓慢并且会从同步副本列表中移除。除非replica请求leader时间间隔大于replica.lag.time.max.ms,因此即使leader使流量激增和大批量写消息。Kafka也不会从同步副本列表从移除该副本。

Kafka副本同步机制理解相关推荐

  1. Kafka副本同步机制

    一.Kafka副本同步机制 Kafka中topic的每个partition有一个预写式日志文件,每个partition都由一系列有序的.不可变的消息组成,这些消息被连续的追加到partition中,p ...

  2. Kafka Ack应答机制理解

    背景 最近李哥做了kafka的调研,我看了他做的kafka与rabbitmq的对比与性能分析,打算深入了解一下kafka的ack应答机制 1.kafka基础大家可自行学习 2.这里我直接分析下ack应 ...

  3. 18_clickhouse副本同步与高可用功能验证,分布式表与集群配置,数据副本与复制表,ZooKeeper整合,创建复制表,副本同步机制,数据原子写入与去重,负载平衡策略,案例(学习笔记)

    24.副本同步与高可用功能验证 24.1.分布式表与集群配置 24.2.数据副本与复制表 24.3.ZooKeeper整合 24.4.创建复制表 24.5.副本同步机制 24.6.数据原子写入与去重 ...

  4. kafka:replica副本同步机制

    1 前言 Kafka的流行归功于它设计和操作简单.存储系统高效.充分利用磁盘顺序读写等特性.非常适合在线日志收集等高吞吐场景. Kafka特性之一是它的复制协议.复制协议是保障kafka高可靠性的关键 ...

  5. kafka 主从同步入门

    概念 就是follwer同步leader的信息 过程 怎么同步? 1 生产者写入消息,leader更新LEO 2 leader通知follwer来取消息,follwer开始fetch数据 3 foll ...

  6. kafka副本机制详解

    副本机制(Replication) 又称为备份机制,通常是指在分布式系中在多台机器中存储相同的数据进行备份的机制,副本机制只要有3个好处. 提供数据冗余:即使部分机器出现故障,系统仍然可以提供服务,增 ...

  7. kafka副本机制学习

    作用: 1.高可用,数据冗余.不能够提供读的能力,也不能有局部性原理: 注:同一分区的副本会在不同broker上面: 副本同步机制: 读写都在领导副本上面,副本通过主动pull的方式在leader副本 ...

  8. kafka 同步提交 异步_详解Kafka设计架构核心——Kafka副本机制详解

    所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝.副本机制有什么好处呢? 1. 提供数据冗余.即使系统部分组件失效,系统依然 ...

  9. kafka 消息分发机制、分区和副本机制

    一.消息分发机制 1.1 kafka 消息分发策略 消息是 kafka 中最基本的数据单元,在 kafka 中,一条消息由key.value两部分构成,在发送一条消息 时,我们可以指定这个key,那么 ...

  10. 图文了解 Kafka 的副本复制机制

    让分布式系统的操作变得简单,在某种程度上是一种艺术,通常这种实现都是从大量的实践中总结得到的.Apache Kafka 的受欢迎程度在很大程度上归功于其设计和操作简单性.随着社区添加更多功能,开发者们 ...

最新文章

  1. thinkphp源码分析(一)—开门篇
  2. think in baidu
  3. wxWidgets:持久对象概述
  4. redis的lrange_thinkphp5操作redis系列教程】列表类型之lRange,lGetRange
  5. 这个偏僻的小山村竟出了12位博士28位硕士,高产“学霸”背后原因曝光......
  6. Java对象内存图一
  7. 数据结构之并查集:并查集的介绍与Python代码实现——18
  8. C++工作笔记-Windows下查找窗口句柄并让其显示在桌面
  9. python rsa_Python RSA 公钥加密结果不一致
  10. 系统和服务器的关系图,服务器与客户端关系图
  11. 私有github java调用_使用Java API从GitHub获取所有提交
  12. gdb导入oracle,如何使用gdb工具对Oracle系统状态(systemstate)做trace
  13. 让开发者 so easy 的一站式服务到底存不存在?
  14. sql取系统时间减一小时_Java秒杀系统实战系列-整体业务流程介绍与数据库设计...
  15. 应用软件,操作系统,CPU的关系
  16. 15、作用域public、private、protected 以及不写时的区别
  17. selenium之使用driver及其属性
  18. 符合W3C的网站的开发模型和必要性的探讨(一)
  19. unity实现角色的移动(用状态机控制动画)
  20. 笔记本给移动设备共享wifi

热门文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_2_编码引出的问题_FileReader读取GBK格式文件...
  2. ORA-30377 MV_CAPABILITIES_TABLE not found
  3. web测试 结果存储类型为“Database”,但尚未指定结果储存库连接字符串
  4. SQL注入漏洞的判断
  5. 【计算机网络基础】URI、URN和URL的区别
  6. 查看Linux占用内存/CPU最多的进程
  7. 如何在ADO中使用数据读取器(DataReader)读取数据
  8. react-native 适配问题
  9. SAP FICO模块
  10. python接口自动化 -参数关联(一)