RabbitMQ高可用介紹
閱讀本文大概需要 7.5 分鐘。
作者:yuzhen0228
1.全局圖

2.首先要先安裝RabbitMQ
#rpm?-Uvh?https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm
#yum?install?erlang
#wget?http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
#yum?install?rabbitmq-server-3.6.6-1.el7.noarch.rpm?
完成后啟動服務(wù):
#service?rabbitmq-server?start
可以查看服務(wù)狀態(tài):
#service?rabbitmq-server?status
3.配置rabbitmq cluster
cd?/var/lib/rabbitmq
chmod?u+w?.erlang.cookie
vim?/etc/hosts
10.64.16.123????l-rabbitmq1
10.64.17.11??????l-rabbitmq2
rabbitmqctl?stop_app
rabbitmqctl?join_cluster?rabbit@?l-rabbitmq1
rabbitmqctl?start_app
rabbitmqctl?change_cluster_node_type??ram??(需要先停掉,才能更改)
4.mirror queue policy設(shè)置
rabbitmqctl?set_policy?ha-all?"^ha\."?'{"ha-mode":"all","ha-sync-mode":"automatic"}'???????????????//意思表示以ha.開頭的queue都會復(fù)制到各個節(jié)點(diǎn)?
5.Keepalived
yum?-y?install?keepalived
vim??/etc/keepalived/keepalived.conf?:
!?Configuration?File?for?keepalived
global_defs?{
notification_email?{
[email protected]
[email protected]
[email protected]
}
[email protected]
smtp_server?192.168.200.1
smtp_connect_timeout?30
router_id?LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict?????????????????????????#要注釋掉
vrrp_garp_interval?0
vrrp_gna_interval?0
}
?
vrrp_script?chk_haproxy?{
????script?"service?haproxy?status"??#?服務(wù)探測,返回0說明服務(wù)是正常的
????interval?1???????????????????????#?每隔1秒探測一次
????weight?-2????????????????????????#?不正常時(shí),權(quán)重-1,即haproxy上線,權(quán)重加2;下線,權(quán)重減2
}
?
vrrp_instance?haproxy?{
????state?MASTER?????????????????#?主機(jī)為MASTER,備機(jī)為BACKUP
????interface?eth0???????????????#?監(jiān)測網(wǎng)絡(luò)端口,用ifconfig查看
????virtual_router_id?108????????#?虛擬路由標(biāo)識,同一個VRRP實(shí)例要使用同一個標(biāo)識,主備機(jī)必須相同
????priority?100?????????????????#?主備機(jī)取不同的優(yōu)先級,確保主節(jié)點(diǎn)的優(yōu)先級高過備用節(jié)點(diǎn)
????advert_int?1?????????????????#?VRRP?Multicast廣播周期秒數(shù)??用于設(shè)定主備節(jié)點(diǎn)間同步檢查時(shí)間間隔
????authentication?{
????????auth_type?PASS???????????#?VRRP認(rèn)證方式
????????auth_pass?1234???????????#?VRRP口令?主備機(jī)密碼必須相同
????}
????track_script?{???????????????#?調(diào)用haproxy進(jìn)程檢測腳本,備節(jié)點(diǎn)不配置
????????chk_haproxy
????}
????virtual_ipaddress?{
????????10.64.16.254?????????????#vip
????}
????notify_master?"/etc/keepalived/notify.sh?master"??????#?當(dāng)前節(jié)點(diǎn)成為master時(shí),通知腳本執(zhí)行任務(wù),一般用于啟動某服務(wù)
????notify_backup?"/etc/keepalived/notify.sh?backup"??????#?當(dāng)前節(jié)點(diǎn)成為backup時(shí),通知腳本執(zhí)行任務(wù),一般用于關(guān)閉某服務(wù)
}
!?Configuration?File?for?keepalived
?
global_defs?{
???notification_email?{
[email protected]
[email protected]
[email protected]
???}
[email protected]
???smtp_server?192.168.200.1
???smtp_connect_timeout?30
???router_id?LVS_DEVEL
???vrrp_skip_check_adv_addr
???#?vrrp_strict????????????????????#要注釋掉
???vrrp_garp_interval?0
???vrrp_gna_interval?0
}
?
?
vrrp_script?chk_haproxy?{
????script?"service?haproxy?status"?#?服務(wù)探測,返回0說明服務(wù)是正常的
????interval?1??????????????????????#?每隔1秒探測一次
????weight?-2???????????????????????#?不正常時(shí),權(quán)重-1,即haproxy上線,權(quán)重加2;下線,權(quán)重減2
}
?
vrrp_instance?haproxy?{
????state?BACKUP????????????#?主機(jī)為MASTER,備機(jī)為BACKUP
????interface?eth0?????????#?監(jiān)測網(wǎng)絡(luò)端口,用ifconfig查看
????virtual_router_id?108???#?虛擬路由標(biāo)識,同一個VRRP實(shí)例要使用同一個標(biāo)識,主備機(jī)必須相同
????priority?99????????????#?主備機(jī)取不同的優(yōu)先級,確保主節(jié)點(diǎn)的優(yōu)先級高過備用節(jié)點(diǎn)
????advert_int?1????????????#?VRRP?Multicast廣播周期秒數(shù)??用于設(shè)定主備節(jié)點(diǎn)間同步檢查時(shí)間間隔
????authentication?{
????????auth_type?PASS??????#?VRRP認(rèn)證方式
????????auth_pass?1234??????#?VRRP口令?主備機(jī)密碼必須相同
????}
?
????virtual_ipaddress?{?????#?VIP?漂移地址?即集群IP地址
????????10.64.16.254
????}
}
#!/bin/bash
?
case?"$1"?in
????master)
????????notify?master
????????service?haproxy?start
????????exit?0
????;;
????backup)
????????notify?backup
????????service?haproxy?stop
????????exit?0
????;;
????fault)
????????notify?fault
????????service?haproxy?stop
????????exit?0
????;;
????*)
????????echo?'Usage:?`basename?$0`?{master|backup|fault}'
????????exit?1
????;;
esac
keepalived service keepalived restartnotify.sh腳本放在/etc/keepalived/目錄下,并賦予可執(zhí)行權(quán)限。6.Haproxy負(fù)載代理
yum?install?haproxy
vim??/etc/haproxy/haproxy.cfg
#######################HAproxy監(jiān)控頁面#########################
listen?http_front
????????bind?0.0.0.0:1080???????????#監(jiān)聽端口
????????stats?refresh?30s???????????#統(tǒng)計(jì)頁面自動刷新時(shí)間
????????stats?uri?/haproxy?stats????#統(tǒng)計(jì)頁面url
????????stats?realm?Haproxy?Manager?#統(tǒng)計(jì)頁面密碼框上提示文本
????????stats?auth?admin:1234??????#統(tǒng)計(jì)頁面用戶名和密碼設(shè)置
????????#stats?hide-version?????????#隱藏統(tǒng)計(jì)頁面上HAProxy的版本信息
?
#####################RabbitMQ的管理界面###############################
listen?rabbitmq_admin
????bind?10.64.16.254:15673
????server?l-rabbitmq1?10.64.16.123:15672
????server?l-rabbitmq2?10.64.17.11:15672
?
#####################RabbitMQ服務(wù)代理###########################################
listen?rabbitmq_cluster?10.64.16.254: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???l-rabbitmq1?10.64.16.123:5672?check?inter?5s?rise?2?fall?3???#check?inter?2000?是檢測心跳頻率,rise?2是2次正確認(rèn)為服務(wù)器可用,fall?3是3次失敗認(rèn)為服務(wù)器不可用
????server???l-rabbitmq2?10.64.17.11:5672?check?inter?5s?rise?2?fall?3
haproxy?-f?haproxy.cfg啟動
service?haproxy?restart
ip?a??
http://10.64.16.254:1080/haproxy?stats看一下監(jiān)控頁面,如果顯示出正常就表明已經(jīng)將 HAProxy 負(fù)載均衡配置好了。http://10.64.16.254:15673??rabbitmq管理頁面
測試
import?pika
connection?=?pika.BlockingConnection(
????pika.ConnectionParameters('10.64.16.254',5673,virtual_host="/",credentials=pika.PlainCredentials(username="admin",password="1234"))??#?默認(rèn)端口5672,可不寫
?)
channel?=?connection.channel()
channel.queue_declare(queue='ha_1')
channel.basic_publish(exchange='',routing_key='ha_1',body='haha?Hello?World!')?
connection.close()??#?隊(duì)列關(guān)閉
import?pika
import?time
connection?=?pika.BlockingConnection(pika.ConnectionParameters('10.64.16.254',5673,virtual_host="/",credentials=pika.PlainCredentials(username="admin",password="1234"))??#?默認(rèn)端口5672,可不寫
)
channel?=?connection.channel()
channel.queue_declare(queue='ha_1')
def?callback(ch,?method,?properties,?body):??#?四個參數(shù)為標(biāo)準(zhǔn)格式
?print("?[x]?Received?%r"?%?body)
????time.sleep(15)
????ch.basic_ack(delivery_tag?=?method.delivery_tag)
????print("done")
channel.basic_consume(callback,queue='ha_1')
print('?[*]?Waiting?for?messages.?To?exit?press?CTRL+C')
channel.start_consuming()
推薦閱讀:
厲害了!手?jǐn)]一個SpringBoot緩存系統(tǒng),性能杠杠的!
這幾個開源的商城實(shí)戰(zhàn)項(xiàng)目,良月柒強(qiáng)烈推薦!
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?

