RocketMQ 하이어빌리티 클러스터 설치 및 설정 매뉴얼

시스템 전제 조건 및 환경 초기화

로켓 MQ(RocketMQ) 클러스터를 배포하기 위해서는 서버 간 네트워크 안정성과 일관된 시간 동기화가 필수적입니다. 먼저 방화벽과 SELinux 는 테스트 환경에서는 비활성화하고, 프로덕션 환경에서는 최소 권한 원칙에 따라 규칙을 적용해야 합니다.

시간 동기화 설정

서버 간 시간 오차는 메시지 순차 처리와 브로커 상태 확인에 치명적이므로 NTP 를 통해 시간을 맞추거나 cron job 으로 외부 NTP 서버를 참고하도록 설정합니다.

# Crontab 을 통한 주기적 시간 갱신
*/5 * * * * /usr/bin/rdate -s ntp.pool.example.org >/dev/null

호스트 네임 매핑

클러스터 노드 간 호출을 위해 DNS 대신 /etc/hosts 파일을 수정하여 직접 IP 와 호스트명을 바인딩하는 것이 효율적입니다.

192.168.10.1 mq-ns-node-01
192.168.10.2 mq-ns-node-02
192.168.10.3 mq-ns-node-03
192.168.10.1 mq-broker-master-01
192.168.10.2 mq-broker-master-02
192.168.10.3 mq-broker-master-03

또한 JDK 가 설치되어 있어야 하며, VM 파라미터 조정을 위해 JVM 메모리 설정이 완료된 상태여야 합니다.

아키텍처 패턴 분석

로켓 MQ 는 여러 가지 클러스팅 방식을 지원하며, 목적에 따라 적절한 모드를 선택해야 합니다.

  • 싱글 마스터: 구성은 간단하지만 장애 발생 시 서비스 중단이 일어나므로 본연의 활용에는 적합하지 않습니다.
  • 다중 마스터: 슬레이브 없이 마스터만 복수 구성하는 방식입니다. 성능 최적화에 유리하며, RAID10 등을 사용하면 데이터 손실 위험을 낮출 수 있습니다. 다만 특정 마스터 다운 시 해당 파티션의 메세지 소비가 일시 중지됩니다.
  • 마스터 - 슬레이브 (비동기): 주종복제가 실시간성을 보장하되 매우 짧은 지연 시간이 발생할 수 있으며, 디스크 장애 시 소량의 데이터 유실이 가능합니다.
  • 마스터 - 슬레이브 (동기): 양쪽 모두 기록 성공 시 응답하므로 데이터 무결성이 가장 높지만, 처리 성능이 약 10% 저하되고 자동 페일오버 기능이 제한적일 수 있습니다.

컴포넌트 역할 정의

NameServer: 중앙 관리 역할을 수행하며 상태 정보를 유지하지 않는 독립적인 구성입니다. 브로커 등록 정보와 토픽 - 큐 매핑 정보를 제공합니다. 단절되면 다른 노드에 영향을 미치지 않으며 고가용성을 확보하기 쉽습니다.

Broker: 실제로 메시지를 저장하고 처리하는 엔진입니다. 모든 NameServer 와 30 초 간격으로 하트비트를 주고받으며 연결 상태를 유지합니다. 연결이 끊어지면 NameServer 는 이를 감지하고 내부 라우팅 정보를 갱신하지만, 클라이언트에게는 즉시 알리지 않습니다.

클러스터 구축 절차 (다중 마스터 모드)

최신 이진 파일 버전은 실험용으로 권장되며, 상용 서비스에는 안정성이 검증된 LTS 버전을 사용하는 것이 좋습니다. 여기서는 4.x 시리즈를 기준으로 진행합니다.

1. 소프트웨어 설치 및 배포

cd /opt/source
wget http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/release-versions/latest.zip
unzip latest.zip -d /opt/apps/rocketmq
ln -s /opt/apps/rocketmq/rocketmq-all-* /opt/middleware/rocketmq

2. 스토리지 및 로그 구조 준비

메시지 데이터는 별도의 파티션 (/data/mq/store) 에 할당하여 시스템 부하를 방지해야 합니다.

mkdir -p /data/mq/store/{commitlog,consumequeue,index}
mkdir -p /var/log/rocketmq/broker
chown -R rocketmq:rocketmq /data/mq /var/log/rocketmq

3. 브로커 설정 커스터마이징

conf/2m-noslave 또는 conf/broker.conf 파일을 기반으로 각 노드의 고유 ID 를 지정해야 합니다.

# 클러스터 식별자
cluster.name=prod-mq-cluster
# 브로커 고유 이름 (노드별 중복 불가)
broker.name=node-broker-01
# 마스터(0) 또는 슬레이브(>0) 지정
broker.id=0
# NameServer 목록 (세미콜론 구분)
name-server.addr=192.168.10.1:9876;192.168.10.2:9876
# Topic 자동 생성 허용 여부
topic.enable-auto-create=true
# 저장소 루트 경로
store.root.dir=/data/mq/store
# 최대 메시지 크기 (바이트 단위)
max.message.size=65536
# 디스크 사용량 임계 비율
disk.max.used.ratio=80
# 로컬 인터페이스 IP 명시 (필수, 멀티 네트워크 카드 경우)
local.ip=192.168.10.1

각 노드마다 위 설정파일을 복사하되 broker.name, name-server.addr, local.ip 값만 실제 환경에 맞게 변경하여 배포합니다.

4. 시퀀스 실행

  1. NameServer 시작: 서비스 의존성에 따라 먼저 구동시켜야 합니다.
    sh bin/mqnamesrv > /var/log/rocketmq/nameserver.log 2>&1 &
  2. Broker 시작: 생성된 설정 파일을 인자로 전달합니다.
    sh bin/mqbroker -c conf/broker-a.properties > /var/log/rocketmq/broker.log 2>&1 &

로그 파일의 최종 라인에 정상 접속 메시지가 출력되는지 확인해야 합니다.

관리 콘솔 (Console) 배포

직접 소스를 빌드하거나 컨테이너 이미지를 활용하여 대시보드를 제공받을 수 있습니다.

옵션 A: Maven 빌드 방식

GitHub 에서 소스를 클론하고 설정 파일을 수정한 뒤 패키징합니다.

git clone https://github.com/apache/rocketmq-externals.git
cd rocketmq-externals/rocketmq-console/src/main/resources
# application.properties 수정
vim application.properties 
# 컴파일러 오류 방지를 위한 pom.xml 플러그인 추가 필요 (Java 8 기준)
mvn clean package -DskipTests

생성된 JAR 파일을 실행하거나 Tomcat 에 WAR 파일을 배포합니다.

옵션 B: Docker 컨테이너 방식

환경 변수를 통해 NameServer 주소를 지정하여 빠르게 띄울 수 있는 방법입니다.

docker pull styletang/rocketmq-console-ng:latest
docker run -d \
  --name mq-console \
  -p 8080:8080 \
  -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.10.1:9876,-Dcom.rocketmq.sendMessageWithVIPChannel=false" \
  styletang/rocketmq-console-ng

웹 브라우저에서 http://{server-ip}:8080 주소로 접근하면 토픽 조회 및 통계 정보가 표시됩니다. 레거시 버전과의 호환성 이슈가 있을 경우 대응 버전의 콘솔 이미지를 선택적으로 사용해야 합니다.

태그: RocketMQ Apache MessageQueue ClusterArchitecture linux

7월 10일 20:14에 게시됨