본문 바로가기

공부/리눅스

1. Docker 를 이용한 RabbitMQ 클러스터링

728x90

회사 업무로 도커 스웜(Docker swarm)을 이용해 RabbitMQ 클러스터링을 구성하게 됐습니다. 연구실에서는 커널만 하던 고인물인데 회사에서 새로운 프로젝트에 들어가며 낯선 일들이 늘고 결국 간단하게만 사용해봤던 도커를 다시 건드리게됐습니다. 최종 목표는 앞서 언급한데로 도커 스웜을 이용해 클러스터링을 구성하는 것이지만 공부할 겸 단계별로 포스팅을 해보려합니다. 계획은 3단계로 잡고 있습니다.

1. Docker를 이용한 RabbitMQ 클러스터링

2. Docker Image Build를 이용한 클러스터링 용 도커 이미지 생성

3. Docker Swarm을 이용한 RabbitMQ 클러스터링

 

Docker를 이용해 RabbitMQ를 클러스터링 할 때는 다음과 같은 3단계를 거치며, 필요에 따라 미러링 단계를 추가할 수 있습니다.

1. 컨테이너 실행

2. elarng 쿠키 동기화

3. 클러스터링

4. 미러링(선택)

 

본 포스팅에서는 erlang 쿠키 값을 docker run 의 옵션으로 전달 함으로써 위의 1, 2단계를 함께 수행하도록 했습니다.

먼저 초기 설정이 필요한데 도커 설치 방법과 방화벽 해제에 대한 설명은 생략하도록 하겠습니다.

0. 초기 설정

도커 설치 (생략)

 

방화벽 해제(생략)

 

도커 네트워크 생성

도커 컨테이너 간 도메인 명으로 통신하기위해 새로운 네트워크를 생성 한 후 컨테이너에 붙여주는 방법을 사용하였습니다. 따라서 다음 명령어로 네트워크를 하나 생성합니다.

[root@devnode ~]# docker network create --driver bridge mynetwork

 

 

1. 컨테이너 실행

도커를 실행하며 위에서 생성한 네트워크를 옵션으로 전달합니다. 그리고 RabbitMQ에서 사용하는 포트 역시 바인드 시킵니다.

[root@devnode ~]# docker run -d --name rabbitmq_node1 -h rabbitmq_node1 \
-it --network mynetwork \
-p "15672:15672" \
-p "5672:5672" \
-p "25672:25672" \
-p "35197:35197" \
-e RABBITMQ_DEFAULT_USER="rabbitmquser" \
-e RABBITMQ_DEFAULT_PASS="rabbitmqpass" \
-e RABBITMQ_ERLANG_COOKIE="mycookie" \
rabbitmq:latest

 

[root@devnode ~]# docker run -d --name rabbitmq_node2 -h rabbitmq_node2 \
-it --network mynetwork \
-p "15673:15672" \
-p "5673:5672" \
-p "25673:25672" \
-p "35198:35197" \
-e RABBITMQ_DEFAULT_USER="rabbitmquser" \
-e RABBITMQ_DEFAULT_PASS="rabbitmqpass" \
-e RABBITMQ_ERLANG_COOKIE="mycookie" \
rabbitmq:latest

 

설명(추가 예정)

 

도커를 실행만으로는 Web UI에 접속 할 수 없습니다. 또한 클러스터링으로 연결 했을 때도 노드들의 상태정보에는 Node staticstics not available 이라고 표시 될 수 있으므로 모든 노드에서 rabbitmq-management를 enable해줍니다

 

[root@devnode ~]# docker exec rabbitmq_node1 rabbitmq-plugins enable rabbitmq_management

[root@devnode ~]# docker exec rabbitmq_node2 rabbitmq-plugins enable rabbitmq_management

 

 

2. 클러스터링

클러스터에 노트드를 추가하기위해 join_cluster 명령어를 입력해야하며, 이 명령어를 입력하기 전 rabbitmq는 종료된 상태여야합니다. 

[root@devnode ~]# docker exec rabbitmq_node2 rabbitmqctl stop_app

rabbitmq가 종료되면 노드2번에서 노드 1번으로 조인합니다. 이 때, 연결 대상 노드 정보는 status 명령어로 확인할 수 있습니다

[root@devnode ~]# docker exec rabbitmq_node1 rabbitmqctl status

[root@devnode ~]# docker exec rabbitmq_node2 rabbitmqctl join_cluster rabbit@rabbitmq_node1

[root@devnode ~]# docker exec rabbitmq_node2 rabbitmqctl start_app

그리고나서 RabbitMQ Web UI에 접속하면 다음과 같은 화면을 볼 수 있습니다.

3. 미러링

[root@devnode ~]# docker exec rabbitmq_node1 rabbitmqctl set_policy ha "." '{"ha-mode":"all"}'

(모드설명 추가 예정)