keepalived, haproxy, rabbitmq cluster docker로 구축

commandv2

어쩌다 보니 docker로 모두 구현

  • keepalived, haproxy는 인프라 환경에 설치 해도 됨
  • 본인도 처음엔 인프라 환경에서 구동했으나 테스트 환경에서 셧다운이 많다보니 명령어가 귀찮아 도커로 구축

저장소

KEEPALIVED

  • VIP, Floating IP로 불리는 가상 IP는 인프라 서버 1, 2가 서로 체크하며 IP 자동 전환

HAPROXY

  • RABBITMQ, MYSQL 등 접속 세션을 체크하며 장애시 자동 전환
  • 블랙박스 테스트 중이나 HAPROXY에서 동작시 PORT만 확인하며 RABBITMQ, MYSQL 노드가 사용가능한지는 체크하지 않는듯 함
  • HAPROXY HEARTBEAT 프로세스에서 스크립트 실행을 통해 RABBITMQ, MYSQL이 사용 가능한 상태인지 확인 하는 스크립트가 필요함

RABBITMQ

  • CLUSTERING
  • 미러링 설정

기타 확인할 점

  • golang의 syslog 패키지를 활용해서 syslog 서버를 자체 구축한뒤 sentry로 전송 중
  • docker의 컨테이너 모니터링, 서비스 상태 모니터링은 cadvisor, prometheus, sentry로 확인함
  • 부하 테스트 부재
  • Failover 시나리오1, 서버 다운은 keepalived가 failover
  • Failover 시나리오2, keepalived 다운은 백업 서버의 keepalived가 floating ip를 가로채서 failover
  • Failover 시나리오3, haproxy가 뻗은 상태는 keepalived에서 상관 안하는듯 함, keepalived에서 haproxy 상태 체크할 방법이 부재
  • Failover 시나리오4, Rabbit, Mysql, 기타 등등 백업 노드는 proxy단에서 커버 가능

사용법

LOCAL_IP=192.168.0.65
REMOTE_IP=192.168.0.64
SYSLOG_ADDRESS=udp://127.0.0.1:5141
SYSLOG_FORMAT=rfc3164
DSN_URL=
CLUSTER_NAME=cluster
RABBITMQ_CONTAINER_NAME=${CLUSTER_NAME}-r2
RABBITMQ_REMOTE_HOST_NAME=${CLUSTER_NAME}-r1
RABBITMQ_REMOTE_HOST_IP=${REMOTE_IP}
  • default.env server 2 example
LOCAL_IP=192.168.0.64
REMOTE_IP=192.168.0.65
SYSLOG_ADDRESS=udp://127.0.0.1:5141
SYSLOG_FORMAT=rfc3164
DSN_URL=
CLUSTER_NAME=cluster
RABBITMQ_CONTAINER_NAME=${CLUSTER_NAME}-r1
RABBITMQ_REMOTE_HOST_NAME=${CLUSTER_NAME}-r2
RABBITMQ_REMOTE_HOST_IP=${REMOTE_IP}
  • vim ./proxy/keepalived.conf 의 interface name 및 vip 수정
~~~
interface eno1
~~~
virtual_ipaddress {
    192.168.0.66/24 dev eno1
}
~~~
  • vim ./rabbitmq/rabbitmq.conf cluster 도메인 수정, container_name 또는 hostname으로 연동 (rabbitmq 클러러스터 도메인 기반)
cluster_formation.classic_config.nodes.1 = rabbit@cluster-r1
cluster_formation.classic_config.nodes.2 = rabbit@cluster-r2
  • ./restart.sh
  • 리스타트 스크립트는 모든 컨테이너 다날림, 주의
  • 테스트용도로 모든 포트는 오픈되어 있으므로 포트 오픈 주의

reference