1. 서버 구조

  1. 사설 인터넷망에 3개의 클러스터용 노드가 있습니다.
  2. 사설 인터넷망에 1개의 프로젝트 배포용 노드가 있습니다.

2. 앤서블 설정하기

2.1 배포 서버 DNS 설정하기

배포 서버를 정의하기 위해 /etc/hosts 파일에 호스트를 설정해야 합니다. 호스트 설정은 각 운영 체제마다 다를 수 있습니다. 리눅스 기반 시스템에서는 다음과 같이 /etc/hosts 파일을 수정합니다:

//... 10.12.204.13 peter-zk01.foo.bar 10.12.204.13 peter-kafka01.foo.bar 10.12.204.14 peter-zk02.foo.bar 10.12.204.14 peter-kafka02.foo.bar 10.12.204.17 peter-zk03.foo.bar 10.12.204.17 peter-kafka03.foo.bar 

2.2 SSH 허용하기

앤서블을 사용하여 서버에 접속할 때마다 비밀번호를 입력하는 것은 번거로울 수 있습니다. 따라서 배포 서버에 대한 SSH 접속을 허용하는 것이 좋습니다.

2.2.1 SSH 키 생성

ssh-keygen 명령을 사용하여 SSH 키를 생성합니다. 생성된 키 데이터는 ~/.ssh/id_rsa.pub 파일에 저장됩니다. 다음 단계에서 이 키 데이터를 사용하게 됩니다.

  1. ssh-keygen 명령을 실행하여 키를 생성합니다.
  2. 생성된 데이터를 ~/.ssh/id_rsa.pub 파일로부터 복사합니다.
  3. SSH로 접속하고자 하는 서버에 접속합니다.
  4. vi ~/.ssh/authorized_keys 명령을 사용하여 인증 키 파일을 수정합니다.
  5. 새로운 라인에 이전에 복사한 ~/.ssh/id_rsa.pub 데이터를 붙여넣습니다.
  6. chmod 600 ~/.ssh/authorized_keys 명령을 실행하여 권한을 설정합니다.
  7. 이제 로컬에서 ssh 명령을 사용하여 비밀번호 없이 서버에 접속할 수 있습니다.

2.3 앤서블 스크립트 다운로드

다음 명령을 사용하여 앤서블 스크립트를 다운로드합니다:

git clone https://github.com/onlybooks/kafka2 

그리고 kafka2/chapter2/ansible_playbook 디렉토리로 이동합니다.

hosts 파일을 다음과 같이 수정합니다. 보통 사용자는 root를 사용하므로 ansible_user를 root로 설정합니다:

[zkhosts] peter-zk01.foo.bar peter-zk02.foo.bar peter-zk03.foo.bar  [kafkahosts] peter-kafka01.foo.bar peter-kafka02.foo.bar peter-kafka03.foo.bar  [kerberoshosts] peter-zk01.foo.bar  [all:vars] ansible_user=root 

2.4 주키퍼 클러스터 설치하기

다음 명령을 사용하여 주키퍼 클러스터를 설치합니다:

ansible-playbook -i hosts zookeeper.yml 

Kafka ZooKeeper

2.5 카프카 클러스터 설치하기

다음 명령을 사용하여 카프카 클러스터를 설치합니다:

ansible-playbook -i hosts kafka.yml 

Kafka Cluster Installation

카프카는 실행되지만 내부적으로 주키퍼와의 연결을 실패하여 일정 시간 후에 타임아웃으로 종료될 수 있습니다. 서버에서 systemctl status kafka-server 명령을 실행하여 아무런 에러가 없는지 확인하면 성공입니다.

2.6 카프카 테스트하기

카프카가 올바르게 작동하는지 확인하기 위해 토픽을 생성하고 샘플 데이터를 프로듀스하고 컨슈밍해보겠습니다.

2.6.1 토픽 생성하기

서버에 접속하여 다음 명령을 실행합니다:

/usr/local/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test-topic --partitions 1 --replication-factor 3 

출력으로 다음과 같이 "Created topic test-topic."이 나오면 성공입니다.

2.6.2 메시지 전송하기

샘플 메시지를 프로듀스해보겠습니다. 다음 명령을 실행하세요:

/usr/local/kafka/bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic 

> 기호가 나타나면 원하는 메시지를 입력하고 엔터 키를 눌러 메시지를 전송할 수 있습니다.

2.6.3 메시지 수신하기

2번 서버에서 메시지를 수신해보겠습니다. 다음 명령을 실행하세요:

/usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic 

이제 이전에 실행한 프로듀서에서 테스트 메시지를 입력하면 출력으로 확인할 수 있습니다.

Kafka Consumer Output

 

Kafka Producer Output

2.7 스프링 프로젝트와 연결하기

스프링 프로젝트와 카프카 프로젝트를 연결해보겠습니다.

  1. 먼저 리액터 카프카 패키지를 설치합니다:
implementation 'io.projectreactor.kafka:reactor-kafka:1.3.18' 
  1. application.yml 파일에 다음과 같이 카프카 서버에 대한 정보를 설정합니다:
spring:   kafka:     bootstrap-servers: peter-kafka01.foo.bar:9092,peter-kafka02.foo.bar:9092,peter-kafka02.foo.bar:9092 
  1. 프로젝트를 실행하고 다음 로그가 출력되면 그룹에 성공적으로 조인했음을 의미합니다:
2023-07-12T17:59:46.090+09:00  INFO 3367 --- [y-trace-group-1] o.a.k.c.c.internals.ConsumerCoordinator  : [Consumer clientId=consumer-user-activity-trace-group-1, groupId=user-activity-trace-group] Successfully joined group with generation Generation{generationId=1, memberId='consumer-user-activity-trace-group-1-67094391-d771-4ec8-ba5e-d56cdf0e8083', protocol='range'} 

이제 앤서블을 사용하여 카프카 클러스터를 구축하고 테스트하는 방법에 대해 알게 되었습니다. 카프카를 사용하여 안정적이고 확장 가능한 메시지 시스템을 구축할 수 있습니다.

+ Recent posts