复制

  Kafka可以通过可配置的服务器数量复制每个主题分区的日志(可以为每个主题设置复制因子)。这允许在集群中的服务器发生故障时自动故障转移到其他副本,因此在存在故障的情况下,消息仍然可用。

  其他消息传递系统提供了一些复制相关的功能,这似乎是一个固定的事情,没有被大量使用,并且有很大的缺点:从站是非活动的,吞吐量受到很大的影响,虚拟手动配置等。默认情况下,Kafka旨在与复制配合使用 - 事实上,我们将复制因子为1的未复制的主题实现为复制主题。

  复制单位是主题分区。在非故障条件下,Kafka的每个分区都有一个leader和零个或多个follower。包括领导者的副本总数构成复制因子。所有的读写操作都在leader分区进行。通常,leader的数量多于broker数量,leader在broker之间平均分配。follower上的日志与leader上的日志相同 - 所有这些日志都以相同的顺序具有相同的偏移量和消息(尽管当然,在任何给定的时间,leader可能在其日志结尾处有一些尚未复制的消息)。

  Follower像Consumer那样从kafka leader消费消息,并应用到自己的日志中。让Kafka的follower从leader中拉取数据可以很好的进行批处理。

  与大多数分布式系统自动处理故障一样,需要对节点“活着”的意义进行精确定义。对于kafka节点活跃有两个条件:

  • 节点必须能够与ZooKeeper保持会话(通过ZooKeeper的心跳机制)
  • 如果它是一个follower,它必须复制发生在leader上写操作,而不是落后于“太远”

   我们将满足这两个条件的节点称为“同步”,以避免“活着”或“失败”的模糊。leader跟踪一组“同步”节点。如果follower死亡,卡住或落后,领导者将从同步副本列表中删除它。滞后副本的确定由replica.lag.time.max.ms配置控制。

  在分布式系统术语中,我们只尝试处理一个“失败/恢复”模式的失败,其中节点突然停止工作,然后再恢复)。Kafka不处理所谓的“拜占庭”故障,其中节点产生任意或恶意的响应。

  当该分区的所有同步副本已将其应用于其日志时,消息被视为“已提交”。只有“提交”的消息才会被给予消费者。这意味着消费者无需担心如果leader失败,可能会看到可能丢失的消息。另一方面,生产者可以选择等待消息被提交,这取决于他们偏好延迟和耐久性之间的权衡。此偏好由生产者使用的acks设置控制。

  Kafka提供的保证是,只要至少有一个同步复制存活的情下消息不会丢失.

  Kafka在并节点故障短时间故障转移期后仍然可用,但在网络分区存在的情况下可能无法保持可用。

Unclean leader election: What if they all die?

  Kafka对数据丢失的保证是基于至少一个副同保持同步。如果复制分区的所有节点都宕机,则此保证不再成立。当所有副本死亡时,有两种行为可以执行:

  • 等待ISR中的一个副本重新存活,并选择这个副本作为Leader(希望它仍然拥有所有的数据)。
  • 选择第一个副本(不一定在ISR中)作为领导者恢复生活的。

  这是在可用性和一致性之间的折衷。如果我们等待ISR中的副本,那么只要这些副本已经关闭,我们将保持不可用。如果这样的副本被毁坏或数据丢失,那么我们永久性地失效。另一方面,如果不同步的副本恢复生活,并且允许它成为领导者,那么它的日志也成为真理的根源,即使它不保证每一个已经提交的消息,默认情况下,Kafka选择第二种策略,并且在ISR中的所有副本都死亡时选择潜在的不一致副本。可以使用配置属性unclean.leader.election.enable禁用此行为,以支持停机时间优于不一致的用例。

  这个困境不是kafka特有的。它存在于任何基于quorum-based scheme。例如在多数投票计划中,如果大多数服务器遭受永久性故障,那么您必须选择丢失100%的数据或违反一致性,将现有服务器上剩下的内容作为新的真实来源。

可用性和耐久性保证

  在生产者写入消息到Kafka时,生产者可以选择是否等待消息被0,1或全部(-1)副本确认。请注意,“所有副本的确认”不能保证全部已分配的副本已收到该消息。默认情况下,当acks = all时,一旦所有当前在ISR中的副本收到消息,就会发生确认。例如,如果主题仅配置了两个副本,并且一个主题失败(即中只有一个副本在ISR),则指定acks = all的写入将成功。但是,如果剩余副本也失败,这些写入可能会丢失。尽管这确保了分区的最大可用性,但是对于那些喜欢持久性超过可用性的用户而言,这种行为可能是不希望的。因此,Kafka提供两个主题级别的配置,可用于优先于消息持久性超过可用性:

  • 禁止unclean leader election:如果所有副本都不可用,则分区将保持不可用,直到最近的领导者再次可用(最近指的是副本中保存的数据可leader最近)。这样做有效地避免了消息丢失的风险。
  • 指定最小ISR大小 :如果ISR的大小大于某个最小值,则分区才接受数据写入,以防止写入单个副本的消息在副本不可用时丢失。此设置仅在生产者使用acks = all并且确保该消息至少会被许多ISR中副本确认的情况下生效。此设置提供了一致性和可用性之间的权衡。更大的最小ISR设置保证更好的一致性,因为消息被保证被写入更多的副本,这降低了丢失的可能性。但是,如果同步副本的数量下降到最小阈值以下,则分区对于写入将不可用,因此可以降低可用性。

复制管理

  在Kafka集群将管理数百或数千个Topic分区。kafka以round-robin方式来平衡群集中的分区,以避免将大量topic的所有分区都聚集在少量的节点上。同样,kafka尝试平衡broker上的leader数量,以便每个节点都是其分区的比例份额的leader。

  优化领导选举过程同样重要,因为这是不可用的关键窗口。一个幼稚的傻的实现是当节点故障,leader将在运行中的所有分区中选举一个节点来托管。相反的,我们选出一个broker作为“控制器”。这个控制器检查broker级别故障和负责改变所有故障的broker中的受影响的leader的分区,这样的好处是,我们能够批量处理多个需要leader变更的分区,这使得选举更廉价、更快。如果控制器发生故障,在幸存的broker之中,将选举一个成为新的控制器。

Kafka学习-复制的更多相关文章

  1. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  2. Kafka学习-简介

      Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.S ...

  3. Kafka学习-入门

    在上一篇kafka简介的基础之上,本篇主要介绍如何快速的运行kafka. 在进行如下配置前,首先要启动Zookeeper. 配置单机kafka 1.进入kafka解压目录 2.启动kafka bin\ ...

  4. [Big Data - Kafka] kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  5. Kafka学习之(六)搭建kafka集群

    想要搭建kafka集群,必须具备zookeeper集群,关于zookeeper集群的搭建,在Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建博客有说明.需要具备两台以上装有zook ...

  6. Docker下kafka学习三部曲之二:本地环境搭建

    在上一章< Docker下kafka学习,三部曲之一:极速体验kafka>中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来 ...

  7. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  8. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  9. Kafka学习之路

    一直在思考写一些什么东西作为2017年开篇博客.突然看到一篇<Kafka学习之路>的博文,觉得十分应景,于是决定搬来这“他山之石”.虽然对于Kafka博客我一向坚持原创,不过这篇来自Con ...

随机推荐

  1. Jmeter-线程组

    1.Sampler 取样器(Sampler)是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler , 如 HTTP Request Sam ...

  2. js的eval函数

    今天在看代码的时候发现了一个eval函数,不解其意,通过查询之后,终于知道了,下面是我的总结. eval函数可以将字符串生成语句执行,格式为:eval(coding),类似于sql语句里面的exec( ...

  3. 老李秘技:loadrunner回放脚本错误提示Error: "HTTP Status-Code 500"

    老李秘技:loadrunner回放脚本错误提示Error: "HTTP Status-Code 500"   当脚本回放的时候出现错误提示Error: "HTTP Sta ...

  4. python_21_线程+进程+协程

    python_线程_进程_协程 什么是线程? -- os能够进行运算调度的最小单位,被包含在进程之中,是一串指令的集合 -- 每个线程都是独立的,可以访问同一进程下所有的资源 什么是进程? -- 每个 ...

  5. .Net 分布式技术比较

    内容转自于 http://www.mamicode.com/info-detail-585547.html .NET 分布式技术比较 1. MSMQ(Microsoft Message Queue) ...

  6. rancher api key

    rancher将docker容器的界面化做的很好了,但是我们有时间需要在别的地方查看容器的一些信息,怎么办呢? rancher自己提供的有api 点击api查看 我们能够查看到该容器的一些信息,实际上 ...

  7. MySQL意外关闭, 导致软件崩溃而无法启动的解决办法

    在初次搭建XAMPP,Apache和MySQL都可以正常启动,一旦关机重启XAMPP时,发现Apache可以正常启动:而MySQL却不能正常运行,会碰到 Error: MySQL shutdown u ...

  8. Sublime text3 设置的中文翻译

    // While you can edit this file, it's best to put your changes in // "User/Preferences.sublime- ...

  9. asp.net core 编译mvc,routing,security源代码进行本地调试

    因为各种原因,需要查看asp.net core mvc的源代码来理解运行机制等等,虽说源代码查看已经能很好的理解了.但是能够直接调试还是最直观的.所有就有了本次尝试. 因调试设置源代码调试太辍笔,所以 ...

  10. struts2 之 【struts2简介,struts2开发步骤,struts2详细配置,struts2执行流程】

    入门框架学习避免不了的问题: 1. 什么是框架? 简单的说,框架就是模板,模子,模型.就是一个可重用的半成品. 2. 如何学习框架? 学习框架其实就是学习规则,使用框架就是遵循框架的规则,框架是可变的 ...