프로세스와는 무관한 작업으로 인한 지연 현상이 발생하여 비동기 방식 처리를 고민하게되었다.
로그 히스토리를 DB에 기록하는 행위들인데 이 부분들에서 INSERT 시 지연이 발생하여 파일로 쌓았다가 긁어가야 하나.. 어떻게해야 하나 고민 하던 중 WAS 에서 제공하는 JMS 를 사용할까 하다가 ActiveMQ, RabbitMQ 를 셈플링 해보았다.
선택은 Cluster, Mirroring 설정이 간편한 RabbitMQ!!
[Cluster] https://www.rabbitmq.com/clustering.html
[Mirroring] https://www.rabbitmq.com/ha.html
그대로 따라 하기만 하면 잘 된다.
[설치]
esl-erlang_17.5-1~centos~6_amd64.rpm
rabbitmq-server-3.5.1-1.noarch.rpm
우선 서버당 /var/lib/rabbitmq/.erlang.cookie 값을 동일 하게 일치 시킨다.
하지만 난 하나의 물리 서버에 MQ서버 NODE 두개씩 올려보았다.
[rabbitmq@dev01]
- mq11 - /usr/local/mq/domain/mq11
- mq12 - /usr/local/mq/domain/mq12
[rabbitmq@dev02]
- mq21 - /usr/local/mq/domain/mq21
- mq22 - /usr/local/mq/domain/mq21
관리를 편리하게 하기 위해서 NODE 기반 명령어 스크립트를 만들어 둔다.
env.sh 에서 RabbitMQ 포트 번호 및 웹 관리 포트번호를 설정 하게 한다.
각각 디렉토리에 들어가서 각각 start.sh 를 실하면 알아서 뜬다.
env.sh - 기본 동적 설정
1 2 3 4 5 | #!/bin/sh
NODE_PORT=각각 다르게 포트번호
NODE_MANAGEMENT_PORT=각각 다르게 포트번호(웹 관리 포트)
NODE_NAME=각각 NODE 이름
|
start.sh - MQ NODE 시작
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/bin/sh
. . /env .sh
export RABBITMQ_NODE_PORT=$NODE_PORT
export RABBITMQ_SERVER_START_ARGS= "-rabbitmq_management listener [{port,$NODE_MANAGEMENT_PORT}]"
export RABBITMQ_NODENAME=$NODE_NAME
export RABBITMQ_MNESIA_DIR= /usr/local/mq/domains/ $NODE_NAME /mnesia
export RABBITMQ_LOG_BASE= /usr/local/mq/domains/ $NODE_NAME /logs
export RABBITMQ_CONFIG_FILE= /usr/local/mq/domains/ $NODE_NAME /rabbitmq
/usr/sbin/rabbitmq-server -detached
echo "============================================================="
echo " RabbitMQ Server 3.5.1-1.noarch ddakker@gmail.com"
echo "-------------------------------------------------------------"
echo "RABBITMQ_NODENAME=$RABBITMQ_NODENAME"
echo "RABBITMQ_NODE_PORT=$RABBITMQ_NODE_PORT"
echo "NODE_MANAGEMENT_PORT=$NODE_MANAGEMENT_PORT"
echo "RABBITMQ_MNESIA_DIR=$RABBITMQ_MNESIA_DIR"
echo "RABBITMQ_LOG_BASE=$RABBITMQ_LOG_BASE"
echo "RABBITMQ_CONFIG_FILE=$RABBITMQ_CONFIG_FILE.config"
echo "============================================================="
|
stop.sh - MQ NODE 중지
1 2 3 4 5 | #!/bin/sh
. . /env .sh
rabbitmqctl -n $NODE_NAME stop
|
app_start.sh - MQ NODE 관리앱 시작
1 2 3 4 5 | #!/bin/sh
. . /env .sh
rabbitmqctl -n $NODE_NAME start_app
|
app_stop.sh - MQ NODE 관리앱 중지
1 2 3 4 5 | #!/bin/sh
. . /env .sh
rabbitmqctl -n $NODE_NAME stop_app
|
ctl.sh - rabbitmqctl NODE 옵션 지정한 명령어
1 2 3 4 5 6 | #!/bin/sh
. . /env .sh
echo "rabbitmqctl -n $NODE_NAME $1 $2 $3"
rabbitmqctl -n $NODE_NAME $1 $2 $3
|
status.sh - 상태 정보
1 2 3 4 5 6 | #!/bin/sh
. . /env .sh
rabbitmqctl -n $NODE_NAME status
rabbitmqctl -n $NODE_NAME cluster_status
|
rabbitmq.config - 기본 설정 파일
1 2 3 4 5 6 7 8 9 | [
{mnesia, [{dump_log_write_threshold, 1000}]},
{rabbit, [
{log_levels, [{connection, info}]}
]},
{rabbitmq_management, [
{redirect_old_port, false }
]}
].
|
[NODE 별로 기동]
[rabbitmq@dev01 mq11]$ ./start.sh
[rabbitmq@dev01 mq12]$ ./start.sh
[rabbitmq@dev02 mq21]$ ./start.sh
[rabbitmq@dev02 mq22]$ ./start.sh
[Clustering] - mq11 을 기준으로 한다.(mq11 에서는 안 해도 됨)
[rabbitmq@dev01 mq12]$ ./app_stop.sh
[rabbitmq@dev01 mq12]$ ./ctl.sh join_cluster mq11@dev01
[rabbitmq@dev01 mq12]$ ./app_start.sh

[rabbitmq@dev02 mq21]$ ./app_stop.sh
[rabbitmq@dev02 mq21]$ ./ctl.sh join_cluster mq11@dev01
[rabbitmq@dev02 mq21]$./app_start.sh
[rabbitmq@dev02 mq22]$ ./app_stop.sh
[rabbitmq@dev02 mq22]$ ./ctl.sh join_cluster mq11@dev01
[rabbitmq@dev02 mq22]$ ./app_start.sh
[Mirroring] - Cluster 되면 아무곳에서 해도 됨
./ctl.sh set_policy 사용해도 되고, 그냥 "admin Tab" -> "Policies" 메뉴에서 UI상으로 하는게 편리!!
애래 Node 부분에 "+3" 부분이 보여야 함(정상/비정상 여부에 따라서 복제된 정보가 파랑숫자, 빨강숫자로 표현됨)
장애 후 복구된 서버에 이전데이터 동기(복제) 처리는 하지 않았음

[웹 접속 계정 생성 및 권한 부여] - Cluster 되면 아무곳에서 해도 됨
[rabbitmq@dev01 mq11]$ ./ctl.sh add_user test 1234
[rabbitmq@dev01 mq11]$ ./ctl.sh set_user_tags test administrator
그냥 "admin Tab" -> "Users" 메뉴에서 UI상으로 하는게 편리!!
앞단에 L4 를 붙이면 좋겠음