RabbitMqはkeepalived+haproxyに基づいて高可用性を実現
11033 ワード
1概要
rabbitmqはメッセージキューとして本番環境で広く使用されていますが、単一ノードの場合、障害が発生した後、本番環境が使用できないため、高可用性環境の導入が必要です.
本稿ではkeepalived+haproxyに基づくrabbitmqの高可用性の実現について説明する
rabbitmqのクラスタでは、すべてのノードが読み書き可能であるため、haproxyをバックエンドの任意のrabbitmqにスケジューリングすることができる.
環境準備
3つのノードmq-01 mq-02 mq-03、ここでサーバはredisのサーバノードを多重化しているので、マシン名は無視されます.
hostsファイルの追加
#このステップは重要です.すべてのノードを構成しなければなりません.そうしないと、mq起動がタイムアウトし、クラスタ機能も成功しません.
他の2台のホストはkeepalived+haproxyをインストールするために使用されます
ip:
192.168.70.35
192.168.70.36
vip:192.168.70.37
2コンパイルインストールerlang
サービスパック:otp_src_20.2.tar.gz
コンパイル手順は次のとおりです.
#erlangが正常にインストールされたかどうかをテスト
3コンパイルインストールrabbitmq
サービスパッケージ:rabbitmq-server-generic-unix-3.7.4.tar.xz
フロントが起動し、起動サービスが間違っていないかどうかをテストします.
./rabbitmq/sbin/rabbitmq-server#フロントモード(デフォルト)
バックグラウンド起動、サービスの実行方法を推奨
/app/rabbitmq/sbin/rabbitmq-server-detached#バックグラウンドモードで起動(推奨)、特にwebグラフィックインタフェースを使用する場合
/app/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_management#は、必要がなければrabbitmqサービスのグラフィック管理ポート15672をインストールすることを推奨します.
#デスクトップログインアカウントの作成
#アクセス
http://192.168.70.32:15672/
#起動できない場合は、システムに付属するerlバージョンの問題で/usr/bin/erlを削除し、source PATHファイルを削除すればよい
4高可用性の構成
4.1 mq高可用性の構成
ノードredis-01の.erlang.クッキー権限は777に設定、他の2つのノードにコピーするとともに、権限も777に設定.erlang.クッキーのパスが違うかもしれませんがfindコマンドで検索します
redis-01次のコマンドを実行します.
chmod 777/root/.erlang.cookie
02と03を削除します.erlang.cookie
/root/.erlang.cookie
01で実行
scp/root/.erlang.cookie 192.168.70.33:/root
scp/root/.erlang.cookie 192.168.70.34:/root
コピーが完了すると、01,02,03は以下のように実行され、元の権限を復元します.
chmod 400/root/.erlang.cookie
3台の機械を確認する.erlang.クッキーの値は同じです
cat/root/.erlang.cookie
3つのmqノードを起動
rabbitmq-server -detached
02と03の2つのノードappを停止
rabbitmqctl stop_app
02と03でそれぞれ次のコマンドを実行します.
rabbitmqctl join_cluster rabbit@redis-01
rabbitmqctl start_app
このとき,エラーがなければ,3つのノードのmqがrabbitクラスタを構成する.
クラスタのステータスを表示するには、次のコマンドを使用します.
rabbitmqctl cluster_status
あるrabbitmqを勝手に停止し、データは他の2台から読み取ることができます.
ここでrabbitmqクラスタは完了しており、haproxy+keepalivedを構成して高可用性を実現し、vipを1つだけスケジューリングする必要があります.
4.2ミラーキューの設定
ミラーキューの構成はpolicyの追加で完了し、policyの追加コマンドはrabbitmqctl set_policy[-p Vhost]Name Pattern Definition[priority]-p Vhost:オプションパラメータで、指定したvhostの下のqueueに対してName:policyの名前Pattern:queueのマッチングモード(正規表現)Definition:3つの部分ha-mode,ha-params,ha-sync-mode ha-mode:ミラーキューのモードを指定します.有効な値はall/exactly/nodes allはクラスタのすべてのノードでミラーexactlyは指定された数のノードでミラーリングを行い、ノードの数はha-paramsが指定したnodesは指定されたノードでミラーリングを行い、ノード名ha-params指定ha-params:ha-modeモードで使用するパラメータha-sync-mode:ミラーキュー内のメッセージの同期方式、有効値automatic、manually Priority:オプションパラメータ、policyの優先度
例:
ポリシー名ha-allqueueは、appで始まるすべてのキューをミラー化し、ポリシーモードallですべてのノードにコピーされ、新しいノードが含まれ、ポリシー正規表現「^」はすべての一致するすべてのキュー名を表します.
policyの設定コマンドは次のとおりです.
rabbitmqctl set_policy -p vh ha-allqueue "^"'{"ha-mode":"all"}'
ポリシー名ha-2 numberは、appで始まるすべてのキューをミラー化し、クラスタの2つのノードでミラー化します.
policyの設定コマンドは次のとおりです.
rabbitmqctl set_policy -p vh ha-2number "^app"'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
ポリシー名ha-2 nodeは、appで始まるすべてのキューをミラー化し、クラスタのrabbit@redis-01とrabbit@redis-02指定した2つのノードでミラーリングを完了し、
policyの設定コマンドは次のとおりです.
rabbitmqctl set_policy -p vh ha-2node "^web"'{"ha-mode":"nodes","ha-params":["rabbit@redis-01","rabbit@redis-02"]}'
本番環境は実際の状況に応じて構成することができ、第1の状況は、すべてに一致するが、あるキューが消費されず、クラスタを爆発させると、すべてのキューが影響され、第3の状況はすべての2つのキューを指定し、この2つのキューだけがweb開通のキューミラー情報を持つ.4.3クラスタ管理関連命令
クラスタのステータスの表示
rabbitmq-server cluster-status
クラスタへの参加
rabbitmqctl join_cluster rabbit@redis-01
ポリシーの表示
rabbitmqctl list_policies -p vh
パージポリシー
rabbitmqctl clear_policy -p vh ha-allweb3.0
5 haproxy+keepalivedコンパイルインストール
5.1 haproxyコンパイルインストール
パッケージ:haproxy-1.7.9.tar.gz
5.2 keepalivedコンパイルインストール
keepalivedコンパイルインストールはブログ:、リンクは以下の通りですが、keepalivedのプロファイルに違いがあります.付録を参照してください.他の手順は同じです
https://blog.51cto.com/ghbsunny/2154262
5.3テスト
haproxyとkeepalivedが起動すると、プライマリkeepalivedが切断され、vipは別のサーバに排他されます.
また、vip 192.168.70.37のリスニング5672ポートにアクセスすることで、要求をバックエンドの3台のmqにスケジューリングすることができ、いずれのmq異常も、要求はこの異常なmqにスケジューリングされず、すなわちサービスは正常である.
テスト成功
6付録
6.1 haproxyプロファイル
2台とも同じ構成
6.2 haproxy起動ファイル
6.3 keepalivedプロファイル
プライマリ・プロファイルには3つの違いがあります
router_idが違う
優先度が異なる
state主従が違う
他は同じ
転載先:https://blog.51cto.com/ghbsunny/2154269
rabbitmqはメッセージキューとして本番環境で広く使用されていますが、単一ノードの場合、障害が発生した後、本番環境が使用できないため、高可用性環境の導入が必要です.
本稿ではkeepalived+haproxyに基づくrabbitmqの高可用性の実現について説明する
rabbitmqのクラスタでは、すべてのノードが読み書き可能であるため、haproxyをバックエンドの任意のrabbitmqにスケジューリングすることができる.
環境準備
3つのノードmq-01 mq-02 mq-03、ここでサーバはredisのサーバノードを多重化しているので、マシン名は無視されます.
hostsファイルの追加
#このステップは重要です.すべてのノードを構成しなければなりません.そうしないと、mq起動がタイムアウトし、クラスタ機能も成功しません.
vim /etc/hosts
192.168.70.32 mq-01
192.168.70.33 mq-02
192.168.70.34 mq-03
他の2台のホストはkeepalived+haproxyをインストールするために使用されます
ip:
192.168.70.35
192.168.70.36
vip:192.168.70.37
2コンパイルインストールerlang
サービスパック:otp_src_20.2.tar.gz
コンパイル手順は次のとおりです.
yum -y install make cmake gcc gcc-c++ bison bison-devel ncurses ncurses-devel openssl-devel
tar xf otp_src_20.2.tar.gz -C /app
cd /app/otp_src_20.2/
./configure --prefix=/app/erlang && make && make install
#erlangが正常にインストールされたかどうかをテスト
cd /app/erlang/bin/
./erl
3コンパイルインストールrabbitmq
サービスパッケージ:rabbitmq-server-generic-unix-3.7.4.tar.xz
tar xf rabbitmq-server-generic-unix-3.7.4.tar.xz -C /app
mv /app/rabbitmq_server-3.7.4/ /app/rabbitmq
vim /etc/profile
export PATH=$PATH:/app/erlang/bin:/app/rabbitmq/sbin
source /etc/profile
フロントが起動し、起動サービスが間違っていないかどうかをテストします.
./rabbitmq/sbin/rabbitmq-server#フロントモード(デフォルト)
バックグラウンド起動、サービスの実行方法を推奨
/app/rabbitmq/sbin/rabbitmq-server-detached#バックグラウンドモードで起動(推奨)、特にwebグラフィックインタフェースを使用する場合
/app/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_management#は、必要がなければrabbitmqサービスのグラフィック管理ポート15672をインストールすることを推奨します.
#デスクトップログインアカウントの作成
rabbitmqctl add_vhost vh
rabbitmqctl add_user root hns..2018
rabbitmqctl set_user_tags root management
rabbitmqctl set_permissions -p vh root ".*" ".*" ".*"
#アクセス
http://192.168.70.32:15672/
#起動できない場合は、システムに付属するerlバージョンの問題で/usr/bin/erlを削除し、source PATHファイルを削除すればよい
4高可用性の構成
4.1 mq高可用性の構成
ノードredis-01の.erlang.クッキー権限は777に設定、他の2つのノードにコピーするとともに、権限も777に設定.erlang.クッキーのパスが違うかもしれませんがfindコマンドで検索します
redis-01次のコマンドを実行します.
chmod 777/root/.erlang.cookie
02と03を削除します.erlang.cookie
/root/.erlang.cookie
01で実行
scp/root/.erlang.cookie 192.168.70.33:/root
scp/root/.erlang.cookie 192.168.70.34:/root
コピーが完了すると、01,02,03は以下のように実行され、元の権限を復元します.
chmod 400/root/.erlang.cookie
3台の機械を確認する.erlang.クッキーの値は同じです
cat/root/.erlang.cookie
3つのmqノードを起動
rabbitmq-server -detached
02と03の2つのノードappを停止
rabbitmqctl stop_app
02と03でそれぞれ次のコマンドを実行します.
rabbitmqctl join_cluster rabbit@redis-01
rabbitmqctl start_app
このとき,エラーがなければ,3つのノードのmqがrabbitクラスタを構成する.
クラスタのステータスを表示するには、次のコマンドを使用します.
rabbitmqctl cluster_status
あるrabbitmqを勝手に停止し、データは他の2台から読み取ることができます.
ここでrabbitmqクラスタは完了しており、haproxy+keepalivedを構成して高可用性を実現し、vipを1つだけスケジューリングする必要があります.
4.2ミラーキューの設定
ミラーキューの構成はpolicyの追加で完了し、policyの追加コマンドはrabbitmqctl set_policy[-p Vhost]Name Pattern Definition[priority]-p Vhost:オプションパラメータで、指定したvhostの下のqueueに対してName:policyの名前Pattern:queueのマッチングモード(正規表現)Definition:3つの部分ha-mode,ha-params,ha-sync-mode ha-mode:ミラーキューのモードを指定します.有効な値はall/exactly/nodes allはクラスタのすべてのノードでミラーexactlyは指定された数のノードでミラーリングを行い、ノードの数はha-paramsが指定したnodesは指定されたノードでミラーリングを行い、ノード名ha-params指定ha-params:ha-modeモードで使用するパラメータha-sync-mode:ミラーキュー内のメッセージの同期方式、有効値automatic、manually Priority:オプションパラメータ、policyの優先度
例:
ポリシー名ha-allqueueは、appで始まるすべてのキューをミラー化し、ポリシーモードallですべてのノードにコピーされ、新しいノードが含まれ、ポリシー正規表現「^」はすべての一致するすべてのキュー名を表します.
policyの設定コマンドは次のとおりです.
rabbitmqctl set_policy -p vh ha-allqueue "^"'{"ha-mode":"all"}'
ポリシー名ha-2 numberは、appで始まるすべてのキューをミラー化し、クラスタの2つのノードでミラー化します.
policyの設定コマンドは次のとおりです.
rabbitmqctl set_policy -p vh ha-2number "^app"'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
ポリシー名ha-2 nodeは、appで始まるすべてのキューをミラー化し、クラスタのrabbit@redis-01とrabbit@redis-02指定した2つのノードでミラーリングを完了し、
policyの設定コマンドは次のとおりです.
rabbitmqctl set_policy -p vh ha-2node "^web"'{"ha-mode":"nodes","ha-params":["rabbit@redis-01","rabbit@redis-02"]}'
本番環境は実際の状況に応じて構成することができ、第1の状況は、すべてに一致するが、あるキューが消費されず、クラスタを爆発させると、すべてのキューが影響され、第3の状況はすべての2つのキューを指定し、この2つのキューだけがweb開通のキューミラー情報を持つ.4.3クラスタ管理関連命令
クラスタのステータスの表示
rabbitmq-server cluster-status
クラスタへの参加
rabbitmqctl join_cluster rabbit@redis-01
ポリシーの表示
rabbitmqctl list_policies -p vh
パージポリシー
rabbitmqctl clear_policy -p vh ha-allweb3.0
5 haproxy+keepalivedコンパイルインストール
5.1 haproxyコンパイルインストール
パッケージ:haproxy-1.7.9.tar.gz
tar -xf haproxy-1.7.9.tar.gz -C /usr/local
groupadd -r -g 159 haproxy
useradd -g haproxy -r -s /sbin/nologin -u 159 haproxy
cd /usr/local/haproxy-1.7.9/
make TARGET=linux26 ARCH=X86_64 PREFIX=/app/haproxy
make install PREFIX=/app/haproxy
mkdir /etc/haproxy/
vim /etc/haproxy/haproxy.cfg #
vim /etc/init.d/haproxy #
chmod 777 /etc/init.d/haproxy
service haproxy start
chkconfig --add haproxy
chkconfig --level 2345 haproxy on
5.2 keepalivedコンパイルインストール
keepalivedコンパイルインストールはブログ:、リンクは以下の通りですが、keepalivedのプロファイルに違いがあります.付録を参照してください.他の手順は同じです
https://blog.51cto.com/ghbsunny/2154262
5.3テスト
haproxyとkeepalivedが起動すると、プライマリkeepalivedが切断され、vipは別のサーバに排他されます.
また、vip 192.168.70.37のリスニング5672ポートにアクセスすることで、要求をバックエンドの3台のmqにスケジューリングすることができ、いずれのmq異常も、要求はこの異常なmqにスケジューリングされず、すなわちサービスは正常である.
テスト成功
6付録
6.1 haproxyプロファイル
2台とも同じ構成
vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 info
maxconn 8192
user haproxy
group haproxy
defaults
timeout connect 3500
timeout queue 11000
timeout tarpit 12000
timeout client 30000
timeout http-request 40000
timeout http-keep-alive 5000
timeout server 40000
timeout check 7000
option contstats
option log-health-checks
#################################
## #####
listen admin_stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /haproxy
stats realm welcome login\ Haproxy
stats auth adminuser:password123456789
stats hide-version
stats admin if TRUE
####################################
###
frontend server
bind *:5672
log global
mode tcp
#option forwardfor
default_backend rabbitmq
maxconn 3
backend rabbitmq
mode tcp
log global
balance roundrobin
server mq-01 192.168.70.32:5672 check inter 5s rise 2 fall 3 #check inter 2000 ,rise 2 2 ,fall 3 3
server mq-02 192.168.70.33:5672 check inter 5s rise 2 fall 3
server mq-03 192.168.70.34:5672 check inter 5s rise 2 fall 3
# haproxy , rabbitmq : o.s.a.r.c.CachingConnectionFactory : Channel shutdown: connection error, ,
: HAProxy timeout client , tcp_keepalive_time ( ) timeout client timeout server
; :
frontend mqctl
bind *:15672
log global
mode tcp
#option forwardfor
default_backend mqweb
maxconn 3
timeout client 3h
backend mqweb
mode tcp
log global
balance roundrobin
timeout server 3h
server prd-can3-0-mq01 192.168.70.71:15672 check inter 5s rise 2 fall 3 #check inter 2000 ,rise 2 2 ,fall 3 3
server prd-can3-0-mq02 192.168.70.81:15672 check inter 5s rise 2 fall 3
6.2 haproxy起動ファイル
# ,
vim /etc/init.d/haproxy
#!/bin/sh
#
# haproxy
#
# chkconfig: - 85 15
# description: HAProxy is a free, very fast and reliable solution \
# offering high availability, load balancing, and \
# proxying for TCP and HTTP-based applications
# processname: haproxy
# config: /etc/haproxy/haproxy.cfg
# pidfile: /var/run/haproxy.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
exec="/app/haproxy/sbin/haproxy" # ,
prog=$(basename $exec)
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
cfgfile=/etc/haproxy/haproxy.cfg
pidfile=/var/run/haproxy.pid
lockfile=/var/lock/subsys/haproxy
check() {
$exec -c -V -f $cfgfile $OPTIONS
}
start() {
$exec -c -q -f $cfgfile $OPTIONS
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
echo -n $"Starting $prog: "
# start it up here, usually something like "daemon $exec"
daemon $exec -D -f $cfgfile -p $pidfile $OPTIONS
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
# stop it here, often "killproc $prog"
killproc $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
$exec -c -q -f $cfgfile $OPTIONS
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
stop
start
}
reload() {
$exec -c -q -f $cfgfile $OPTIONS
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
echo -n $"Reloading $prog: "
$exec -D -f $cfgfile -p $pidfile $OPTIONS -sf $(cat $pidfile)
retval=$?
echo
return $retval
}
force_reload() {
restart
}
fdr_status() {
status $prog
}
case "$1" in
start|stop|restart|reload)
$1
;;
force-reload)
force_reload
;;
check)
check
;;
status)
fdr_status
;;
condrestart|try-restart)
[ ! -f $lockfile ] || restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
exit 2
esac
6.3 keepalivedプロファイル
プライマリ・プロファイルには3つの違いがあります
router_idが違う
優先度が異なる
state主従が違う
他は同じ
vim /etc/keepalived/keepalived.conf
#Keepalived
global_defs {
router_id NodeA # ID, ID
}
vrrp_instance VI_1 {
state MASTER #Keepalived 。Master , BACKUP
interface eth0 #
virtual_router_id 35
priority 100 # ,BACKUP
advert_int 1 # , s
authentication { #
auth_type PASS
auth_pass password123456789
}
virtual_ipaddress { #VIP , :
192.168.70.35
}
}
転載先:https://blog.51cto.com/ghbsunny/2154269