2 min read

[OpenStack] RabbitMQ 클러스터 파티션 발생 및 DB 커넥션 이슈

[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로 적용한다. 단순 재시작으로는 적용되지 않으므로 주의.