目錄
3、slave加入集羣操作(重新加入集羣也是如此,以最開始的主節點爲加入節點)
場景五: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 必須相互能夠尋址到
bhz77:rabbitmqctl stop_app
bhz77:rabbitmqctl join_cluster --ram rabbit@bhz76
bhz77:rabbitmqctl start_app
bhz78:rabbitmqctl stop_app
bhz78:rabbitmqctl join_cluster rabbit@bhz76
bhz78:rabbitmqctl 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是一款提供高可用性、負載均衡以及基於TCP和HTTP應用的代理軟件,HAProxy是完全免費的、藉助HAProxy可以快速並且可靠的提供基於TCP和HTTP應用的代理解決方案。
- HAProxy適用於那些負載較大的web站點,這些站點通常又需要會話保持或七層處理。
- HAProxy可以支持數以萬計的併發連接,並且HAProxy的運行模式使得它可以很簡單安全的整合進架構中,同時可以保護web服務器不被暴露到網絡上。
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
6、關閉haproxy
killall haproxy
ps -ef | grep haproxy
1.6 安裝KeepAlived
1、Keepalived簡介
Keepalived,它是一個高性能的服務器高可用或熱備解決方案,Keepalived主要來防止服務器單點故障的發生問題,可以通過其與Nginx、Haproxy等反向代理的負載均衡服務器配合實現web服務端的高可用。Keepalived以VRRP協議爲實現基礎,用VRRP協議來實現高可用性(HA).VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議,VRRP協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP(一個或多個)。
Keepalived特性
Keepalived高可用原理
2、Keepalived安裝
//安裝所需軟件包
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.app和rabbitmq.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的磁盤文件都無法恢復, 極端情況
解決方案 : 一首涼涼送給大家, 這種情況完全沒辦法解決