Big Data/Kafka

[Kafka] 파티션 이동

devidea 2019. 4. 12. 14:40
예전 블로그 글 - [Kafka] Topic의 Replica 분배 로직 분석을 통해 Kafka는 Topic을 만들 때 각 Broker에 Partition을 균일하게 분배한다고 설명한 적이 있다. 하지만 Kafka를 운영하면 각 Topic 별로 쌓이는 데이터 용량이 다르기 때문에 Broker별 디스트 사용량이 차이가 나게 된다. 필자도 회사 업무 중에 디스크 불균형이 발생하여 일부 Topic의 Partition을 디스크가 남은 Broker로 이동하는 작업을 진행하였다.

먼저 어떤 Topic들을 대상으로 이동하면 좋을지 선택해야 했다.
모니터링 metric을 수집하기 때문에, 수집된 metric으로 판단을 해도 좋다. 에를들면, kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec metric으로 message가 Topic별 들어오는 메세지량을 알 수 있으므로 판단 근거가 된다.

하지만 필자는 다른 방식으로 이동할 Topic을 구분하였다.
디크스가 제일 모자른 Broker의 로그가 위치하는 디렉토리에서 제일 용량을 많이 차지하는 Topic을 뽑아냈다.

du -h --max-depth=1 | sort -rh | head

{Topic}-{Partition}의 규칙으로 디렉토리가 구성되기 때문에 어떤 Topic의 Partition이 데이터가 많은지 알 수 있다.

이동할 대상이 되는 Topic의 Partition을 결정했다면 이동을 하고자 하는 Broker의 정보를 담는 json 파일을 만들어야 한다.
아래 json은 Partition 이동을 위한 예시이다.
{
  "partitions": [
    {
      "topic": "test-topic",
      "partition": 0,
      "replicas": [2,3,4]
    },
    {
      "topic": "test-topic",
      "partition": 1,
      "replicas": [5,6,7]
    }
  ],
  "version": 1
}

json의 내용을 보면 이동하고자 하는 Topic과 Partition을 적고 이동할 Broker를 replicas 값에 배열 형태로 넣어주면 된다. 여기서 주의할 점은 replicas에 첫번째 값이 Partition의 master Broker로 동작함이다. 그래서 필자는 파티션 이동을 할 때 전체 replica를 다 이동하지 않고 대개 master를 제외한 replica Broker만 이동을 했었다. master Broker를 유지해서 데이터 입수에 대한 downtime을 최소화하기 위해서이다.

Partition 이동에 대한 command는 아래와 같다.
# 이동 요청
./bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file partitions-to-move.json --execute
# 이동 검증
./bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file partitions-to-move.json --verify

그리고 Partition 이동 시에 추가 팁을 드리자면. retention을 줄일 수 있을 만큼 줄인 다음에 시도를 하는 것이 좋다. Partition을 이동한다는 것은 결국 다른 Broker로 replica 작업을 처음부터 한다는 의미이므로 이동할 데이터가 많을 수록 시간이 소요가 오래 걸린다. 필자는 운영 중에 데이터 크기를 고려하지 않고 큰 Topic을 이동하느라 Partition 조정 시간이 1시간 넘게 걸린 적도 있다.

글을 다 작성했더니 고승범님의 블로그 글과 내용이 많이 겹치는 것 같다. 두 글을 참고해서 운영상 필요한 부분을 참고하면 좋을 듯 하다.


관련 문서


반응형