본문 바로가기
hadoop

kafka kafka-reassign-partitions.sh를 사용한 파티션 재할당

by kyeongseo.oh 2022. 9. 13.

kafka-reassign-partitions는 아래와 같은 경우 사용된다.

  1. 브로커 간의 리더 불균형을 제어
  2. 한 브로커에서 다른 브로커로 파티션을 재할당하여 기존 클러스터를 확장
  3. 동일한 브로커의 로그 디렉토리 간에 파티션을 재할당하여 브로커에서 사용 가능한 디스크 간의 스토리지 로드 불균형을 해결
  4. 여러 브로커의 로그 디렉토리 간에 파티션을 재할당해 여러 브로커에서 스토리지 로드 불균형을 해결

 

 

test topic의 partition은 아래와 같이 분산되어 있다.

# server01

[root@server01 ~]# ll -d /kafka/kafka-logs/t*
drwxr-xr-x. 2 root root 204 Aug 23 07:12 /kafka/kafka-logs/test-2
[root@server01 ~]# ll -d /kafka/kafka-logs2/t*
drwxr-xr-x 2 root root 204 Aug 23 07:12 /kafka/kafka-logs2/test-0

 

# server02

[root@server01 ~]# ssh server02 "ls -d /kafka/kafka-logs/t*"
/kafka/kafka-logs/test-0
/kafka/kafka-logs/test-1

 

# server03

[root@server01 ~]# ssh server03 "ls -d /kafka/kafka-logs/t*"
/kafka/kafka-logs/test-1
/kafka/kafka-logs/test-2

 

test topic을 describe한다.

[root@server01 ~]# kafka-topics.sh --bootstrap-server server01:9092 --topic test --describe
Topic: test     TopicId: TCzzJwfHTB-QxTQYJpcIKg PartitionCount: 3       ReplicationFactor: 2    Configs: segment.bytes=1073741824
        Topic: test     Partition: 0    Leader: 2       Replicas: 1,2   Isr: 2,1
        Topic: test     Partition: 1    Leader: 2       Replicas: 2,3   Isr: 2,3
        Topic: test     Partition: 2    Leader: 3       Replicas: 3,1   Isr: 3,1

 

해석 : Topic: test     Partition: 0    Leader: 2       Replicas: 1,2   Isr: 2,1
test-0이 broker1과 broker2에 있다는 의미

 

1. 브로커 간 파티션 재할당

broker에서 broker로 파티션을 재할당 한다.

 

현재 partition은 아래와 같이 구성되어 있다.

Partition: 0  Replicas: 1,2
Partition: 1  Replicas: 2,3
Partition: 2  Replicas: 3,1

 

이를 아래와 같은 구조로 파티션을 재할당 한다.

Partition: 0  Replicas: 3,2
Partition: 1  Replicas: 1,3
Partition: 2  Replicas: 2,1

 

1.1 reassign.json을 작성한다. (file 이름은 기호에 맞게 변경 가능함)

{
"version" : 1,
"partitions" : [
  {"topic" : "test", "partition" : 0, "replicas" : [3,2]},
  {"topic" : "test", "partition" : 1, "replicas" : [1,3]},
  {"topic" : "test", "partition" : 2, "replicas" : [2,1]}
]
}

 

1.2 reassign-partitions을 적용한다.

[root@server01 ~]# kafka-reassign-partitions.sh --bootstrap-server server01:9092 --reassignment-json-file reassign.json --execute

Current partition replica assignment

{"version":1,"partitions":[{"topic":"test","partition":0,"replicas":[1,2],"log_dirs":["any","any"]},{"topic":"test","partition":1,"replicas":[2,3],"log_dirs":["any","any"]},{"topic":"test","partition":2,"replicas":[3,1],"log_dirs":["any","any"]}]}

Save this to use as the --reassignment-json-file option during rollback
Successfully started partition reassignments for test-0,test-1,test-2

 

1.3 진행상황을 확인한다.

[root@server01 ~]# kafka-reassign-partitions.sh --bootstrap-server server01:9092 --reassignment-json-file reassign.json --verify
Status of partition reassignment:
Reassignment of partition test-0 is complete.
Reassignment of partition test-1 is complete.
Reassignment of partition test-2 is complete.

Clearing broker-level throttles on brokers 1,2,3
Clearing topic-level throttles on topic test

 

1.4 결과를 확인한다.

[root@server01 ~]# kafka-topics.sh --bootstrap-server server01:9092 --topic test --describe
Topic: test     TopicId: TCzzJwfHTB-QxTQYJpcIKg PartitionCount: 3       ReplicationFactor: 2    Configs: segment.bytes=1073741824
        Topic: test     Partition: 0    Leader: 2       Replicas: 3,2   Isr: 2,3
        Topic: test     Partition: 1    Leader: 1       Replicas: 1,3   Isr: 3,1
        Topic: test     Partition: 2    Leader: 2       Replicas: 2,1   Isr: 1,2

 

추가적으로 아래와 같이 throttle을 조정할 수도 있다.

# throttle 조정 (최대 50mb/s)
kafka-reassign-partitions.sh --bootstrap-server server01:9092 \
  --execute --reassignment-json-file reassign.json --throttle 50000000

 

2. 브로커의 다른 로그 디렉토리에 파티션 재할당

partition이 특정 로그 디렉토리에 몰려있는 경우 디스크 full로 broker 장애가 발생할 수 있다.

 

server01의 test-1을 kafka-logs2에서 kafka-logs로 재할당한다.

[root@server01 ~]# ll -d /kafka/kafka-logs/t*
drwxr-xr-x. 2 root root 204 Aug 23 07:12 /kafka/kafka-logs/test-2
[root@server01 ~]# ll -d /kafka/kafka-logs2/t*
drwxr-xr-x 2 root root 167 Aug 23 09:10 /kafka/kafka-logs2/test-1

 

2.1 reassign.json을 작성한다. (file 이름은 기호에 맞게 변경 가능함) 

[참고] log_dirs의 수는 replicas의 수와 동일해야한다.

또한 test-1의 replicas-1과 /kafka/kafka-logs가 매핑되고, replicas-3과 any가 매핑된다.

{
"version" : 1,
"partitions" : [
  {"topic" : "test", "partition" : 0, "replicas" : [3,2],"log_dirs":["any","any"]},
  {"topic" : "test", "partition" : 1, "replicas" : [1,3],"log_dirs":["/kafka/kafka-logs","any"]},
  {"topic" : "test", "partition" : 2, "replicas" : [2,1],"log_dirs":["any","any"]}
]
}

 

2.2 reassign-partitions을 적용한다.

[root@server01 ~]# kafka-reassign-partitions.sh --bootstrap-server server01:9092 --reassignment-json-file reassign.json --execute
Current partition replica assignment

{"version":1,"partitions":[{"topic":"test","partition":0,"replicas":[3,2],"log_dirs":["any","any"]},{"topic":"test","partition":1,"replicas":[1,3],"log_dirs":["any","any"]},{"topic":"test","partition":2,"replicas":[2,1],"log_dirs":["any","any"]}]}

Save this to use as the --reassignment-json-file option during rollback
Successfully started partition reassignments for test-0,test-1,test-2
Successfully started log directory move for: test-1-1

 

2.3 진행상황을 확인한다.

[root@server01 ~]# kafka-reassign-partitions.sh --bootstrap-server server01:9092 --reassignment-json-file reassign.json --verify
Status of partition reassignment:
Reassignment of partition test-0 is complete.
Reassignment of partition test-1 is complete.
Reassignment of partition test-2 is complete.
Reassignment of replica test-1-1 completed successfully.
Clearing broker-level throttles on brokers 1,2,3
Clearing topic-level throttles on topic test

 

2.4 결과를 확인한다.

[root@server01 kafka-logs2]# ll -d /kafka/kafka-logs/t*
drwxr-xr-x  2 root root 141 Aug 23 09:28 /kafka/kafka-logs/test-1
drwxr-xr-x. 2 root root 204 Aug 23 07:12 /kafka/kafka-logs/test-2

 

3. 리더 재선출

가장 성능이 좋은 broker server나 여유 있는 broker로 leader partition을 재할당 할 때 사용한다.

 

test-1의 leader를 broker1에서 broker3으로 변경한다.

[root@server01 ~]# kafka-topics.sh --bootstrap-server server01:9092 --topic test --describe
Topic: test     TopicId: TCzzJwfHTB-QxTQYJpcIKg PartitionCount: 3       ReplicationFactor: 2    Configs: segment.bytes=1073741824
        Topic: test     Partition: 0    Leader: 2       Replicas: 3,2   Isr: 2,3
        Topic: test     Partition: 1    Leader: 1       Replicas: 1,3   Isr: 3,1
        Topic: test     Partition: 2    Leader: 2       Replicas: 2,1   Isr: 1,2

 

3.1 reassign.json을 작성한다. (file 이름은 기호에 맞게 변경 가능함) 

replicas에서 leader로 선출하고 싶은 broker를 앞으로 옮긴다. 기존 [1,3]에서 [3,1]로 변경하였음

{
"version" : 1,
"partitions" : [
  {"topic" : "test", "partition" : 0, "replicas" : [3,2],"log_dirs":["any","any"]},
  {"topic" : "test", "partition" : 1, "replicas" : [3,1],"log_dirs":["any","any"]},
  {"topic" : "test", "partition" : 2, "replicas" : [2,1],"log_dirs":["any","any"]}
]
}

 

3.2 reassign-partitions을 적용한다.

[root@server01 ~]# kafka-reassign-partitions.sh --bootstrap-server server01:9092 --reassignment-json-file reassign.json --execute
Current partition replica assignment

{"version":1,"partitions":[{"topic":"test","partition":0,"replicas":[2,3],"log_dirs":["any","any"]},{"topic":"test","partition":1,"replicas":[1,3],"log_dirs":["any","any"]},{"topic":"test","partition":2,"replicas":[1,2],"log_dirs":["any","any"]}]}

Save this to use as the --reassignment-json-file option during rollback
Successfully started partition reassignments for test-0,test-1,test-2

 

3.3 결과를 확인한다.

아직 leader가 재선출되지 않은 것을 확인할 수 있다. leader 재선출을 위해서는 별도의 커맨드를 더 실행해야한다.

[root@server01 ~]# kafka-topics.sh --bootstrap-server server01:9092 --topic test --describe
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Topic: test     TopicId: TCzzJwfHTB-QxTQYJpcIKg PartitionCount: 3       ReplicationFactor: 2    Configs: segment.bytes=1073741824
        Topic: test     Partition: 0    Leader: 2       Replicas: 3,2   Isr: 2,3
        Topic: test     Partition: 1    Leader: 1       Replicas: 3,1   Isr: 3,1
        Topic: test     Partition: 2    Leader: 1       Replicas: 2,1   Isr: 1,2

 

3.4 kafka-preferred-replica-election 실행

[root@server01 ~]# kafka-preferred-replica-election.sh --bootstrap-server server01:9092
This tool is deprecated. Please use kafka-leader-election tool. Tracking issue: KAFKA-8405
Successfully completed preferred leader election for partitions test-1, test-0, test-2

 

3.5 결과 확인

leader가 의도한 것과 동일하게 재선출된 것을 확인할 수 있다.

[root@server01 ~]# kafka-topics.sh --bootstrap-server server01:9092 --topic test --describe
Topic: test     TopicId: TCzzJwfHTB-QxTQYJpcIKg PartitionCount: 3       ReplicationFactor: 2    Configs: segment.bytes=1073741824
        Topic: test     Partition: 0    Leader: 3       Replicas: 3,2   Isr: 2,3
        Topic: test     Partition: 1    Leader: 3       Replicas: 3,1   Isr: 3,1
        Topic: test     Partition: 2    Leader: 2       Replicas: 2,1   Isr: 1,2

'hadoop' 카테고리의 다른 글

apache kafka_2.13-2.8.0 설치  (0) 2022.05.03
atlas 로그인 authentication error  (0) 2022.04.27

댓글