[OpenStack] RabbitMQ 클러스터 파티션 발생 및 DB 커넥션 이슈
노드를 증설하거나 네트워크 플랩(Flapping)이 발생했을 때, OpenStack 서비스들이 간헐적으로 멈추거나 로그에 AMQP server on ... is unreachable 에러가 도배되는 현상이 발생했다.
결국 원인은 **RabbitMQ의 네트워크 파티션(Network Partition)**과 그로 인한 MariaDB Galera Cluster의 동기화 지연이었다. Kolla-Ansible 환경에서의 복구 과정을 정리한다.
1. 증상 확인
Nova-compute 로그에서 RPC 타임아웃이 발생하거나, 인스턴스 생성 요청이 Build 상태에서 멈춰버림.
RabbitMQ 컨테이너 내부에서 상태를 확인했을 때, 특정 노드가 파티션 된 것을 확인.
# RabbitMQ 컨테이너 진입
$ docker exec -it rabbitmq bash
# 클러스터 상태 확인
$ rabbitmqctl cluster_status
출력 결과 중 partitions 항목에 노드 정보가 떠 있다면, 해당 노드는 클러스터에서 격리된 상태다.
2. RabbitMQ 파티션 복구
RabbitMQ는 파티션이 발생하면 데이터 일관성을 위해 자동으로 합쳐지지 않는 모드(pause_minority 등)로 동작하는 경우가 많다. 수동으로 동기화를 맞춰줘야 한다.
가장 "Problematic"한(파티션 된) 노드의 RabbitMQ 컨테이너를 재시작하는 것이 가장 빠르다. 하지만 Kolla 환경에서는 다음 절차를 권장한다.
Start App: 다시 시작.
$ rabbitmqctl start_app
Reset (주의: 데이터 초기화): 클러스터 조인을 위해 초기화. (마스터가 살아있다면 동기화됨)
$ rabbitmqctl reset
Stop App: 문제가 되는 노드에서 RabbitMQ 애플리케이션만 정지.
$ rabbitmqctl stop_app
3. MariaDB Max Connection 튜닝
노드가 늘어나면 각 서비스(Nova, Neutron, Cinder 등)가 맺는 DB 세션 수도 기하급수적으로 늘어난다. Too many connections 에러가 뜬다면 my.cnf 수정이 필요하다.
Kolla-Ansible은 /etc/kolla/config/mariadb/server.cnf (경로 생성 필요)에 오버라이딩 설정을 넣어야 한다.
[server]
max_connections = 4096
설정 후 kolla-ansible reconfigure -t mariadb로 적용한다. 단순 재시작으로는 적용되지 않으므로 주의.