RabbitMQ精講9:鏡像模式集羣搭建,整合KeepAlived+HaProxy組件

 

目錄

1. 鏡像模式集羣搭建

1.1 集羣節點安裝

1、安裝依賴包

2、下載安裝包

3、安裝服務命令

4、修改集羣用戶與連接心跳檢測

5、安裝管理插件

6、服務指令

1.2 文件同步步驟

1.3 組成集羣步驟

1、停止MQ服務

2、組成集羣操作

3、slave加入集羣操作(重新加入集羣也是如此,以最開始的主節點爲加入節點)

4、修改集羣名稱

5、查看集羣狀態

6、管控臺界面

1.4 配置鏡像隊列

1.5 安裝Ha-Proxy

1、Haproxy簡介

HAProxy如何實現性能最大化

2、Haproxy安裝

3、Haproxy配置

4、啓動haproxy

5、訪問haproxy

6、關閉haproxy

1.6  安裝KeepAlived 

1、Keepalived簡介

Keepalived特性

Keepalived高可用原理

 2、Keepalived安裝

3、Keepalived配置

79節點(Master)配置如下

80節點(backup)配置如下

4、執行腳本編寫

5、執行腳本賦權

6、啓動keepalived

7、高可用測試

1.7 集羣配置文件

環境變量配置文件:rabbitmq-env.conf

配置信息配置文件:rabbitmq.config

2. RabbitMQ集羣恢復與故障轉移

場景一:A先停, B後停

場景二:A, B同時停機

場景三:A先停, B後停, 且A無法恢復

場景四:A先停, B後停, 且B無法恢復

場景五:A先停, B後停, 且A, B均無法恢復, 但是能得到A或B的磁盤文件

場景六:A,B均停機, A,B均無法恢復, 且A或B的磁盤文件都無法恢復, 極端情況


1. 鏡像模式集羣搭建

1.1 集羣節點安裝

鏡像模式集羣搭建
鏡像模式集羣搭建

 

1、安裝依賴包

PS:安裝rabbitmq所需要的依賴包

yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz

2、下載安裝包

wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm
wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
wget www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm

3、安裝服務命令

rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm 
rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

4、修改集羣用戶與連接心跳檢測

注意修改vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app文件

修改:loopback_users 中的 <<"guest">>,只保留guest

修改:heartbeat 爲1

5、安裝管理插件

//首先啓動服務

/etc/init.d/rabbitmq-server start stop status restart

//查看服務有沒有啓動: lsof -i:5672

rabbitmq-plugins enable rabbitmq_management

//可查看管理端口有沒有啓動: lsof -i:15672 或者 netstat -tnlp|grep 15672

6、服務指令

/etc/init.d/rabbitmq-server start stop status restart

驗證單個節點是否安裝成功:http://192.168.11.71:15672/

  Ps:以上操作三個節點(71、72、73)同時進行操作

1.2 文件同步步驟

PS: 選擇76、77、78任意一個節點爲Master(這裏選擇76爲Master),

也就是說我們需要把76的Cookie文件同步到77、78節點上去

  • 進入/var/lib/rabbitmq目錄下,把/var/lib/rabbitmq/.erlang.cookie文件的權限修改爲777,原來是400;
  • 然後把.erlang.cookie文件copy到各個節點下;
  • 最後把所有cookie文件權限還原爲400即可。
/etc/init.d/rabbitmq-server stop 
//進入目錄修改權限;遠程copy77、78節點,比如:
scp /var/lib/rabbitmq/.erlang.cookie 到192.168.11.77和192.168.11.78中

1.3 組成集羣步驟

1、停止MQ服務

PS:我們首先停止3個節點的服務

rabbitmqctl stop

2、組成集羣操作

PS:接下來我們就可以使用集羣命令,配置76、77、78爲集羣模式,3個節點(76、77、78)執行啓動命令,後續啓動集羣使用此命令即可。

rabbitmq-server -detached

3、slave加入集羣操作(重新加入集羣也是如此,以最開始的主節點爲加入節點)

//注意做這個步驟的時候:需要配置/etc/hosts 必須相互能夠尋址到

bhz77rabbitmqctl stop_app

bhz77rabbitmqctl join_cluster --ram rabbit@bhz76

bhz77rabbitmqctl start_app

bhz78rabbitmqctl stop_app

bhz78rabbitmqctl join_cluster rabbit@bhz76

bhz78rabbitmqctl start_app

//在另外其他節點上操作要移除的集羣節點

rabbitmqctl forget_cluster_node rabbit@bhz24

4、修改集羣名稱

PS:修改集羣名稱(默認爲第一個node名稱):

rabbitmqctl set_cluster_name rabbitmq_cluster1

5、查看集羣狀態

PS:最後在集羣的任意一個節點執行命令:查看集羣狀態

rabbitmqctl cluster_status

6、管控臺界面

PS: 訪問任意一個管控臺節點:http://192.168.11.76:15672 

 

1.4 配置鏡像隊列

設置鏡像隊列策略(在任意一個節點上執行)

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

PS:將所有隊列設置爲鏡像隊列,即隊列會被複制到各個節點,各個節點狀態一致,RabbitMQ高可用集羣就已經搭建好了,我們可以重啓服務,查看其隊列是否在從節點同步。

1.5 安裝Ha-Proxy

1、Haproxy簡介

Haproxy簡介
  • HAProxy是一款提供高可用性、負載均衡以及基於TCP和HTTP應用的代理軟件,HAProxy是完全免費的、藉助HAProxy可以快速並且可靠的提供基於TCP和HTTP應用的代理解決方案。
  • HAProxy適用於那些負載較大的web站點,這些站點通常又需要會話保持或七層處理。
  • HAProxy可以支持數以萬計的併發連接,並且HAProxy的運行模式使得它可以很簡單安全的整合進架構中,同時可以保護web服務器不被暴露到網絡上。

HAProxy如何實現性能最大化

HAProxy如何實現性能最大化
HAProxy如何實現性能最大化

2、Haproxy安裝

PS:79、80節點同時安裝Haproxy,下面步驟統一

//下載依賴包

yum install gcc vim wget

//下載haproxy

wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.5.tar.gz

//解壓

tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local

//進入目錄、進行編譯、安裝

cd /usr/local/haproxy-1.6.5

make TARGET=linux31 PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy

mkdir /etc/haproxy

//賦權

groupadd -r -g 149 haproxy

useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy

//創建haproxy配置文件

touch /etc/haproxy/haproxy.cfg

3、Haproxy配置

PS:haproxy 配置文件haproxy.cfg詳解

vim /etc/haproxy/haproxy.cfg

#logging options
global
	log 127.0.0.1 local0 info
	maxconn 5120
	chroot /usr/local/haproxy
	uid 99
	gid 99
	daemon
	quiet
	nbproc 20
	pidfile /var/run/haproxy.pid

defaults
	log global
	#使用4層代理模式,”mode http”爲7層代理模式
	mode tcp
	#if you set mode to tcp,then you nust change tcplog into httplog
	option tcplog
	option dontlognull
	retries 3
	option redispatch
	maxconn 2000
	contimeout 5s
     ##客戶端空閒超時時間爲 60秒 則HA 發起重連機制
     clitimeout 60s
     ##服務器端鏈接超時時間爲 15秒 則HA 發起重連機制
     srvtimeout 15s	
#front-end IP for consumers and producters

listen rabbitmq_cluster
	bind 0.0.0.0:5672
	#配置TCP模式
	mode tcp
	#balance url_param userid
	#balance url_param session_id check_post 64
	#balance hdr(User-Agent)
	#balance hdr(host)
	#balance hdr(Host) use_domain_only
	#balance rdp-cookie
	#balance leastconn
	#balance source //ip
	#簡單的輪詢
	balance roundrobin
	#rabbitmq集羣節點配置 #inter 每隔五秒對mq集羣做健康檢查, 2次正確證明服務器可用,2次失敗證明服務器不可用,並且配置主備機制
        server bhz76 192.168.11.76:5672 check inter 5000 rise 2 fall 2
        server bhz77 192.168.11.77:5672 check inter 5000 rise 2 fall 2
        server bhz78 192.168.11.78:5672 check inter 5000 rise 2 fall 2
#配置haproxy web監控,查看統計信息
listen stats
	bind 192.168.11.79:8100
	mode http
	option httplog
	stats enable
	#設置haproxy監控地址爲http://localhost:8100/rabbitmq-stats
	stats uri /rabbitmq-stats
	stats refresh 5s

4、啓動haproxy

/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
//查看haproxy進程狀態
ps -ef | grep haproxy

5、訪問haproxy

PS:訪問如下地址可以對rmq節點進行監控:http://192.168.11.79:8100/rabbitmq-stats

Haproxy

6、關閉haproxy

killall haproxy
ps -ef | grep haproxy

1.6  安裝KeepAlived 

1、Keepalived簡介

Keepalived簡介

Keepalived,它是一個高性能的服務器高可用或熱備解決方案,Keepalived主要來防止服務器單點故障的發生問題,可以通過其與Nginx、Haproxy等反向代理的負載均衡服務器配合實現web服務端的高可用。Keepalived以VRRP協議爲實現基礎,用VRRP協議來實現高可用性(HA).VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議,VRRP協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP(一個或多個)。

Keepalived特性

Keepalived特性

Keepalived高可用原理

Keepalived高可用原理
Keepalived高可用原理

 2、Keepalived安裝

PS:下載地址:http://www.keepalived.org/download.html

//安裝所需軟件包
yum install -y openssl openssl-devel

//下載
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz

//解壓、編譯、安裝
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
make && make install

//將keepalived安裝成Linux系統服務,因爲沒有使用keepalived的默認安裝路徑(默認路徑:/usr/local),安裝完成之後,需要做一些修改工作
//首先創建文件夾,將keepalived配置文件進行復制:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

//然後複製keepalived腳本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

//可以設置開機啓動:chkconfig keepalived on,到此我們安裝完畢!
chkconfig keepalived on

3、Keepalived配置

PS:修改keepalived.conf配置文件

vim /etc/keepalived/keepalived.conf

79節點(Master)配置如下

! Configuration File for keepalived

global_defs {
   router_id bhz79  ##標識節點的字符串,通常爲hostname

}

vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"  ##執行腳本位置
    interval 2  ##檢測時間間隔
    weight -20  ##如果條件成立則權重減20
}

vrrp_instance VI_1 {
    state MASTER  ## 主節點爲MASTER,備份節點爲BACKUP
    interface eth0 ## 綁定虛擬IP的網絡接口(網卡),與本機IP地址所在的網絡接口相同(我這裏是eth0)
    virtual_router_id 79  ## 虛擬路由ID號(主備節點一定要相同)
    mcast_src_ip 192.168.11.79 ## 本機ip地址
    priority 100  ##優先級配置(0-254的值)
    nopreempt
    advert_int 1  ## 組播信息發送間隔,倆個節點必須配置一致,默認1s
authentication {  ## 認證匹配
        auth_type PASS
        auth_pass bhz
    }

    track_script {
        chk_haproxy
    }

    virtual_ipaddress {
        192.168.11.70  ## 虛擬ip,可以指定多個
    }
}

80節點(backup)配置如下

! Configuration File for keepalived

global_defs {
   router_id bhz80  ##標識節點的字符串,通常爲hostname

}

vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"  ##執行腳本位置
    interval 2  ##檢測時間間隔
    weight -20  ##如果條件成立則權重減20
}

vrrp_instance VI_1 {
    state BACKUP  ## 主節點爲MASTER,備份節點爲BACKUP
    interface eno16777736 ## 綁定虛擬IP的網絡接口(網卡),與本機IP地址所在的網絡接口相同(我這裏是eno16777736)
    virtual_router_id 79  ## 虛擬路由ID號(主備節點一定要相同)
    mcast_src_ip 192.168.11.80  ## 本機ip地址
    priority 90  ##優先級配置(0-254的值)
    nopreempt
    advert_int 1  ## 組播信息發送間隔,倆個節點必須配置一致,默認1s
authentication {  ## 認證匹配
        auth_type PASS
        auth_pass bhz
    }

    track_script {
        chk_haproxy
    }

    virtual_ipaddress {
        192.168.1.70  ## 虛擬ip,可以指定多個
    }
}

4、執行腳本編寫

添加文件位置爲/etc/keepalived/haproxy_check.sh(79、80兩個節點文件內容一致即可)

#!/bin/bash
COUNT=`ps -C haproxy --no-header |wc -l`
if [ $COUNT -eq 0 ];then
    /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
    sleep 2
    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

5、執行腳本賦權

PS:haproxy_check.sh腳本授權,賦予可執行權限.

chmod +x /etc/keepalived/haproxy_check.sh

6、啓動keepalived

PS:當我們啓動倆個haproxy節點以後,我們可以啓動keepalived服務程序:

//啓動兩臺機器的keepalived

service keepalived start | stop | status | restart

//查看狀態

ps -ef | grep haproxy

ps -ef | grep keepalived

7、高可用測試

vip在79節點上 

  • ip a查看 有個 inet  192.168.11.70/32 scope global eth0的信息

79節點宕機測試:停掉79的keepalived服務即可(service keepalived stop )

查看80節點狀態:我們發現VIP漂移到了80節點上,那麼80節點的haproxy可以繼續對外提供服務!

1.7 集羣配置文件

創建如下配置文件位於:/etc/rabbitmq目錄下(這個目錄需要自己創建)

環境變量配置文件:rabbitmq-env.conf

rabbitmq-env.conf配置文件:

---------------------------------------關鍵參數配置-------------------------------------------

RABBITMQ_NODE_IP_ADDRESS=本機IP地址

RABBITMQ_NODE_PORT=5672

RABBITMQ_LOG_BASE=/var/lib/rabbitmq/log

RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia

 

配置參考參數如下

RABBITMQ_NODENAME=FZTEC-240088 節點名稱

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1 監聽IP

RABBITMQ_NODE_PORT=5672 監聽端口

RABBITMQ_LOG_BASE=/data/rabbitmq/log 日誌目錄

RABBITMQ_PLUGINS_DIR=/data/rabbitmq/plugins 插件目錄

RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia 後端存儲目錄

更詳細的配置參見: http://www.rabbitmq.com/configure.html#configuration-file

配置信息配置文件:rabbitmq.config

配置文件信息修改:

/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.4/ebin/rabbit.apprabbitmq.config配置文件配置任意一個即可,我們進行配置如下:

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.4/ebin/rabbit.app

 

-------------------------------------關鍵參數配置----------------------------------------

tcp_listerners 設置rabbimq的監聽端口,默認爲[5672]。
disk_free_limit 磁盤低水位線,若磁盤容量低於指定值則停止接收數據,默認值爲{mem_relative, 1.0},即與內存相關聯1:1,也可定製爲多少byte.
vm_memory_high_watermark,設置內存低水位線,若低於該水位線,則開啓流控機制,默認值是0.4,即內存總量的40%。
hipe_compile 將部分rabbimq代碼用High Performance Erlang compiler編譯,可提升性能,該參數是實驗性,若出現erlang vm segfaults,應關掉。
force_fine_statistics, 該參數屬於rabbimq_management,若爲true則進行精細化的統計,但會影響性能

------------------------------------------------------------------------------------------

更詳細的配置參見:http://www.rabbitmq.com/configure.html

2. RabbitMQ集羣恢復與故障轉移

前提 : A, B兩個節點組成一個鏡像隊列, B是Master節點

場景一:A先停, B後停

解決方案 : 該場景下B是Master, 只要先啓動B, 在啓動A即可。或者先啓動A, 30秒之內啓動B即可恢復鏡像隊列

場景二:A, B同時停機

解決方案 : 只需要在30秒內連續啓動A和B即可恢復鏡像

場景三:A先停, B後停, 且A無法恢復

解決場景 : 因爲B是Master, 所以等B啓起來以後, 在B節點上調用控制檯命令 : rabbitmqctl forget_cluster_node A解除與A的Cluster關係, 再將新的Slave節點加入B即可重新恢復鏡像隊列

場景四:A先停, B後停, 且B無法恢復


解決方案 :

因爲Master節點無法恢復, 所以較難處理, 在3.4.2之前沒有什麼好的解決方案, 但是現在已經有解決方案了, 在3.4.2以後的版本。

因爲B是主節點, 所以直接啓動A是不行的, 當A無法啓動時, 也就沒有辦法在A節點上調用rabbitmqctl forget_cluster_node B 命令了。但是在新版本中forget_cluster_node支持–offline參數, 支持線下移除節點。

這就意味着運行rabbitmqctl在理想節點上執行命令, 迫使RabbitMQ在未啓動Slave節點中選擇一個節點作爲Master。

當在A節點執行**rabbitmqctl forget_cluster_node --offline B **時, RabbitMQ會mock一個節點代表A, 執行 forget_cluster_node命令將B移除cluster, 然後A就可以正常啓動了, 最後將新的Slave節點加入A即可重新恢復鏡像隊列

場景五:A先停, B後停, 且A, B均無法恢復, 但是能得到A或B的磁盤文件

解決方案 : 這種場景更加難以處理, 只能通過恢復數據的方式去嘗試恢復, 將A或B的數據庫文件默認在$RABBIT_HOME/var/lib目錄中, 把它拷貝到新節點對應的目錄下, 再將新節點的hostname改成A或B的hostname, 如果是A節點(Slave)的磁盤文件, 按照場景四處理即可, 如果是B節點(Master)的磁盤文件, 則按照場景三處理, 最後將新的Slave加入到新節點後完成恢復
這種場景很極端, 只能嘗試恢復

場景六:A,B均停機, A,B均無法恢復, 且A或B的磁盤文件都無法恢復, 極端情況


解決方案 : 一首涼涼送給大家, 這種情況完全沒辦法解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章