CC00043.kafka——|Hadoop&kafka.V28|——|kafka.v28|增加分区.v01|

一、增加分区
### --- 创建主题:分区副本均为1

[root@hadoop ~]# kafka-topics.sh --zookeeper localhost:2181/myKafka \
--create --topic topic_demo_001 --partitions 1 --replication-factor 1
 
[root@hadoop ~]# kafka-topics.sh --zookeeper localhost:2181/myKafka --describe -topic topic_demo_001
Topic:topic_demo_001    PartitionCount:1    ReplicationFactor:1 Configs:
    Topic: topic_demo_001   Partition: 0    Leader: 0   Replicas: 0 Isr: 0
### --- 为topic_demo_001增加副本:通过--alter修改主题的分区数,增加分区。

[root@hadoop ~]# kafka-topics.sh --zookeeper localhost/myKafka --alter \
--topic topic_demo_001 --partitions 2
 
~~~     # 查看分区增加后配置
[root@hadoop ~]# kafka-topics.sh --zookeeper localhost:2181/myKafka --describe -topic topic_demo_001
Topic:topic_demo_001    PartitionCount:2    ReplicationFactor:1 Configs:
    Topic: topic_demo_001   Partition: 0    Leader: 0   Replicas: 0 Isr: 0
    Topic: topic_demo_001   Partition: 1    Leader: 0   Replicas: 0 Isr: 0
### --- 减少分区:通过命令行工具操作,主题的分区只能增加,不能减少。否则报错:

[root@hadoop ~]# kafka-topics.sh --zookeeper localhost/myKafka \
--alter --topic topic_demo_001 --partitions 1
Error while executing topic command : The number of partitions for a topic can only be increased. Topic topic_demo_001 currently has 2 partitions, 1 would not be an increase.
[2021-09-22 22:22:47,415] ERROR org.apache.kafka.common.errors.InvalidPartitionsException: The number of partitions for a topic can only be increased. Topic topic_demo_001 currently has 2 partitions, 1 would not be an increase.
 (kafka.admin.TopicCommand$)
二、分区副本的分配-了解
### --- 副本分配的三个目标:

~~~     均衡地将副本分散于各个broker上
~~~     对于某个broker上分配的分区,它的其他副本在其他broker上
~~~     如果所有的broker都有机架信息,尽量将分区的各个副本分配到不同机架上的broker。
### --- 在不考虑机架信息的情况下:

~~~     第一个副本分区通过轮询的方式挑选一个broker进行分配。
~~~     该轮询从broker列表的随机位置进行轮询。
~~~     其余副本通过增加偏移进行分配。
### --- 分配案例:

broker-0 broker-1 broker-2 broker-3 broker-4
   p0       p1      p2      p3      p4   (1st replica)
   p5       p6      p7      p8      p9   (1st replica)

   p4       p0      p1      p2      p3   (2nd replica)
   p8       p9      p5      p6      p7   (2nd replica)

   p3       p4      p0      p1      p2   (3nd replica)
   p7       p8      p9      p5      p6   (3nd replica)
### --- 考虑到机架信息,首先为每个机架创建一个broker列表。
~~~     如: 三个机架(rack1,rack2,rack3),六个broker(0,1,2,3,4,5)

brokerID -> rack  0 -> "rack1", 1 -> "rack3", 2 -> "rack3", 3 -> "rack2", 4 -> "rack2", 5 -> "rack1"
rack1:0,5
rack2:3,4
rack3:1,2
~~~     这broker列表为rack1的0,rack2的3,rack3的1,rack1的5,rack2的4,rack3的2
~~~     即:0, 3, 1, 5, 4, 2
### --- 通过简单的轮询将分区分配给不同机架上的broker:

~~~     每个分区副本在分配的时候在上一个分区第一个副本开始分配的位置右移一位。
~~~     六个broker,六个分区,正好最后一个分区的第一个副本分配的位置是该broker列表的最后一个。
~~~     如果有更多的分区需要分配,则算法开始对follower副本进行移位分配。
~~~     这主要是为了避免每次都得到相同的分配序列。
### --- 此时,如果有一个分区等待分配(分区6),这按照如下方式分配:

~~~     6 -> 0,4,2 (而不是像分区0那样重复0,3,1)
~~~     跟机架相关的副本分配中,永远在机架相关的broker列表中轮询地分配第一个副本。 
~~~     其余的副本,倾向于机架上没有副本的broker进行副本分配,除非每个机架有一个副本。
~~~     然后其他的副本又通过轮询的方式分配给broker。
~~~     结果是,如果副本的个数大于等于机架数,保证每个机架最少有一个副本。 
~~~     否则每个机架最多保有一个副本。 
~~~     如果副本的个数和机架的个数相同,并且每个机架包含相同个数的broker,
~~~     可以保证副本在机架和broker之间均匀分布。
[zk: localhost:2181(CONNECTED) 4] get /myKafka/brokers/topics/topic_demo_001/partitions/0/state
{"controller_epoch":10,"leader":0,"version":1,"leader_epoch":0,"isr":[0]}
cZxid = 0x5e4
### --- topic_demo_001主题的分区0分配信息:

~~~     leader分区在broker1上,同步副本分区是1和2,
~~~     也就是在broker1和broker2上的两个副本分区是同步副本分区,其中一个是leader分区。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值