실제 운영 환경에서 고가용성과 성능을 고려할 때, RocketMQ의 이중 마스터(Master-Master) 아키텍처는 충분한 안정성을 제공합니다. 아래에서는 두 대의 리눅스 서버를 활용해 이중 마스터 클러스터를 구축하는 절차를 설명합니다.
서버 정보
- 서버 A:
121.43.181.101 - 서버 B:
47.114.41.151
1. 설치 파일 다운로드 및 압축 해제 (A, B 동시 수행)
공식 미러 사이트에서 최적화된 버전을 다운로드하고, 지정 디렉토리에 배치합니다.
wget http://mirrors.hust.edu.cn/apache/rocketmq/4.3.0/rocketmq-all-4.3.0-bin-release.zip
unzip rocketmq-all-4.3.0-bin-release.zip -d /opt/
cd /opt && mv rocketmq-all-4.3.0-bin-release rocketmq
2. JVM 메모리 설정 조정 (A, B 동시)
기본적으로 높은 메모리를 요구하지만, 테스트 환경이나 리소스 제약이 있는 경우 다음과 같이 낮은 사양으로 조정합니다.
JVM 옵션 수정 – NameServer 실행 스크립트
vim /opt/rocketmq/bin/runserver.sh
다음 줄을 찾아 적절한 값으로 변경:
# 기존:
# JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g..."
# 변경 후:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JVM 옵션 수정 – Broker 실행 스크립트
vim /opt/rocketmq/bin/runbroker.sh
다음 줄을 수정:
# 기존:
# JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g..."
# 변경 후:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
3. Broker-A 설정 파일 구성 (서버 A 전용)
설정 파일 경로: /opt/rocketmq/conf/2m-noslave/broker-a.properties
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
namesrvAddr=121.43.181.101:9876;47.114.41.151:9876
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10911
brokerIP1=121.43.181.101
storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
storePathConsumeQueue=/data/rocketmq/store/consumequeue
storePathIndex=/data/rocketmq/store/index
storeCheckpoint=/data/rocketmq/store/checkpoint
abortFile=/data/rocketmq/store/abort
maxMessageSize=65536
fileReservedTime=48
deleteWhen=04
4. Broker-B 설정 파일 구성 (서버 B 전용)
설정 파일 경로: /opt/rocketmq/conf/2m-noslave/broker-b.properties
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
namesrvAddr=121.43.181.101:9876;47.114.41.151:9876
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10911
brokerIP1=47.114.41.151
storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
storePathConsumeQueue=/data/rocketmq/store/consumequeue
storePathIndex=/data/rocketmq/store/index
storeCheckpoint=/data/rocketmq/store/checkpoint
abortFile=/data/rocketmq/store/abort
maxMessageSize=65536
fileReservedTime=48
deleteWhen=04
참고: 각 서버는 자신의 IP 주소와 일치하는 설정 파일만 사용하며,
brokerName과brokerIP1값이 정확히 매핑되어야 합니다.
5. 서비스 시작 순서
먼저 NameServer를 양쪽 서버에서 모두 실행한 후, 각각의 Broker를 시작합니다.
NameServer 시작 (A와 B 모두 수행)
mkdir -p /data/rocketmq/logs
nohup sh /opt/rocketmq/bin/mqnamesrv >/data/rocketmq/logs/namesrv.log 2>&1 &
Broker-A 시작 (서버 A에서 실행)
nohup sh /opt/rocketmq/bin/mqbroker -n 121.43.181.101:9876 -c /opt/rocketmq/conf/2m-noslave/broker-a.properties >/data/rocketmq/logs/broker.log 2>&1 &
Broker-B 시작 (서버 B에서 실행)
nohup sh /opt/rocketmq/bin/mqbroker -n 47.114.41.151:9876 -c /opt/rocketmq/conf/2m-noslave/broker-b.properties >/data/rocketmq/logs/broker.log 2>&1 &
주의:
-n옵션에는 각 서버의 로컬 NameServer 주소를 입력해야 하며, 클러스터 전체의 주소는 설정 파일 내namesrvAddr에 명시됩니다.
6. 서비스 종료 방법
정상적인 종료는 아래 스크립트를 통해 수행합니다.
# Broker 종료
sh /opt/rocketmq/bin/mqshutdown broker
# NameServer 종료
sh /opt/rocketmq/bin/mqshutdown namesrv
프로세스 확인이 필요한 경우 다음 명령어를 사용하세요:
ps aux | grep rocketmq