網絡結構如下圖:
共有104、105、106三台RabbitMQ Server,互為集群
其中104和105安裝了Haproxy,每個Haproxy承擔三台RabbitMQ server的負載均衡
兩台Harpoxy采用Keepalived互為主備,VIP是172.16.0.108
操作系統為Ubuntu
以下介紹操作步驟:
1、三台主機安裝RabbitMQ
apt-get install rabbitmq-server
開啟RabbitMQ management,激活控制台以方便MQ的管理與監控
sudo rabbitmq-plugins enable rabbitmq_management
開啟監控后可以輸入http://ip:15672可以登錄管理界面,默認賬戶guest/guest
2、配置MQ集群
2.1 cookie文件
因為RabbitMQ的集群是通過Erlang的集群來實現的,所以,要求三台機器的
/var/lib/rabbitmq/.erlang.cookie 文件內容一致,用VI等工具將它的內容修改為 zHDCGETPYWOWREASJUAB
由於RabbitMQ在啟動Booker時會檢查該文件的權限,必須為400,否則會報錯,所以要修改文件的權限
chmod 400 .erlang.cookie
2.2 修改各機器hosts
172.16.0.104 pzs-test-1
172.16.0.105 pzs-test-2
172.16.0.106 pzs-test-3
保證三台機器可以互相訪問對方
2.3 加入集群
對主節點(104):
#啟動Broker
rabbitmq-server –detached > nohup.out&
#啟動集群
rabbitmqctl start_app
#查看集群狀態
rabbitmqctl cluster_status
對備節點(105、106):
rabbitmq-server –detached > nohup.out&
rabbitmqctl start_app
rabbitmqctl stop_app
#加入集群
rabbitmqctl join_cluster --ram rabbit@pzs-test-1
rabbitmqctl start_app
#查看集群狀態
rabbitmqctl cluster_status
在三台機器運行以下命令:
設置成鏡像隊列
# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' //["^"匹配所有]
3、安裝配置HaProxy
安裝過程省略
修改/etc/haproxy/haproxy.cfg,在文件后面添加以下內容
listen rabbitmq_local_cluster 0.0.0.0:25672
#配置TCP模式
mode tcp
option tcplog
#簡單的輪詢
balance roundrobin
#rabbitmq集群節點配置
server rabbit1 172.16.0.104:5672 check inter 5000 rise 2 fall 2
server rabbit2 172.16.0.105:5672 check inter 5000 rise 2 fall 2
server rabbit3 172.16.0.106:5672 check inter 5000 rise 2 fall 2
mode tcp
option tcplog
#簡單的輪詢
balance roundrobin
#rabbitmq集群節點配置
server rabbit1 172.16.0.104:5672 check inter 5000 rise 2 fall 2
server rabbit2 172.16.0.105:5672 check inter 5000 rise 2 fall 2
server rabbit3 172.16.0.106:5672 check inter 5000 rise 2 fall 2
#配置haproxy web監控,查看統計信息
listen private_monitoring :8100
mode http
option httplog
stats enable
#設置haproxy監控地址為http://localhost:8100/stats
stats uri /stats
stats refresh 30s
#添加用戶名密碼認證
mode http
option httplog
stats enable
#設置haproxy監控地址為http://localhost:8100/stats
stats uri /stats
stats refresh 30s
#添加用戶名密碼認證
stats auth admin:1234
啟動haproxy: haproxy -f haproxy.cfg
訪問http://172.16.0.104:8100/stats和http://172.16.0.105:8100/stats
可以查看haproxy的運行狀態及一些統計信息
4、安裝配置Keepalived
安裝過程省略
【haproxy_check.sh文件內容】
#!/bin/bash
LOGFILE="/var/log/keepalived-haproxy-state.log"
date >> $LOGFILE
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "fail: check_haproxy status" >> $LOGFILE
exit 1
else
echo "success: check_haproxy status" >> $LOGFILE
exit 0
fi
【haproxy_master.sh文件內容】
LOGFILE="/var/log/keepalived-haproxy-state.log"
echo "Being Master ..." >> $LOGFILE
然后修改/etc/keepalived/keepalived.conf文件
主機(104)
global_defs {
router_id test
}
vrrp_script chk_haproxy
{
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance haproxy {
state MASTER # 主也配置為SLAVE
interface eth0
virtual_router_id 61
priority 150
virtual_ipaddress {
172.16.0.108
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/scripts/haproxy_master.sh"
router_id test
}
vrrp_script chk_haproxy
{
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance haproxy {
state MASTER # 主也配置為SLAVE
interface eth0
virtual_router_id 61
priority 150
virtual_ipaddress {
172.16.0.108
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/scripts/haproxy_master.sh"
}
備機(105)
global_defs {
router_id redis
}
vrrp_script chk_haproxy
{
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance haproxy {
state BACKUP # 主也配置為SLAVE
interface eth0
virtual_router_id 61
priority 100
virtual_ipaddress {
172.16.0.108
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/scripts/haproxy_master.sh"
router_id redis
}
vrrp_script chk_haproxy
{
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance haproxy {
state BACKUP # 主也配置為SLAVE
interface eth0
virtual_router_id 61
priority 100
virtual_ipaddress {
172.16.0.108
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/scripts/haproxy_master.sh"
}
注意:keepalived可能運行多個實例,比如redis和haproxy共存,在這種情況下,必須注意幾點:
一、VIP必須各實例不同
二、virtual_router_id必須各實例不同
三、腳本文件中不允許出現kill keepalived進程的操作
運行keepalived -D 啟動keepalived