
当集群中的⼀个broker宕机后系统可以⾃动故障转移到其他可⽤的副本上,不会造成数据丢失。
--replication-factor 3 1leader+2follower
Follower分区像普通的Kafka消费者⼀样,消费来⾃Leader分区的消息,并将其持久化到⾃⼰的⽇志中。
允许Follower对⽇志条⽬拉取进⾏批处理。
同步节点定义:
下图中
分区P1的Leader是0,ISR是0和1
分区P2的Leader是2,ISR是1和2
分区P3的Leader是1,ISR是0,1,2。
⽣产者和消费者的请求都由Leader副本来处理。Follower副本只负责消费Leader副本的数据和Leader保持同步。
对于P1,如果0宕机会发⽣什么?
Leader副本和Follower副本之间的关系并不是固定不变的,在Leader所在的broker发⽣故障的时候,就需要进⾏
分区的Leader副本和Follower副本之间的切换,需要选举Leader副本。
如何选举?
如果某个分区所在的服务器除了问题,不可⽤,kafka会从该分区的其他的副本中选择⼀个作为新的Leader。之后
所有的读写就会转移到这个新的Leader上。现在的问题是应当选择哪个作为新的Leader。
只有那些跟Leader保持同步的Follower才应该被选作新的Leader。
Kafka会在Zookeeper上针对每个Topic维护⼀个称为ISR(in-sync replica,已同步的副本)的集合,该集合中是
⼀些分区的副本。
只有当这些副本都跟Leader中的副本同步了之后,kafka才会认为消息已提交,并反馈给消息的⽣产者。
如果这个集合有增减,kafka会更新zookeeper上的记录。
如果某个分区的Leader不可⽤,Kafka就会从ISR集合中选择⼀个副本作为新的Leader。
显然通过ISR,kafka需要的冗余度较低,可以容忍的失败数⽐较⾼。
假设某个topic有N+1个副本,kafka可以容忍N个服务器不可⽤。
为什么不⽤少数服从多数的⽅法
少数服从多数是⼀种⽐较常⻅的⼀致性算发和Leader选举法。
它的含义是只有超过半数的副本同步了,系统才会认为数据已同步;
选择Leader时也是从超过半数的同步的副本中选择。
这种算法需要较⾼的冗余度,跟Kafka⽐起来,浪费资源。
譬如只允许⼀台机器失败,需要有三个副本;⽽如果只容忍两台机器失败,则需要五个副本。
⽽kafka的ISR集合⽅法,分别只需要两个和三个副本。
如果所有的ISR副本都失败了怎么办?
此时有两种⽅法可选,
向已经部署好的Kafka集群⾥⾯添加机器,我们需要从已经部署好的Kafka节点中复制相应的配置⽂件,然后把⾥
⾯的broker id修改成全局唯⼀的,最后启动这个节点即可将它加⼊到现有Kafka集群中。
问题:新添加的Kafka节点并不会⾃动地分配数据,⽆法分担集群的负载,除⾮我们新建⼀个topic。
需要⼿动将部分分区移到新添加的Kafka节点上,Kafka内部提供了相关的⼯具来重新分布某个topic的分区。
在重新分布topic分区之前,我们先来看看现在topic的各个分区的分布位置:
在node11搭建Kafka:
拷⻉JDK并安装
此处不需要zookeeper,切记!!!
让配置⽣效:
/etc/profile
拷⻉node1上安装的Kafka
修改node11上Kafka的配置:
启动Kafka:
注意观察node11上节点启动的时候的ClusterId,看和zookeeper节点上的ClusterId是否⼀致,如果是,证明node11和node1在同⼀个集群中。
node11启动的Cluster ID:
zookeeper节点上的Cluster ID:
然后使⽤ kafka-reassign-partitionssh ⼯具⽣成reassign plan
Proposed partition reassignment configuration下⾯⽣成的就是将分区重新分布到broker 1上的结果。我们将这些内容保存到名为resultjson⽂件⾥⾯(⽂件名不重要,⽂件格式也不⼀定要以json为结尾,只要保证内容是json即可),然后执⾏这些reassign plan:
执⾏计划:
这样Kafka就在执⾏reassign plan,我们可以校验reassign plan是否执⾏完成:
查看主题的细节:
分区的分布的确和 *** 作之前不⼀样了,broker 1上已经有分区分布上去了。使⽤ kafka-reassign�partitionssh ⼯具⽣成的reassign plan只是⼀个建议,⽅便⼤家⽽已。其实我们⾃⼰完全可以编辑⼀个reassignplan,然后执⾏它,如下:
将上⾯的json数据⽂件保存到my-topics-to-executejson⽂件中,然后也是执⾏它:
等这个reassign plan执⾏完,我们再来看看分区的分布:
我们可以在新建主题的时候,⼿动指定主题各个Leader分区以及Follower分区的分配情况,即什么分区副本在哪
个broker节点上。
随着系统的运⾏,broker的宕机重启,会引发Leader分区和Follower分区的⻆⾊转换,最后可能Leader⼤部分都
集中在少数⼏台broker上,由于Leader负责客户端的读写 *** 作,此时集中Leader分区的少数⼏台服务器的⽹络I/O,
CPU,以及内存都会很紧张。
Leader和Follower的⻆⾊转换会引起Leader副本在集群中分布的不均衡,此时我们需要⼀种⼿段,让Leader的分
布重新恢复到⼀个均衡的状态。
执⾏脚本:
上述脚本执⾏的结果是:创建了主题tp_demo_03,有三个分区,每个分区两个副本,Leader副本在列表中第⼀个指定的brokerId上,Follower副本在随后指定的brokerId上。
然后模拟broker0宕机的情况:
是否有⼀种⽅式,可以让Kafka⾃动帮我们进⾏修改?改为初始的副本分配?
此时,⽤到了Kafka提供的⾃动再均衡脚本: kafka-preferred-replica-electionsh
先看介绍:
该⼯具会让每个分区的Leader副本分配在合适的位置,让Leader分区和Follower分区在服务器之间均衡分配。
如果该脚本仅指定zookeeper地址,则会对集群中所有的主题进⾏ *** 作,⾃动再平衡。
具体 *** 作:
执⾏ *** 作:
查看 *** 作的结果:
恢复到最初的分配情况。
之所以是这样的分配,是因为我们在创建主题的时候:
在逗号分割的每个数值对中排在前⾯的是Leader分区,后⾯的是副本分区。那么所谓的preferred replica,就是排在前⾯的数字就是Leader副本应该在的brokerId。
实际项目中,我们可能由于主题的副本因子设置的问题,需要重新设置副本因子。
或者由于集群的扩展,需要重新设置副本因子。
topic⼀旦使用又不能轻易删除重建,因此动态增加副本因子就成为最终的选择。
说明:kafka 10版本配置⽂件默认没有defaultreplicationfactor=x, 因此如果创建topic时,不指定–replication-factor 想, 默认副本因⼦为1 我们可以在⾃⼰的 serverproperties 中配置上常⽤的副本因⼦,省去⼿动调整。例如设置defaultreplicationfactor=3, 详细内容可参考官⽅⽂档 > 如今,大多数的人几乎每天都会接触到电脑,电脑俨然已经成为我们生活中的一部分。而服务器硬盘是我们在使用电脑的过程中极其重要的一部分,所有的资料和数据都会保存在硬盘中。在使用电脑和构建网站的时候,选择一款合适的服务器相当重要,当服务器搭建好了,就要对服务器的硬盘进行分区,这样才会避免浪费空间的情况。今天,就让学习啦小编教你如何进行服务区硬盘的分区吧!
服务器硬盘,顾名思义,就是服务器上使用的硬盘。如果说服务器是网络数据的核心,那么服务器硬盘就是这个核心的数据仓库,所有的软件和用户数据都存储在这里。用户用久了服务器硬盘就可能会出现空间不足的情况,那么应该如何分区才能最大限度地利用它的空间呢下面让我们一起来看看!
假设系统的硬盘大小是10G。
/boot 20M
Swap 128M
/root 985G
建立一个20M的/boot分区是为了避免将系统内核文件放到1024磁道以外,如果将/boot做为root分区的一个子目录,内核文件就会安装在root分区的任何地方,因为硬盘的大小超过了8G,所以在启动时就有可能出现问题。建议将交换分区的大小设置为内存的两倍,在这里我们假设系统的内存为64M。最后我们将硬盘的剩余空间全部分给了root分区。
这里的服务器我们假设只提供几种通用的服务,如/>
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)