본문 바로가기
오픈소스/Kafka

[카프카] 리눅스 환경 Kafka 설치 및 클러스터 구성

by sangyeon 2021. 10. 22.
728x90

VM 리눅스 환경에서 아파치 카프카 설치 및 클러스터 구성을 테스트 해보았다.

설치 및 구성은 아파치 공식 문서를 참고하여 진행함.

(https://kafka.apache.org/22/documentation.html)

 

1. 설치 파일 다운로드

https://kafka.apache.org/downloads

 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

위 url에서 최신 버전의 Scala 2.12  - kafka_2.12-3.0.0.tgz (asc, sha512)를 설치 함.

 

 

2. kafka_2.12 Installation

[root@sydev bin]# pwd
/home/kafka
[root@sydev kafka]# tar xzvf kafka_2.12-3.0.0.tgz 

> 간단히 tar.gz 파일 압축 해제로 진행하면 된다.

 

 

3. Zookeeper 실행

[root@sydev kafka_2.12-3.0.0]# ./bin/zookeeper-server-start.sh ./config/zookeeper.properties
...

[2021-10-19 10:15:11,266] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory)

> 위와 같이 binding to port:2181 메세지가 보이면 정상적으로 Zookeeper가 기동된 것이다.

 

 

4. 카프카(Broker) Server Startup

[root@sydev kafka_2.12-3.0.0]# ./bin/kafka-server-start.sh ./config/server.properties
....

[2021-10-19 10:17:59,837] INFO Kafka startTimeMs: 1634606279822 (org.apache.kafka.common.utils.AppInfoParser)
[2021-10-19 10:17:59,838] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)

> KafkaServer id=x started 메세지가 보이면 정상적으로 Broker Server가 기동되었다.

 

 

5. Topic Create & Topic List Check

[root@sydev kafka_2.12-3.0.0]# clear
[root@sydev kafka_2.12-3.0.0]# ./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test

Created topic test.

....

추가적으로 Topic 리스트로 확인

[root@sydev kafka_2.12-3.0.0]# ./bin/kafka-topics.sh --list --bootstrap-server localhost:9092
test

> topic을 생성하고 topic 리스트 확인을 통해 정상적으로 생성되었는지 확인한다.

 

 

6. Send Message

[root@sydev kafka_2.12-3.0.0]# ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>

> Producer를 실행하여 test 라는 토픽에 메시지를 보내기 위해 실행한다. 실행하게 되면 ">"가 프롬프트에서 보인다.

그 뒤에 메세지를 입력하면 된다.

ex)

>test message  
>hi
>my name is sangyeon

 

 

7. Start Consumer

[root@sydev kafka_2.12-3.0.0]# ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

> Consumer 실행하게 되면 Producer 쪽에서 보낸 메세지를 받을 수 있다.

test message  
hi
my name is sangyeon

 

8. Setting up a multi-broker Cluster(클러스터 구성)

[root@sydev kafka_2.12-3.0.0]# cp ./config/server.properties ./config/server-1.properties 
[root@sydev kafka_2.12-3.0.0]# cp ./config/server.properties ./config/server-2.properties

...

config/server-1.properties:
    broker.id=1
    listeners=PLAINTEXT://:9093
    log.dirs=/tmp/kafka-logs-1

config/server-2.properties:
    broker.id=2
    listeners=PLAINTEXT://:9094
    log.dirs=/tmp/kafka-logs-2

> Broker 서버를 띄울 properties 파일을 추가적으로 생성해주고 포트와 로그 경로를 변경해준다.

 

이후에, 추가한 Broker 서버들을 기동해준다.

> bin/kafka-server-start.sh config/server-1.properties &
> bin/kafka-server-start.sh config/server-2.properties &

 

기동시 로그에 아래와 같이 클러스터가 정상적으로 연결됐다는 메세지를 확인할 수 있다.

server-0
[2021-10-19 10:50:52,082] INFO [Partition my-replicated-topic-0 broker=0] ISR updated to 0,1 and version updated to [6] (kafka.cluster.Partition)
[2021-10-19 10:50:54,676] INFO [Partition my-replicated-topic-0 broker=0] ISR updated to 0,1,2 and version updated to [7] (kafka.cluster.Partition)

server-1

[2021-10-19 10:50:52,056] INFO [BrokerToControllerChannelManager broker=1 name=alterIsr]: Recorded new controller, from now on will use broker sydev:9092 (id: 0 rack: null) (kafka.server.BrokerToControllerRequestThread)


server-2
[2021-10-19 10:50:54,583] INFO [BrokerToControllerChannelManager broker=2 name=forwarding]: Recorded new controller, from now on will use broker sydev:9092 (id: 0 rack: null) (kafka.server.BrokerToControllerRequestThread)

 

9. 클러스터 Fail-Over 테스트

 

9-1. 먼저 Replica Factor를 3개 추가해서 클러스터용 신규 토픽을 생성한다.

[root@sydev kafka_2.12-3.0.0]# ./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 1 --topic my-replicated-topic
...
Created topic my-replicated-topic.


=========================
생성된 토픽에 대한 자세한 Describe 설명 조회
[root@sydev kafka_2.12-3.0.0]# bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
Topic: my-replicated-topic TopicId: qf1AFc-STwiZ6uOBX13Amw PartitionCount: 1 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: my-replicated-topic Partition: 0 Leader: 1 Replicas: 0,2,1 Isr: 1,0,2

> Leader : 지정된 파티션에 대한 모든 읽기/쓰기를 담당하는 노드이다. 현재 나의 예제에서는 Leader가 1번(*:9093)이다.

 

9-2. Fail-Over 테스트

- 프로듀서 실행
[root@sydev kafka_2.12-3.0.0]# ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
>my test message 1
>my test message 2


- 컨슈머 실행
[root@sydev kafka_2.12-3.0.0]# ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
my test message 1
my test message 2


현재 리더 역할을 하고 있는 server-1을 kill -9 로 Shutdown 시킨다.
[root@sydev kafka_2.12-3.0.0]# netstat -anp|grep 9093
tcp6       0      0 :::9093                 :::*                    LISTEN      28867/java      


[root@sydev kafka_2.12-3.0.0]# kill -9 28867

===========================================================
Leader인 브로커를 죽인 이후,,


- 프로듀서 
[root@sydev kafka_2.12-3.0.0]# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
>my test message 1
>my test message 2
>
>[2021-10-22 10:52:33,066] WARN [Producer clientId=console-producer] Connection to node 1 (sydev/192.168.56.106:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
[2021-10-22 10:52:33,158] WARN [Producer clientId=console-producer] Connection to node 1 (sydev/192.168.56.106:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
[2021-10-22 10:52:33,333] WARN [Producer clientId=console-producer] Connection to node 1 (sydev/192.168.56.106:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
[2021-10-22 10:52:33,682] WARN [Producer clientId=console-producer] Connection to node 1 (sydev/192.168.56.106:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
[2021-10-22 10:52:34,455] WARN [Producer clientId=console-producer] Connection to node 1 (sydev/192.168.56.106:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

>after failover
>you ok?


- 컨슈머
my test message 1
my test message 2
[2021-10-22 10:52:15,165] WARN [Consumer clientId=consumer-console-consumer-3714-1, groupId=console-consumer-3714] Connection to node 1 (sydev/192.168.56.106:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
[2021-10-22 10:52:15,369] WARN [Consumer clientId=consumer-console-consumer-3714-1, groupId=console-consumer-3714] Connection to node 1 (sydev/192.168.56.106:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
[2021-10-22 10:52:15,697] WARN [Consumer clientId=consumer-console-consumer-3714-1, groupId=console-consumer-3714] Connection to node 1 (sydev/192.168.56.106:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
...(생략)


after failover
you ok?

> 리더 브로커를 죽였지만, 이후에도 after failover, you ok? 메세지가 정상적으로 Producer를 통해 Consumer로 전달되는 것을 볼 수 있다.

 

이번에는 간단하게 리눅스 환경에서 Kafka 설치 및 클러스터 구성을 통한 failover 테스트 까지 해보았다.

 

728x90