1. 서버 구조
- 사설 인터넷망에 3개의 클러스터용 노드가 있습니다.
- 사설 인터넷망에 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
파일에 저장됩니다. 다음 단계에서 이 키 데이터를 사용하게 됩니다.
ssh-keygen
명령을 실행하여 키를 생성합니다.- 생성된 데이터를
~/.ssh/id_rsa.pub
파일로부터 복사합니다. - SSH로 접속하고자 하는 서버에 접속합니다.
vi ~/.ssh/authorized_keys
명령을 사용하여 인증 키 파일을 수정합니다.- 새로운 라인에 이전에 복사한
~/.ssh/id_rsa.pub
데이터를 붙여넣습니다. chmod 600 ~/.ssh/authorized_keys
명령을 실행하여 권한을 설정합니다.- 이제 로컬에서
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
2.5 카프카 클러스터 설치하기
다음 명령을 사용하여 카프카 클러스터를 설치합니다:
ansible-playbook -i hosts kafka.yml
카프카는 실행되지만 내부적으로 주키퍼와의 연결을 실패하여 일정 시간 후에 타임아웃으로 종료될 수 있습니다. 서버에서 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
이제 이전에 실행한 프로듀서에서 테스트 메시지를 입력하면 출력으로 확인할 수 있습니다.
2.7 스프링 프로젝트와 연결하기
스프링 프로젝트와 카프카 프로젝트를 연결해보겠습니다.
- 먼저 리액터 카프카 패키지를 설치합니다:
implementation 'io.projectreactor.kafka:reactor-kafka:1.3.18'
application.yml
파일에 다음과 같이 카프카 서버에 대한 정보를 설정합니다:
spring: kafka: bootstrap-servers: peter-kafka01.foo.bar:9092,peter-kafka02.foo.bar:9092,peter-kafka02.foo.bar:9092
- 프로젝트를 실행하고 다음 로그가 출력되면 그룹에 성공적으로 조인했음을 의미합니다:
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'}
이제 앤서블을 사용하여 카프카 클러스터를 구축하고 테스트하는 방법에 대해 알게 되었습니다. 카프카를 사용하여 안정적이고 확장 가능한 메시지 시스템을 구축할 수 있습니다.
'Computer Science' 카테고리의 다른 글
Spring Data MongoDB에서 Union 연산을 수행하는법 (0) | 2023.07.19 |
---|---|
Gitlab에 러너를 등록하기 (0) | 2023.07.13 |
Github Action으로 Spring 프로젝트를 Kubernetes에 배포하기 (0) | 2023.03.06 |