kraft 구성에 대한 기본 작업 참고는 아래 사이트 참고하여 진행 했다. spitha tech blog 인데 이직 해보고 싶은 회사다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ https://medium.com/spitha-techblog/kafka-kraft-435fe2bab1de |
:: 최초 작성 24.09.12 ::
###### kafka 버전 ?
3.8.0 이 최근에 나와서, 겸사겸사 신규 버전으로 테스트 한다.
해당 kafka 디렉토리 구성은 사내 적용하는 구성 기반으로 되어 있으므로,
kafka default setting 구조와는 다른 점을 인지하기바란다.
###### 구성 ?
서버 3대로 구성 한다.
###### properties 수정 ?
kafka_2.13-3.8.0/config/kraft/ 이하에 3개의 파일이 있다.
- server.properties
- broker.properties
- controller.properties
여기서 server.properties 만 수정 하기로 한다.
기존에 서비스 구조를 별도로 구성 했기 때문에, 사내 구성 작업 경로인 /kafka/app/configuration/ 로 파일을 복사하여 작업한다.
kafka+zookeeper용의 properties 중 하나도 server.properties로 동일한 이름을 쓰고 있기 때문에,
해당 파일은 아래와 같이 백업.
$ cp -a server.properites server.properties_zookeeper_240912
KRaft 적용을 위한 server.properties config 중 변경한 내용은 아래와 같다.
변경사항 | 비고 |
node.id=1 | node.id는 구성 서버가 3대라 각각 서버별로 1~3으로 매핑. 기존 server.properties의 broker.id 와 동일한 개념인 듯 싶다. |
controller.quorum.voters=1@broker1:9093,2@broker2:9093,3@broker3:9093 | 기존에 없었던 구성. default 에서 node id@호스트명:9093 으로 해줌. |
advertised.listeners=PLAINTEXT://broker1:9092 | 기존 server.properties도 localhost:9092를 지정한 호스트명(broker1~3) 으로 해줘서, 동일하게 변경해주었다. |
log.dirs=/kaf_data | default 에서 기존 사내 구성으로 만들어둔 데이터 저장 dir로 변경 |
offsets.topic.replication.factor=3 | consumer offset 디렉토리를 broker 수 만큼으로 변경했다. |
** 나머지 log retention이나 segment도 기존 kafka+zookeeper 구성할 때의 설정 값으로 바꿀까 했지만
kraft로 단순 테스트 진행 하는 부분이라 나머지 세팅은 default로 진행한당.
###### 스토리지 지정?
/kaf_log만 지정하면 되는 줄 알았는데,
위 사이트에서는 kafka-storage.sh 를 해줘야 한단다.
대충 아래의 순서인 것 같다.
순서/내용 | 명령어 | 비고 |
1. random uuid 생성 | [kafka@broker1 bin]$ ./kafka-storage.sh random-uuid a8MbaPQ8Q3aXPXlx7liHYA |
kafka-storage.sh 스크립트는 아래 경로에 있다. /kafka/kafka_2.13-3.8.0/bin |
2. server.properties의 log.dir 에 uuid 매핑 | [kafka@broker1 bin]$ ./kafka-storage.sh format -t a8MbaPQ8Q3aXPXlx7liHYA -c /kafka/app/configuration/server.properties Formatting /kaf_data with metadata.version 3.8-IV0. |
위 사이트에서는 format 명령어가 없었는데, 버전업 되면서 바뀐 것으로 보여졌다. Formatting~ 은 명령어 친 후 나온 내용. |
혹시 /kaf_data에 뭔가 내용이 있을까 싶어 확인해보니, meta.properties가 생성 되었다.
kafka+zookeeper 조합일 때는 서버 구성 후 기동 시에 meta.properties가 생성이 됐었는데,
기동 전의 작업으로 아래 경로에 파일이 생긴 것이다.
[kafka@broker1 bin]$ cd /kaf_data [kafka@broker1 kaf_data]$ ll total 8 -rw-r--r--. 1 kafka kafka 249 Sep 12 15:57 bootstrap.checkpoint -rw-r--r--. 1 kafka kafka 122 Sep 12 15:57 meta.properties [kafka@broker1 kaf_data]$ cat meta.properties # #Thu Sep 12 15:57:17 KST 2024 node.id=1 directory.id=wcRHO60oTZFDmy_wI36m4g version=1 cluster.id=a8MbaPQ8Q3aXPXlx7liHYA |
이어서 같은 uuid로 broker2, broker3번에 작업 진행 해준다.
# ./kafka-storage.sh format -t a8MbaPQ8Q3aXPXlx7liHYA -c /kafka/app/configuration/server.properties
>>>> 초반 실수 포인트 <<<<
브로커 서버가 3대라 각각의 브로커에서 random uuid 생성하여 나머지 2대 서버에 매핑 해줘야 한다고 생각 했다.
그래서 맨처음 작업 시 broker2 와 broker3의 meta.properties 파일 내용은 아래와 같았다.
broker2 | broker3 |
[kafka@broker2 kaf_data]$ cat meta.properties # #Thu Sep 12 15:57:43 KST 2024 node.id=2 directory.id=U_P3fRM5GeLWzUqj7gXSxg version=1 cluster.id=G9qCpQzeRgeUPtN21Ft6cw |
[kafka@broker3 kaf_data]$ cat meta.properties # #Thu Sep 12 15:58:13 KST 2024 node.id=3 directory.id=g61OWvgxhH2j5FPJOLSYYw version=1 cluster.id=XTn_nhnsSY--9Q-8MtUBXQ |
서비스 기동 하니 broker 1~3 동일에러 발생 되었고,
[2024-09-12 16:53:33,496] ERROR [RaftManager id=1] Unexpected error INCONSISTENT_CLUSTER_ID in VOTE response: InboundResponse(correlationId=2324, data=VoteResponseData(errorCode=104, topics=[]), source=broker3:9093 (id: 3 rack: null)) (org.apache.kafka.raft.KafkaRaftClient) |
cluster id 문제인 것 같아 chat gpt 확인해보니, 각 서버별로 uuid를 매핑해서 난 문제라고 했다.
나는 당연히 각 서버별로 브로커도 다르고, 로컬 디스크를 받았기 때문에 각자 매핑 해야 한다 생각했는데..
|
그래서 broker2, 3번에 대해 uuid 재매핑을 진행 했다.
1. broker 2,3 shutdown 확인
2. broker 2,3 의 meta.properties 의 cluster id 수정
3. kafka 기동.
** kafka-storage.sh 명령어로 재수행 했더니 에러나서 meta.properties를 지우고 해볼까 하다가
그냥 meta.properties 파일 열어서 cluster.id를 수동으로 수정했다.
이후 kafka+zookeeper 조합일 때 백업해둔 meta.properties 보니,
3개 broker에서의 meta.properties가 전부 동일했다.
<< 기존 meta.properties >>
broker1 | broker2 | broker3 |
# #Wed Sep 04 10:45:18 KST 2024 broker.id=1 version=0 cluster.id=Eku8xcieT6axELzAEvZfog |
# #Wed Sep 04 10:45:17 KST 2024 broker.id=2 version=0 cluster.id=Eku8xcieT6axELzAEvZfog |
# #Wed Sep 04 10:45:17 KST 2024 broker.id=3 version=0 cluster.id=Eku8xcieT6axELzAEvZfog |
다른점 또 하나는 version 이었는데, kraft는 version=1로 확인 되고 있다.
#Thu Sep 12 15:57:43 KST 2024
node.id=2
directory.id=U_P3fRM5GeLWzUqj7gXSxg
version=1
cluster.id=G9qCpQzeRgeUPtN21Ft6cw
###### 기동 ?
과연 될까 ㅋㅋㅋㅋ
졸라 걱정되지만 일단 기동 해본다.
아래는 start script 일부.
export KAF_ENG=/kafka/kafka_2.13-3.8.0 export LOG_DIR_KAFKA=/svc_log/kaf_log export APP_CONF=/kafka/app/configuration LOG_DIR=$LOG_DIR_KAFKA $KAF_ENG/bin/kafka-server-start.sh -daemon $APP_CONF/server.properties |
기동은 했는데,
server.log에 info가 디지게 찍히고, 에러같다 왠지. 뭐가문제일까 ㅋㅋㅋ
broker1 | [2024-09-12 16:47:28,364] INFO [MetadataLoader id=1] initializeNewPublishers: the loader is still catching up because we still don't know the high water mark yet. (org.apache.kafka.image.loader.MetadataLoader) |
broker2 | [2024-09-12 16:47:28,803] INFO [MetadataLoader id=2] initializeNewPublishers: the loader is still catching up because we still don't know the high water mark yet. (org.apache.kafka.image.loader.MetadataLoader) |
broker3 | [2024-09-12 16:47:29,279] INFO [MetadataLoader id=3] initializeNewPublishers: the loader is still catching up because we still don't know the high water mark yet. (org.apache.kafka.image.loader.MetadataLoader) |
그리고 kafka가 알아서 죽음 ㅋㅋㅋㅋ
생각해보니 aws 서비스포트에 9093 추가를 안해줘서, 9093 보안그룹 인바운드 넣어줬다.
그리고 나서 또 다른 Error가 있었으나 위에 >>>> 초반 실수 포인트 <<<< 해결하고 나니 정상적으로 기동 되었다.
###### 데이터 송수신
kraft-topic / rep 3 / part 3
kraft-tgroup
외부 서버에서 9092 로 bootstrap 3대 서버 붙여서 50개 데이터 흘렸고,
kafka+zookeeper 버전과 다를 바 없이 offset 잘 찍혀있는걸 확인 했다.
3대 클러스터가 잘 묶여있어서 조회 되는 부분은 동일 하다.
broker1 | broker2 | broker3 |
[kafka@broker1 kaf_data]$ cat replication-offset-checkpoint | awk '{ if($3 > 0) print $1,$2,$3}' __consumer_offsets 24 53 kraft-topic 1 17 kraft-topic 0 22 kraft-topic 2 11 |
[kafka@broker2 kaf_data]$ cat replication-offset-checkpoint | awk '{ if($3 > 0) print $1,$2,$3}' __consumer_offsets 24 53 kraft-topic 1 17 kraft-topic 0 22 kraft-topic 2 11 |
[kafka@broker3 kaf_data]$ cat replication-offset-checkpoint | awk '{ if($3 > 0) print $1,$2,$3}' __consumer_offsets 24 53 kraft-topic 1 17 kraft-topic 0 22 kraft-topic 2 11 |
topic list와 log 디렉토리 현황
[ topic status ] Topic: kraft-topic TopicId: Vze9VkkDTDu4_KLHLjPq-A PartitionCount: 3 ReplicationFactor: 3 Configs: segment.bytes=1073741824 Topic: kraft-topic Partition: 0 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2 Elr: LastKnownElr: Topic: kraft-topic Partition: 1 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3 Elr: LastKnownElr: Topic: kraft-topic Partition: 2 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1 Elr: LastKnownElr: ------------------------- [ topic partition logfile size changed ] -rw-r--r--. 1 kafka kafka 295 Sep 13 09:50 /kaf_data/kraft-topic-0/00000000000000000000.log -rw-r--r--. 1 kafka kafka 244 Sep 13 09:50 /kaf_data/kraft-topic-1/00000000000000000000.log -rw-r--r--. 1 kafka kafka 174 Sep 13 09:50 /kaf_data/kraft-topic-2/00000000000000000000.log |
** Elr 이라는 개념이 3.8부터 생겼는데, 뭔지 잘 모르겠다.
Epoch leader recovery
Eligible leader replica
둘중 하나일 거 같은데 kafka 문서에서 도저히 못찾겠다..
'업무 > kafka zookeeper' 카테고리의 다른 글
[ERROR 기록] zookeeper 기동 관련(1) (0) | 2024.12.05 |
---|---|
[작성 예정] AWS kafka 구성 (0) | 2024.09.13 |
[etc] Kafdrop (0) | 2024.07.16 |
[kafka][zookeeper] min.insync.replicas (0) | 2024.04.02 |
[업무][kafka] 설치 구성 가안 (0) | 2024.04.01 |