좀전에 카프카에 대허서 알아 봤다.
간단하게 설치도 하고 했는데 실 운영에서는 그렇게 못쓴다. 물론 주기퍼도 여러대 카프카도 여러대로 써야 하나의 서버가 죽더라도 운영은 계속 되어야 한다. 우리는 카프카의 멀티 broker의 설정에 대해 알아 보자

기존의 server.properties는 냅두고 server1.properties 와 server2.properties를 만들자.

cp config/server.properties config/server1.properties
cp config/server.properties config/server2.properties

server.properties 복사하여 server1.properties, server2.properties를 아래와 같이 변경을 하자.

server1.properties

broker.id=1
port=9093
log.dir=/tmp/kafka-logs-1

server2.properties

broker.id=2
port=9094
log.dir=/tmp/kafka-logs-2

위와 같이 설정만 하면 끝이다. 그런 후에 주기퍼를 실행하고 server.properties실행 server1.properties 실행 server2.properties 실행 순서로 실행을 시키자.

bin/kafka-server-start.sh config/server.properties
bin/kafka-server-start.sh config/server1.properties
bin/kafka-server-start.sh config/server2.properties

그리고 topic을 생성해야 된다.

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic

topic 생성도 기존의 생성과는 약간 다르다. 현재 있는 topic의 리스트를 출력해보면 생성 되어있는 것을 확인 할 수 있다.

bin/kafka-topics.sh --list --zookeeper localhost:2181
my-replicated-topic
test

필자가 하다가 꼬였는지 server.properties의 클러스팅이 되지 않아 다시 server3.properties 를 만들어서 했다

broker.id=3
port=9095
log.dir=/tmp/kafka-logs-3

만약 상관 없이 된다면 위와 같이 하지 않아도 된다.
다음으로 topic의 정보들을 확인하여 보자.

bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic   PartitionCount:1    ReplicationFactor:3 Configs:
    Topic: my-replicated-topic  Partition: 0    Leader: 2   Replicas: 2,3,1 Isr: 3,1,2

현재 Leader 3이고 Replicas는 구성된 노드의 목록이다. Isr는 현재 살아있는 노드를 출력하는 것이다. 저 숫자는 broker.id 를 기준으로 출력된다.

bin/kafka-console-producer.sh --broker-list localhost:9093 --topic my-replicated-topic

필자는 localhost:9093으로 접속했다. 원래는 9092로 접속하면 된다. 그리고나서 메시지를 입력해보자.

hi wonwoo
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic
hi wonwoo

그후에 consumer를 실행시켜 해당 메시지가 왔는지 확인해보자. 그럼 정상적으로 메세지가 출력되었다.
그리고 나서 클러스팅을 위해 리더를 죽여보자. 현재 리더가 필자와 다를 수 있으니 리더의 id를 확인하여 죽이자. 현재 필자의 리더 id는 2이기 때문에 server-2를 찾아서 죽였다.

ps -ef | grep server-2
kill -9 {pid}

kill을 한뒤에 다시 한번 정보를 살펴보자.

bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic   PartitionCount:1    ReplicationFactor:3 Configs:
    Topic: my-replicated-topic  Partition: 0    Leader: 3   Replicas: 2,3,1 Isr: 3,1

현재 필자의 리더의 id는 3이며 살아있는 노드들은 3번과 1번임을 알수 있다. 그후에 다시 consumer에 접속을 해보자.

bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic
hi wonwoo

리더를 죽여도 잘 실행 된다.
만약 consumer를 실행 시키는 중에 kill을 하면 에러로그가 일정시간동안 올라온다. 리더를 승격 시키기 전까지의 통신을 할 수 없으므로 나오는 에러인 듯 싶다. 에러로그가 일정 시간 출력 되고 다시 메시지를 발행하면 정상적으로 consumer가 받을 수 있다.
하지만 그 시간까지는 메시지가 유실 되는 듯 하다. 셋팅의 문제이지 않나 싶기도 한데.. 지금은 잘 모르겠다.
아무튼 이렇게 카프카에 대해서 살짝 맛만 봤다. kafka와 spark streaming도 한번 해봐야 겠다.