Kafka副本机制

一、什么是副本机制:

通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝

二、副本机制的好处:

1、提供数据冗余

系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性

2、提供高伸缩性

支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量

3、改善数据局部性

允许将数据放入与用户地理位置相近的地方,从而降低系统延时。

三、kafka的副本

1、本质就是一个只能追加写消息的日志文件

2、同一个分区下的所有副本保存有相同的消息序列

3、副本分散保存在不同的 Broker 上,从而能够对抗部分 Broker 宕机带来的数据不可用(Kafka 是有若干主题概,每个主题可进一步划分成若干个分区。每个分区配置有若干个副本)

如下:有 3 台 Broker 的 Kafka 集群上的副本分布情况

四、kafka如何保证同一个分区下的所有副本保存有相同的消息序列:

基于领导者(Leader-based)的副本机制

工作原理如图:

1、Kafka 中分成两类副本:领导者副本(Leader Replica)和追随者副本(Follower Replica)。每个分区在创建时都要选举一个副本,称为领导者副本,其余的副本自动称为追随者副本。

2、Kafka 中,追随者副本是不对外提供服务的。追随者副本不处理客户端请求,它唯一的任务就是从领导者副本,所有的读写请求都必须发往领导者副本所在的 Broker,由该 Broker 负责处理。(因此目前kafka只能享受到副本机制带来的第 1 个好处,也就是提供数据冗余实现高可用性和高持久性)

3、领导者副本所在的 Broker 宕机时,Kafka 依托于 ZooKeeper 提供的监控功能能够实时感知到,并立即开启新一轮的领导者选举,从追随者副本中选一个作为新的领导者。老 Leader 副本重启回来后,只能作为追随者副本加入到集群中。

五、kafka追随者副本到底在什么条件下才算与 Leader 同步

Kafka 引入了 In-sync Replicas,也就是所谓的 ISR 副本集合。ISR 中的副本都是与 Leader 同步的副本,相反,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的

六、kafka In-sync Replicas(ISR)

1、ISR不只是追随者副本集合,它必然包括 Leader 副本。甚至在某些情况下,ISR 只有 Leader 这一个副本

2、通过Broker 端replica.lag.time.max.ms 参数(Follower 副本能够落后 Leader 副本的最长时间间隔)值来控制哪个追随者副本与 Leader 同步?只要一个 Follower 副本落后 Leader 副本的时间不连续超过 10 秒,那么 Kafka 就认为该 Follower 副本与 Leader 是同步的,即使此时 Follower 副本中保存的消息明显少于 Leader 副本中的消息。

3、ISR 是一个动态调整的集合,而非静态不变的。

某个追随者副本从领导者副本中拉取数据的过程持续慢于 Leader 副本的消息写入速度,那么在 replica.lag.time.max.ms 时间后,此 Follower 副本就会被认为是与 Leader 副本不同步的,因此不能再放入 ISR 中。此时,Kafka 会自动收缩 ISR 集合,将该副本“踢出”ISR。

倘若该副本后面慢慢地追上了 Leader 的进度,那么它是能够重新被加回 ISR 的。

4、ISR集合为空则leader副本也挂了,这个分区就不可用了,producer也无法向这个分区发送任何消息了。(反之leader副本挂了可以从ISR集合中选举leader副本)

七、kafka leader副本所在broker挂了,leader副本如何选举

1、ISR不为空,从ISR中选举

2、ISR为空,Kafka也可以从不在 ISR 中的存活副本中选举,这个过程称为Unclean 领导者选举,通过Broker 端参数 unclean.leader.election.enable 控制是否允许 Unclean 领导者选举。开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性。反之,禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。

一个分布式系统通常只能同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)中的两个。显然,在这个问题上,Kafka 赋予你选择 C 或 A 的权利。

强烈建议不要开启unclean leader election,毕竟我们还可以通过其他的方式来提升高可用性。如果为了这点儿高可用性的改善,牺牲了数据一致性,那就非常不值当了。

ps1:leader副本的选举也可以理解为分区leader的选举

ps2:broker的leader选举与分区leader的选举不同,

Kafka的Leader选举是通过在zookeeper上创建/controller临时节点来实现leader选举,并在该节点中写入当前broker的信息
{“version”:1,”brokerid”:1,”timestamp”:”1512018424988”}
利用Zookeeper的强一致性特性,一个节点只能被一个客户端创建成功,创建成功的broker即为leader,即先到先得原则,leader也就是集群中的controller,负责集群中所有大小事务。
当leader和zookeeper失去连接时,临时节点会删除,而其他broker会监听该节点的变化,当节点删除时,其他broker会收到事件通知,重新发起leader选举

八、如果允许 Follower 副本对外提供读服务,你觉得应该如何避免或缓解因 Follower 副本与 Leader 副本不同步而导致的数据不一致的情形?

.......

原文地址:https://www.cnblogs.com/jetqiu/p/11681838.html

时间: 2024-11-04 14:57:28

Kafka副本机制的相关文章

kafka副本机制之数据可靠性

一.概述 为了提升集群的HA,Kafka从0.8版本开始引入了副本(Replica)机制,增加副本机制后,每个副本可以有多个副本,针对每个分区,都会从副本集(Assigned Replica,AR)中,选取一个副本作为Leader副本,所有读写请求都由Leader副本处理,其余的副本被称为Follwer副本,其会从Leader副本拉取消息更新到本地.因此,Follower更像是Leader的热备. 一般情况下,同一个分区的多个副本会被均匀的分配到集群中的不同Broker上,当leader副本所在

Kafka— —副本(均衡负载)

创建一个副本数为3的topic Now create a new topic with a replication factor of three: > bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic 使用describe topics指令,查看副本在集群中每一个broker的分布情况. Okay bu

Kafka副本管理—— 为何去掉replica.lag.max.messages参数

今天查看Kafka 0.10.0的官方文档,发现了这样一句话:Configuration parameter replica.lag.max.messages was removed. Partition leaders will no longer consider the number of lagging messages when deciding which replicas are in sync. 即replica.lag.max.messages参数被正式地移除了,现在topic

HDFS副本机制&负载均衡&机架感知&访问方式&健壮性&删除恢复机制&HDFS缺点

副本机制 1.副本摆放策略 第一副本:放置在上传文件的DataNode上:如果是集群外提交,则随机挑选一台磁盘不太慢.CPU不太忙的节点上:第二副本:放置在于第一个副本不同的机架的节点上:第三副本:与第二个副本相同机架的不同节点上:如果还有更多的副本:随机放在节点中: 2.副本系数 1)对于上传文件到HDFS时,当时hadoop的副本系数是几,那么这个文件的块副本数就有几份,无论以后怎么更改系统副本系数,这个文件的副本数都不会改变,也就是说上传到HDFS系统的文件副本数是由当时的系统副本数决定的

关于副本机制

转自:http://www.cnblogs.com/sxmcACM/p/4127114.html 1.首先说一下函数的副本机制 看一段简单的代码 1 # include<stdio.h> 2 # include<stdlib.h> 3 4 int add(int n, int m) 5 { 6 int z = n + m; 7 return z; 8 } 9 10 int main() 11 { 12 printf("%d\n", add(1, 2)); 13

副本机制

1.首先说一下函数的副本机制 看一段简单的代码 1 # include<stdio.h> 2 # include<stdlib.h> 3 4 int add(int n, int m) 5 { 6 int z = n + m; 7 return z; 8 } 9 10 int main() 11 { 12 printf("%d\n", add(1, 2)); 13 } 当函数返回后,内存已经回收,仍能打印值,这是因为函数的副本机制 2.结构的有副本 1 # in

使用指针做形参来解决函数的副本机制

/*在函数里面改变一个外部变量,就需要变量的地址 如果是数据,需要指向数据的指针存储数据的地址 如果是指针,就需要指向指针的指针存储指针的地址 //二级指针一般用于改变一个字符串指针的指向,指向不同的字符串 */ #include<stdio.h> #include<stdlib.h> char str1[20] = "notepad";char str2[20] = "tasklist";/*   把这两个字符数组作为全局变量 */ //

C语言副本机制

1.除了数组外,其他都有副本机制(包括结构体数组) 2.结构体作为参数具有副本机制,结构体返回值也有副本机制 . 3.函数的参数和返回值都有他的副本机制. #include<stdio.h> int a=10,b=20; static int sum(int aa,int bb){ printf("the aa is 0x%p,%d",&aa,aa); printf("\nthe bb is 0x%p,%d",&bb,bb); aa=10

大数据:Hadoop(HDFS 的设计思路、设计目标、架构、副本机制、副本存放策略)

一.HDFS 的设计思路 1)思路 切分数据,并进行多副本存储: 2)如果文件只以多副本进行存储,而不进行切分,会有什么问题 缺点 不管文件多大,都存储在一个节点上,在进行数据处理的时候很难进行并行处理,节点可能成为网络瓶颈,很难进行大数据的处理: 存储负载很难均衡,每个节点的利用率很低: 二.HDFS 的设计目标 Hadoop Distributed File System(HDFS):源于Google 的 GFS 论文: 设计目标 分布式存储:根据需要,水平横向增加节点: 运行在普通廉价的硬