haproxy和keep-alive你們即便沒有用也應該都聽過吧.網上介紹的比較多,官網文檔也比較全. 那咱們直接開始演示html
1 首先安裝haproxy,安裝的方式比較多,使用本身喜歡的就行,我直接使用apt倉庫的.linux
sudo apt install haproxy
等待安裝完成就好了.默認的配置文件在/etc/haproxy/haproxy.cfggit
2 編輯配置文件,能夠經過-f啓動自定義的配置文件.這個是按照"rabbitmq實戰"上配置的模板 保存爲haproxy.cfg.其中主要的是server rabbit 172.17.0.3:5672 check inter 5000 rise 2 fall 3
的ip配置. 我使用docker啓動了有三個節點的rabbitmq集羣.若是不會能夠參考我相關文章"RabbitMQ 集羣使用"github
global log 127.0.0.1 local0 info maxconn 4096 stats socket /tmp/haproxy.socket uid haproxy mode 770 level admin daemon defaults log global mode tcp option tcplog option dontlognull retries 3 option redispatch maxconn 2000 timeout connect 5s timeout client 120s timeout server 120s listen rabbitmq_cluster bind 127.0.0.1:5670 mode tcp balance roundrobin server rabbit 172.17.0.3:5672 check inter 5000 rise 2 fall 3 server rabbit_1 172.17.0.4:5672 check inter 5000 rise 2 fall 3 server rabbit_2 172.17.0.5:5672 check inter 5000 rise 2 fall 3 listen private_monitoring bind :8100 mode http option httplog stats enable stats uri /stats stats refresh 5s
3 啓動haproxy.redis
sudo haproxy -f HAProxy-rabbitmq.cfg
訪問ui界面 http://localhost:8100/stats .能夠看到界面,即啓動成功!docker
上面咱們已經有了一個簡單的rabbitmq的haproxy,下面咱們要驗證一下是否可用. 咱們如今是看不到haproxy的日誌的,咱們使用rsyslog日誌系統來記錄haproxy日誌. 建立目錄,並賦予寫權限.服務器
mkdir /var/log/haproxy chmod a+w /var/log/haproxy
rsyslog默認是已安裝的,若是沒有自行安裝一下. sudo apt install rsyslog
打開rsyslog默認配置文件,開始udp功能session
module(load="imudp") input(type="imudp" port="514")
並在下面添加haproxy日誌發往地址local0,監聽全部日誌.app
local0.* /var/log/haproxy/haproxy.log
重啓rsyslog,和haproxysocket
sudo systemctl stop rsyslogd sudo systemctl start rsyslogd sudo pgrep -a haproxy sudo kill -9 pid sudo haproxy -f HAProxy-rabbitmq.cfg
如今咱們就能夠看到日誌了
tailf /var/log/haproxy/haproxy.log
簡單看一條消息
2017-08-11T10:07:03+08:00 localhost haproxy[12948]: 127.0.0.1:53708 [11/Aug/2017:10:07:03.042] rabbitmq_cluster rabbitmq_cluster/rabbit_2 1/0/299 572 SD 2/2/2/0/0 0/0
發送方: 127.0.0.1:53708
接收方: rabbitmq_cluster rabbitmq_cluster/rabbit_2
如今咱們作了一個HA,對於HA以外的人來講,只有一個地址,當訪問的時候,會隨機訪問其中一個rabbitmq server. 經過界面,咱們能夠在Sessions欄目看到cur(rent)鏈接,cur表示鏈接的數量,例如如今是my-rabbit-cluster 節點,如今咱們關閉這個服務stop_app,
咱們已經作了集羣,可是咱們的集羣是有弊端的,那就是沒有作到Queue和exchange同步.須要在任意節點開啓 鏡像複製功能
rabbitmqctl set_policy -p '/' ha-all '.+' '{"ha-mode": "all"}'
完成上面的工做後,咱們終於能夠經過代碼驗證高可用集羣了. 首先咱們運行咱們的代碼,發送1000條記錄,消費者每1s接收一條.消息正常接收中. 咱們在界面 http://localhost:8100/stats 上看到session部分有1個cur,那就是如今鏈接 的服務器,好比,如今鏈接的rabbitmq-cluster節點,能夠經過management界面 http://172.17.0.3:15672/#/ 的overview看到這個節點鏈接1個connection.
第一步 如今咱們stop_app或者management界面reset當前鏈接的,過一會下線後,活躍鏈接到另一臺機器.
第二步 如今咱們看到鏈接跳躍到另一臺,然而有一點必須注意,客戶端如今再也不"接收消息",可是,真的是再也不接收消息麼? 如今咱們經過management界面向隊列發送一條消息,客戶端真實的收到消息了!,可見,目前的高可用 並不能保證一致性,只是保證了系統可用.
第三步 咱們重啓以前關閉的節點,如今咱們經過management界面強制關閉鏈接,鏈接又跳回第一次節點(假設就2個節點)
看過官方文檔的人都知道,集羣時,隊列不能持久化,考慮到性能和複雜的問題,官方並不支持. 若是設置隊列爲持久化,則會報下面的錯誤
channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'queue.haproxy' in vhost '/': received 'true' but current is 'false', class-id=50, method-id=10)
考慮到這點,還有一種主/備集羣模式,原理是使用haproxy的backup節點,主節點和backup節點只能 有一個節點可使用,消息放在共享存儲上,從而避免了節點之間的消息複製.關於共享內存,官方給出了pacemaker的案例. 實現主備比上面的變化就是定義server時多了一個backup屬性. HAProxy-rabbitmq-warren.cfg 配置文件
global # 0 系統不可用 1 必須立刻採起行動的事件 2 關鍵的事件 3 錯誤事件 4 警告事件 5 普通但重要的事件 6 有用的信息 7 調試信息 log 127.0.0.1 local7 info maxconn 4096 stats socket /tmp/haproxy_warren.socket uid haproxy mode 770 level admin daemon defaults log global mode tcp option tcplog option dontlognull retries 3 option redispatch maxconn 2000 timeout connect 5s timeout client 120s timeout server 120s listen rabbitmq_cluster bind 127.0.0.1:5680 mode tcp balance roundrobin server rabbit 172.17.0.3:5672 check inter 5000 rise 2 fall 3 server rabbit_backup 172.17.0.6:5672 backup check inter 5000 rise 2 fall 3 listen private_monitoring bind :8101 mode http option httplog stats enable stats uri /stats stats refresh 5s
其餘步驟同上面,惟一不一樣在於http://localhost:8101/stats 界面顯示的備份節點是藍色的. 代碼測試也跟上面的同樣,只不過每次只有主或備啓動.相對於上面的有幾個優點:rabbitmq的版本能夠沒必要保持一致, 但應該保持兼容.
因爲我的水平有限,若有問題請指出。