Kafka学习-复制

复制

  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之中,将选举一个成为新的控制器。

时间: 2024-08-26 18:04:50

Kafka学习-复制的相关文章

kafka学习之路(二)——提高

kafka学习之路(二)--提高 消息发送流程 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理.为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息.     过程: 1.Producer根据指定的partition方法(round-robin.hash等),将消息发布到指定topic的partition里面 2.kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否

kafka学习笔记:知识点整理

一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕. 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可. 4.

1、Kafka学习分享-V1.0

Kafka学习分享 .1       什么是Kafka Apache Kafka是一个开源的流处理平台,由 Apache Software Foundation使用Scala and Java编写发展而来.Kafka?用于构建实时数据管道和流媒体应用. 它具有水平可扩展性,容错性,快速性,并在数千家公司生产中运行. 它的主要功能:数据流的发布和订阅.数据流的处理.数据流的存储.像一个消息系统一样发布和订阅数据流,有效且实时地处理数据流,在一个分布式备份的集群中安全地处理存储数据流. .2    

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

一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕. 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可. 4.

Kafka学习-简介

Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spark都支持与Kafka集成. Kafka创建背景 Kafka是一个消息系统,原本开发自LinkedIn,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础.现在它已被作为多种类型的数据管道和消息系统使用.活动流数据是几乎所有站点在对其网站使用情

3、Kafka学习分享|快速入门-V3.0

Kafka学习分享|快速入门 这个教程假定你刚开始是新鲜的,没有现存的Kafka或者Zookeeper 数据.由于Kafka控制控制脚本在Unix和Windows平台不同,在Windows平台使用bin\windows\ 代替 bin/,并且更改脚本扩展名为.bat. 第一步:下载编码 下载0.10.2.0版本并且解压它. 第二步:启动服务器 Kafka使用Zookeeper,因此如果你没有Zookeeper server,你需要先启动a ZooKeeper server.你可以使用Kafka的

Kafka学习之一深度解析

背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐率.即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输 同时支持离线数据处理和实时数据处理 为什么要用消息系统 解耦在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息队

Kafka学习之路 (三)Kafka的高可用

一.高可用的由来 1.1 为何需要Replication 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Broker宕机,则其上所有的Partition数据都不可被消费,这与Kafka数据持久性及Delivery Guarantee的设计目标相悖.同时Producer都不能再将数据存于这些Partition中. 如果Producer使用同步模式则Producer会在尝试重新发送message.send.max.retries(默认值为3)次后抛出Exception,

kafka 学习(二)

kafka 学习(二) 一.Kafka的架构 如上图所示,一个典型的Kafka集群中包含若干Producer(可以是web前端产生的Page View,或者是服务器日志,系统CPU.Memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干Consumer Group,以及一个Zookeeper集群.Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance.Producer