카프카 토픽에 전송된 메시지는 가용성을 위해서 여러 브로커에 복제되어 저장된다. 브로커 노드에 장애가 생긴 상황에서도 메시지 서비스가 가능하도록 하기 위함이다. 카프카는 이렇게 복제된 메시지를 Replica라고 부르며 몇 개의 Replica로 복제 할 것인지를 Replication Factor(RF)라고 한다.
수동으로 토픽을 생성할 때 옵션으로 RF 값을 명시할 수 있다.
$ kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 2 --partitions 10 --topic MyTopic
--replication-factor
옵션으로 몇 개의 Replica로 저장할지 지정할 수 있다.
만약 auto.create.topics.enable
옵션이 켜져 있다면 존재하지 않는 토픽으로의 메시지가 도착했을 때 자동으로 토픽이 생성된다. 이 때, 자동으로 생성된 토픽의 RF는 default.replication.factor
로 설정된 값이 사용된다. 이 값의 기본 값은 1이다.
참고로 카프카는 offset 정보를 내부 토픽에 저장하는데 이 토픽의 RF 값은 offsets.topic.replication.factor
설정에 영향을 받는다. 만약 클러스터 사이즈가 이 값보다 작다면 내부 토픽의 생성은 실패하게 된다. 이 설정의 기본 값은 3이다.
카프카 토픽 Replication Factor 변경
RF 값은 카프카 바이너리에 포함되어 있는 kafka-reassign-partitions.sh
스크립트를 이용해서 변경할 수 있다.
우선 RF 값을 변경하려는 토픽의 상태를 조회해보자.
$ kafka-topics.sh --zookeeper localhost:2181 --topic MyTopic --describe
Topic:MyTopic PartitionCount:2 ReplicationFactor:2 Configs:
Topic: MyTopic Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1,2
Topic: MyTopic Partition: 1 Leader: 2 Replicas: 2,1 Isr: 1,2
MyTopic이라는 이름의 토픽의 상세 정보를 조회해보면, ReplicationFactor 값이 2로 지정되어 있음을 확인할 수 있다. 이 토픽의 RF 값을 3으로 변경해보자.
카프카 토픽의 RF 값을 변경하기 위해서는 json 형식의 파일 작성이 필요하다.
{
"version":1,
"partitions":[
{
"topic":"MyTopic",
"partition":0,
"replicas":[1,2,3]
},
{
"topic":"MyTopic",
"partition":1,
"replicas":[2,1,3]
}
]
}
MyTopic 토픽의 replicas 정보에 새로운 노드인 3번을 추가했다. 이 때, replicas 항목에 나오는 순서가 중요한데 replicas 항목의 맨 처음에 나오는 브로커 노드가 그 파티션의 리더가 된다. 이 파일을 replication-factor.json 으로 저장한다.
kafka-reassign-partitions.sh 스크립트와 방금 생성한 json 파일을 이용해서 RF 값을 늘려준다.
$ kafka-reassign-partitions.sh \
--zookeeper localhost:2181 \
--reassignment-json-file replication-factor.json --execute
스크립트의 실행이 완료되면 토픽의 설정이 변경되었는지 다시 확인해본다.
$ kafka-topics.sh --zookeeper localhost:2181 --topic MyTopic --describe
Topic:MyTopic PartitionCount:2 ReplicationFactor:3 Configs:
Topic: MyTopic Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,3,2
Topic: MyTopic Partition: 1 Leader: 2 Replicas: 2,1,3 Isr: 1,3,2
RF 값이 3으로 변경된 것을 확인할 수 있다.
댓글