RabbitMQ + Keepalived + HAProxy 高可用鏡像集群

最終結構圖:

RabbitMQ + Keepalived + HAProxy 高可用鏡像集群結構圖.png

RabbitMQ鏡像集群簡介

RabbitMQ鏡像集群是通過在RabbitMQ服務器配置相應的規(guī)則,把交換器祥诽、隊列的數(shù)據(jù)進行Node之間Copy,對內網流量要求較高遮婶。在生產者扔消息時蹋艺,會在所有Node之間同步完畢之后才會響應扔消息成功儒恋。

RabbitMQ鏡像集群的安裝

  • 環(huán)境聲明

三臺CentOS 7.4
/etc/hosts配置分別為:

192.168.1.219 rabbit1
192.168.1.220 rabbit2
192.168.1.221 rabbit3

  • 三臺機器全部安裝Erlang善绎,RabbitMQ是基于餓了開發(fā)

使用Erlang 19.0.4

// 下載Erlang
[root@rabbit1 tmp] wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el6.x86_64.rpm
// 安裝
[root@rabbit1 tmp] rpm -ivh erlang-19.0.4-1.el6.x86_64.rpm
  • 三臺機器全部安裝RabbitMQ

使用RabbitMQ 3.6.12

[root@rabbit1 tmp] wget https://dl.bintray.com/rabbitmq/rabbitmq-server-rpm/rabbitmq-server-3.6.12-1.el6.noarch.rpm
[root@rabbit1 tmp] rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
[root@rabbit1 tmp] rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm

提示錯誤:

錯誤:依賴檢測失敗:
        socat 被 rabbitmq-server-3.6.12-1.el6.noarch 需要

解決錯誤:

// 建議更換為阿里云 yum 源
// 同步服務器的緩存
[root@rabbit1 tmp] yum -y makecache
// 安裝所需組件
[root@rabbit1 tmp] yum -y install socat
// 繼續(xù)安裝
[root@rabbit1 tmp] rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm
準備中...                          ################################# [100%]
正在升級/安裝...
   1:rabbitmq-server-3.6.12-1.el6     ################################# [100%]
  • 啟動服務查看狀態(tài)
[root@rabbit1 tmp] systemctl start rabbitmq-server.service
[root@rabbit1 tmp] systemctl status rabbitmq-server.service
  • 安裝Web管理插件
// 查看插件列表
[root@rabbit1 tmp] rabbitmq-plugins list
// 開啟Web管理插件 
[root@rabbit1 tmp] rabbitmq-plugins enable rabbitmq_management
  • 單臺安裝完成

以上步驟碧浊,在三臺機器上操作相同

普通集群配置

1.說明

Rabbitmq的集群是依附于Erlang的集群來工作的涂邀,所以必須先構建起Erlang的集群鏡像瘟仿。Erlang的集群中各節(jié)點是經由過程一個magic cookie來實現(xiàn)的箱锐,這個cookie存放在 $home/.erlang.cookie 中,我的是用rpm安裝的,所以.erlang.cookie就放在/var/lib/rabbitmq中

2.復制Cookie

.erlang.cookie是Erlang實現(xiàn)分布式的必要文件劳较,Erlang分布式的每個節(jié)點上要保持相同的.erlang.cookie文件驹止,同時保證文件的權限是400,不然節(jié)點之間就無法通信观蜗。打開文件然后需要先把其中的一臺服務器的.erlang.cookie中的內容復制到別的機器上臊恋,最好是復制內容,因為文件權限不對的話會出現(xiàn)問題墓捻,在最后退出保存的時候使用wq!抖仅,用!來進行強制保存即可。也可是直接使用scp傳過去,記得文件權限和用戶屬主屬組撤卢,如:

scp .erlang.cookie root@192.168.1.220:/usr/local/tmp

3..erlang.cookie復制完成后环凿,逐個重啟節(jié)點服務:

[root@rabbit1 tmp] systemctl restart rabbitmq-server.service
[root@rabbit1 tmp] systemctl status rabbitmq-server.service

4.添加到集群

將rabbit@rabbit1作為集群主節(jié)點,在節(jié)點rabbit2和節(jié)點rabbit3上面分別執(zhí)行如下命令放吩,以加入集群中

[root@rabbit1 tmp] rabbitmqctl stop_app
[root@rabbit1 tmp] rabbitmqctl reset
[root@rabbit1 tmp] rabbitmqctl join_cluster rabbit@rabbit1

提示錯誤:

......
rabbit@rabbit2:
  * connected to epmd (port 4369) on bbbbdddd
  * epmd reports node 'rabbit' running on port 25672
  * TCP connection succeeded but Erlang distribution failed

  * Hostname mismatch: node "rabbit@rabbit2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@rabbit2"
......

解決錯誤:

[root@rabbit1 tmp] vim /etc/rabbitmq/rabbitmq-env.conf
// rabbit1內容:
NODENAME=rabbit@rabbit1
// rabbit2內容:
NODENAME=rabbit@rabbit2
// rabbit3內容:
NODENAME=rabbit@rabbit3

kill掉RabbitMQ所有進程

[root@rabbit1 tmp] ps -aux | grep mq
root      7972  0.0  0.0 112660   976 pts/1    S+   16:19   0:00 grep --color=auto mq
rabbitmq 29798  0.0  0.0  11576   336 ?        S    15:28   0:00 /usr/lib64/erlang/erts-8.0.3/bin/epmd -daemon
root     29834  0.0  0.0 115520  1220 ?        S    15:28   0:00 /bin/sh /etc/rc.d/init.d/rabbitmq-server start
root     29841  0.0  0.0 115252  1468 ?        S    15:28   0:00 /bin/bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /usr/sbin/rabbitmq-server
root     29843  0.0  0.0 115252  1536 ?        S    15:28   0:00 /bin/sh /usr/sbin/rabbitmq-server
root     29862  0.0  0.0 189740  2432 ?        S    15:28   0:00 su rabbitmq -s /bin/sh -c /usr/lib/rabbitmq/bin/rabbitmq-server
rabbitmq 29864  0.0  0.0 113132  1568 ?        Ss   15:28   0:00 /bin/sh /usr/lib/rabbitmq/bin/rabbitmq-server
rabbitmq 30111  0.2  0.5 10355084 86156 ?      Sl   15:28   0:06 /usr/lib64/erlang/erts-8.0.3/bin/beam.smp -W w -A 256 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -K true -B i -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/ebin -noshell -noinput -s rabbit boot -sname rabbit@host9 -boot start_sasl -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger {file,"/var/log/rabbitmq/rabbit@host9.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbit@host9-sasl.log"} -rabbit enabled_plugins_file "/etc/rabbitmq/enabled_plugins" -rabbit plugins_dir "/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/plugins" -rabbit plugins_expand_dir "/var/lib/rabbitmq/mnesia/rabbit@host9-plugins-expand" -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@host9" -kernel inet_dist_listen_min 25672 -kernel inet_dist_listen_max 25672
rabbitmq 30413  0.0  0.0   4300   528 ?        Ss   15:28   0:00 erl_child_setup 1024
rabbitmq 30499  0.0  0.0  11540   444 ?        Ss   15:28   0:00 inet_gethost 4
rabbitmq 30500  0.0  0.0  13664   688 ?        S    15:28   0:00 inet_gethost 4
[root@rabbit1 tmp] kill 對應的進程號

重新啟動RabbitMQ服務加入集群

[root@rabbit1 tmp] systemctl restart rabbitmq-server.service
[root@rabbit1 tmp] systemctl status rabbitmq-server.service
// 在rabbit2和rabbit3加入集群
[root@rabbit1 tmp] rabbitmqctl stop_app
[root@rabbit1 tmp] rabbitmqctl reset
[root@rabbit1 tmp] rabbitmqctl join_cluster rabbit@rabbit1
[root@rabbit1 tmp] rabbitmqctl start_app

5.查看集群狀態(tài)

[root@rabbit1 tmp] rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]},
 {running_nodes,[rabbit@rabbit1,rabbit@rabbit3,rabbit@rabbit2]},
 {cluster_name,<<"rabbit@host9">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbit1,[]},{rabbit@rabbit3,[]},{rabbit@rabbit2,[]}]}]

6.添加賬號

默認使用 guest 賬號只能在localhost下登錄唧喉,所以我們新建一個 admin 賬號并授權

// 新增用戶
[root@rabbit1 tmp] rabbitmqctl add_user 用戶名 密碼
// 授予所有權限
[root@rabbit1 tmp] rabbitmqctl set_permissions -p "/" 用戶名 ".*" ".*" ".*"
// 設置用戶為管理員
[root@rabbit1 tmp] rabbitmqctl set_user_tags 用戶名 administrator

// 查看當前用戶列表
[root@rabbit1 tmp] rabbitmqctl  list_users

7.普通節(jié)點完成,基本操作

訪問Web管理頁面

http://192.168.1.219:15672

從集群中移除節(jié)點

[root@rabbit1 tmp] rabbitmqctl stop_app
Stopping rabbit application on node 'rabbit@rabbit2'
[root@rabbit1 tmp] rabbitmqctl reset
Resetting node 'rabbit@rabbit2'
[root@rabbit1 tmp] rabbitmqctl start_app
Starting node 'rabbit@rabbit2'

改變節(jié)點類型

[root@rabbit1 tmp] rabbitmqctl stop_app
[root@rabbit1 tmp] rabbitmqctl join_cluster --ram rabbit@rabbit1
[root@rabbit1 tmp] rabbitmqctl start_app
 
--ram 指定內存節(jié)點類型驯鳖,--disc指定磁盤節(jié)點類型

修改節(jié)點類型

[root@rabbit1 tmp] rabbitmqctl stop_app
[root@rabbit1 tmp] rabbitmqctl change_cluster_node_type disc
[root@rabbit1 tmp] rabbitmqctl start_app
集群鏡像模式配置

上面配置RabbitMQ默認集群模式,但并不保證隊列的高可用性,盡管交換器、綁定這些可以復制到集群里的任何一個節(jié)點,但是隊列內容不會復制遵馆,雖然該模式解決一部分節(jié)點壓力多艇,但隊列節(jié)點宕機直接導致該隊列無法使用,只能等待重啟,所以要想在隊列節(jié)點宕機或故障也能正常使用,就要復制隊列內容到集群里的每個節(jié)點,需要創(chuàng)建鏡像隊列贴汪。
使用Rabbit鏡像功能,需要基于RabbitMQ策略來實現(xiàn)希太,策略是用來控制和修改群集范圍的某個vhost隊列行為和Exchange行為亡脑。
下面我們使用Web端創(chuàng)建一個完整的鏡像隊列:

  • 登錄Web管理頁面——>Admin——>Policies——>Add / update a policy

此策略會同步所在同一VHost中的交換器和隊列數(shù)據(jù)

RabbitMQ鏡像策略.jpg

  • 新增隊列查看策略已生效
隊列鏡像已生效.jpg
  • 鏡像集群到此結束

HAproxy負載

192.168.1.219192.168.1.220做負載

  • 安裝HAproxy
[root@rabbit1 tmp] yum install haproxy
// 編輯配置文件
[root@rabbit1 tmp] vim /etc/haproxy/haproxy.cfg

在最后新增配置信息:

#######################HAproxy監(jiān)控頁面#########################
listen http_front
        bind 0.0.0.0:1080           #監(jiān)聽端口
        stats refresh 30s           #統(tǒng)計頁面自動刷新時間
        stats uri /haproxy?stats    #統(tǒng)計頁面url
        stats realm Haproxy Manager #統(tǒng)計頁面密碼框上提示文本
        stats auth admin:Guo*0820      #統(tǒng)計頁面用戶名和密碼設置
        #stats hide-version         #隱藏統(tǒng)計頁面上HAProxy的版本信息

#####################我把RabbitMQ的管理界面也放在HAProxy后面了###############################
listen rabbitmq_admin
    bind 0.0.0.0:15673
    server node1 192.168.1.219:15672
    server node2 192.168.1.220:15672
    server node3 192.168.1.221:15672

#####################RabbitMQ服務代理###########################################
listen rabbitmq_cluster 0.0.0.0:5673
    mode tcp
    stats enable
    balance roundrobin
    option tcpka
    option tcplog
    timeout client 3h
    timeout server 3h
    timeout connect 3h
    #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
    server   node1 192.168.1.219:5672 check inter 5s rise 2 fall 3   #check inter 2000 是檢測心跳頻率,rise 2是2次正確認為服務器可用蛙紫,fall 3是3次失敗認為服務器不可用
    server   node2 192.168.1.220:5672 check inter 5s rise 2 fall 3
    server   node3 192.168.1.221:5672 check inter 5s rise 2 fall 3
  • 啟動HAproxy負載
[root@rabbit1 tmp] haproxy -f /etc/haproxy/haproxy.cfg
  • HAproxy負載完畢

Keepalived安裝

利用keepalived做主備拍屑,避免單點問題,實現(xiàn)高可用
192.168.1.219192.168.1.220做主備坑傅,前者主僵驰,后者備

  • 安裝Keepalived
[root@rabbit1 tmp] yum -y install keepalived
  • 配置Keepalived生成VIP
[root@rabbit1 tmp] vim /etc/keepalived/keepalived.conf

部分配置信息(只顯示使用到的):

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   # vrrp_strict    # 注釋掉,不然訪問不到VIP
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 檢測任務
vrrp_script check_haproxy {
    # 檢測HAProxy監(jiān)本
    script "/etc/keepalived/script/check_haproxy.sh"
    # 每隔兩秒檢測
    interval 2
    # 權重
    weight 2
}

# 虛擬組
vrrp_instance haproxy {
    state MASTER # 此處為`主`唁毒,備機是 `BACKUP`
    interface enp4s0f0 # 物理網卡蒜茴,根據(jù)情況而定
    mcast_src_ip 192.168.1.219 # 當前主機ip
    virtual_router_id 51 # 虛擬路由id,同一個組內需要相同
    priority 100 # 主機的優(yōu)先權要比備機高
    advert_int 1 # 心跳檢查頻率浆西,單位:秒
    authentication { # 認證粉私,組內的要相同
        auth_type PASS
        auth_pass 1111
    }
    # 調用腳本
    track_script {
        check_haproxy
    }
    # 虛擬ip,多個換行
    virtual_ipaddress {
        192.168.1.222
    }
}
  • /etc/keepalived/script/check_haproxy.sh內容
#!/bin/bash
LOGFILE="/var/log/keepalived-haproxy-status.log"
date >> $LOGFILE
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
    echo "warning: restart haproxy" >> $LOGFILE
    haproxy -f /etc/haproxy/haproxy.cfg
    sleep 2

    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
        echo "fail: check_haproxy status" >> $LOGFILE
        systemctl stop keepalived
    fi
else
    echo "success: check_haproxy status" >> $LOGFILE
fi

解釋說明:

Keepalived組之間的心跳檢查并不能察覺到HAproxy負載是否正常近零,所以需要使用此腳本诺核。
Keepalived主機上,開啟此腳本檢測HAproxy是否正常工作久信,如正常工作窖杀,記錄日志。
如進程不存在裙士,則嘗試重啟HAproxy陈瘦,兩秒后檢測,如果還沒有則關掉主Keepalived潮售,此時備Keepalived檢測到主Keepalive掛掉痊项,接管VIP,繼續(xù)服務

  • 完畢

參考資料:

https://www.cnblogs.com/saneri/p/7798251.html
不對之處酥诽,請指出

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鞍泉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肮帐,更是在濱河造成了極大的恐慌咖驮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件训枢,死亡現(xiàn)場離奇詭異托修,居然都是意外死亡,警方通過查閱死者的電腦和手機恒界,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門睦刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人十酣,你說我怎么就攤上這事涩拙〖食ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵兴泥,是天一觀的道長工育。 經常有香客問我,道長搓彻,這世上最難降的妖魔是什么如绸? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮旭贬,結果婚禮上怔接,老公的妹妹穿的比我還像新娘。我一直安慰自己骑篙,他們只是感情好蜕提,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靶端,像睡著了一般谎势。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杨名,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天脏榆,我揣著相機與錄音,去河邊找鬼台谍。 笑死须喂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的趁蕊。 我是一名探鬼主播坞生,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掷伙!你這毒婦竟也來了是己?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤任柜,失蹤者是張志新(化名)和其女友劉穎卒废,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宙地,經...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡摔认,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宅粥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片参袱。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出蓖柔,到底是詐尸還是另有隱情辰企,我是刑警寧澤风纠,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布况鸣,位于F島的核電站,受9級特大地震影響竹观,放射性物質發(fā)生泄漏镐捧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一臭增、第九天 我趴在偏房一處隱蔽的房頂上張望懂酱。 院中可真熱鬧,春花似錦誊抛、人聲如沸列牺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞎领。三九已至,卻和暖如春随夸,著一層夾襖步出監(jiān)牢的瞬間九默,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工宾毒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驼修,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓诈铛,卻偏偏與公主長得像乙各,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子幢竹,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容