[官方翻譯]RabbitMQ 高可用(HAProxy)

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的版本能夠沒必要保持一致, 但應該保持兼容.

代碼演示請點擊

因爲我的水平有限,若有問題請指出。 https://fansinzhao.github.io/page/image/weixin.png

相關文章
相關標籤/搜索