網絡結構以下圖:
web
共有10四、10五、106三臺RabbitMQ Server,互爲集羣
其中104和105安裝了Haproxy,每一個Haproxy承擔三臺RabbitMQ server的負載均衡
兩臺Harpoxy採用Keepalived互爲主備,VIP是172.16.0.108
操做系統爲Ubuntu
如下介紹操做步驟:redis
一、三臺主機安裝RabbitMQbash
apt-get install rabbitmq-server cookie
開啓RabbitMQ management,激活控制檯以方便MQ的管理與監控
sudo rabbitmq-plugins enable rabbitmq_management
開啓監控後能夠輸入http://ip:15672能夠登陸管理界面,默認帳戶guest/guest
二、配置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
對備節點(10五、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"}' //["^"匹配全部]
三、安裝配置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
#配置haproxy web監控,查看統計信息
listen private_monitoring :8100
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的運行狀態及一些統計信息
四、安裝配置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"
}
備機(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"
}
注意:keepalived可能運行多個實例,好比redis和haproxy共存,在這種狀況下,必須注意幾點:
1、VIP必須各實例不一樣
2、virtual_router_id必須各實例不一樣
3、腳本文件中不容許出現kill keepalived進程的操做
運行keepalived -D 啓動keepalived