RabbitMq 基於 keepalived+haproxy實現高可用
rabbitmq作為消息隊列,廣泛用於生產環境,但是,如果單節點,將導致故障後,生產環境不可用,因此,需要部署高可用環境
本文將介紹基於keepalived+haproxy實現rabbitmq的高可用
rabbitmq的集群中,所有節點都可讀寫,因此,可用haproxy調度到後端的任意一臺rabbitmq上。
環境準備
三個節點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
另外兩臺主機用於安裝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 #建議安裝web圖形化管理工具,如不需要 可以不裝,15672為rabbitmq服務的圖形管理端口
#創建桌面端登陸賬號
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 配置高可用
把節點redis-01的.erlang.cookie權限設置為777,並且拷貝到其他兩個節點,同時,權限也都要設置為777.erlang.cookie的路徑可能不一樣,用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
確認三臺機器的.erlang.cookie值一樣
cat /root/.erlang.cookie
啟動三個mq節點
rabbitmq-server -detached
停止02和03兩個節點app
rabbitmqctl stop_app
在02 和 03上分別執行如下命令
rabbitmqctl join_cluster rabbit@redis-01
rabbitmqctl start_app
此時,如果沒有報錯,三個節點的mq已經組成rabbit集群
用如下命令進行查看集群狀態
rabbitmqctl cluster_status
隨便停止某一臺rabbitmq,數據都可以從其他兩臺讀取
到這裏,rabbitmq集群已經完成,還需配置haproxy+keepalived來實現高可用,只用一個vip來進行調度
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編譯安裝見博客:<Redis 高可用 基於Sentinel + keepalived 實現>,鏈接如下,但是keepalived的配置文件有區別,見附錄。其他步驟都一樣
http://blog.51cto.com/ghbsunny/2154262
5.3 測試
haproxy和keepalived啟動後,斷開主keepalived,vip會排異到另一臺服務器上
另外,通過訪問vip 192.168.70.37 的監聽5672端口,可以把請求調度到後端的三臺mq上,且任何一臺mq異常,請求將不會調度到這臺異常的mq上,即服務正常。
測試成功
6 附錄
6.1 haproxy配置文件
兩臺配置都一樣
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-hnsyun stats realm welcome login\ Haproxy stats auth admin:hns..2018 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
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配置文件
主備的配置文件有三點不同
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 Pass1234 } virtual_ipaddress { #VIP地址,可以設置多個: 192.168.70.35 } }
RabbitMq 基於 keepalived+haproxy實現高可用