溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何搭建高可用RabbitMQ集群和HAProxy軟負載

發(fā)布時間:2021-11-16 16:26:23 來源:億速云 閱讀:149 作者:小新 欄目:系統(tǒng)運維

小編給大家分享一下如何搭建高可用RabbitMQ集群和HAProxy軟負載,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

RabbitMQ 高可用集群架構(gòu)

如何搭建高可用RabbitMQ集群和HAProxy軟負載

將兩個 RabbitMQ 磁盤節(jié)點和一個 RabbitMQ 內(nèi)存節(jié)點組成一個內(nèi)建集群,之所以要用兩個磁盤節(jié)點是防止,唯一的磁盤節(jié)點掛掉后,不能重建隊列,交換器。用 HAProxy 作為 RabbitMQ 集群的負載均衡。為了防止 HAProxy 單點故障,用 Keepalived 將兩個 HAProxy 節(jié)點做成一主一備。應用使用 VIP(虛擬IP) 訪問 HAProxy 服務時,默認連接主機(Master)的 HAProxy,當主機(Master)上的 HAProxy 故障時,VIP 會漂移到備機(Backup)上,就會連接備機(Backup)上的 HAProxy 服務。

準備工作

服務器安裝 docker,docker-compose,準備離線鏡像 rabbitmq.tar,haproxy.tar。

服務器節(jié)點間可以相互 ping 通。

RabbitMQ 集群

使用 RabbitMQ 內(nèi)建集群,持久化隊列無法在隊列節(jié)點崩潰時,自動連接別的節(jié)點創(chuàng)建隊列,非持久化隊列可以自動連接可用節(jié)點創(chuàng)建隊列。我們的項目使用的非持久化隊列。

至少保證有兩個磁盤節(jié)點,否則在唯一磁盤節(jié)點崩潰時,無法在集群中創(chuàng)建隊列,交換器等元數(shù)據(jù)。

服務分布情況

192.168.1.213 服務器部署 RabbitMQ Disc Node1。  192.168.1.203 服務器部署 RabbitMQ Disc Node2。  192.168.1.212 服務器部署 RabbitMQ RAM Node3。

創(chuàng)建第一個 RabbitMQ 節(jié)點

登錄服務器,創(chuàng)建目錄 /app/mcst/rabbitmq。

將鏡像 tar 包 rabbitmq.tar,服務編排文件 mcst-rabbitmq-node1.yaml 通過 sftp 上傳到剛創(chuàng)建的目錄下。

導入鏡像

$ docker load -i rabbitmq.tar  $ docker images # 查看是否導入成功

查看服務編排文件 mcst-rabbitmq-node1.yaml

version: '3'  services:    rabbitmq:      container_name: mcst-rabbitmq      image: rabbitmq:3-management      restart: always      ports:        - 4369:4369        - 5671:5671        - 5672:5672        - 15672:15672        - 25672:25672      environment:        - TZ=Asia/Shanghai        - RABBITMQ_ERLANG_COOKIE=iweru238roseire        - RABBITMQ_DEFAULT_USER=mcst_admin        - RABBITMQ_DEFAULT_PASS=mcst_admin_123        - RABBITMQ_DEFAULT_VHOST=mcst_vhost      hostname: rabbitmq1      extra_hosts:        - rabbitmq1:192.168.1.213        - rabbitmq2:192.168.1.203        - rabbitmq3:192.168.1.212      volumes:        - ./data:/var/lib/rabbitmq

部署命令

$ docker-compose -f mcst-rabbitmq-node1.yaml up -d

注意:三個節(jié)點 RABBITMQ_ERLANG_COOKIE 保持一致。一定要有 extra_hosts 配置,否則在搭建集群的過程中會連接不到其他 rabbitmq 節(jié)點服務。此節(jié)點作為集群根節(jié)點。

部署第二個 RabbitMQ 節(jié)點

方法同上,上傳 rabbitmq.sh 腳本到 volumes 配置的 ./rabbitmq.sh 路徑。查看 mcst-rabbitmq-node2.yaml

version: '3'  services:    rabbitmq:      container_name: mcst-rabbitmq      image: rabbitmq:3-management      restart: always      ports:        - 4369:4369        - 5671:5671        - 5672:5672        - 15672:15672        - 25672:25672      environment:        - TZ=Asia/Shanghai        - RABBITMQ_ERLANG_COOKIE=iweru238roseire        - RABBITMQ_DEFAULT_USER=mcst_admin        - RABBITMQ_DEFAULT_PASS=mcst_admin_123        - RABBITMQ_DEFAULT_VHOST=mcst_vhost      hostname: rabbitmq2      extra_hosts:        - rabbitmq1:192.168.1.213        - rabbitmq2:192.168.1.203        - rabbitmq3:192.168.1.212      volumes:        - ./rabbitmq.sh:/home/rabbitmq.sh        - ./data:/var/lib/rabbitmq

部署命令

$ docker-compose -f mcst-rabbitmq-node2.yaml up -d

節(jié)點啟動完成后,通過命令進入 rabbitmq2 節(jié)點的容器中,執(zhí)行 /home/rabbitmq.sh 腳本。如果報權(quán)限錯誤,則在容器內(nèi)執(zhí)行 chmod +x /home/rabbitmq.sh 賦權(quán),然后 bash /home/rabbitmq.sh 執(zhí)行腳本添加到集群中。

進入容器的命令:

$ docker exec -it mcst-rabbitmq /bin/bash

腳本內(nèi)容如下(磁盤節(jié)點):

rabbitmqctl stop_app  rabbitmqctl reset  rabbitmqctl join_cluster rabbit@rabbitmq1 rabbitmqctl start_app

部署第三個 RabbitMQ 節(jié)點

方法同上,查看 mcst-rabbitmq-node3.yaml

version: '3'  services:    rabbitmq:      container_name: mcst-rabbitmq      image: rabbitmq:3-management      restart: always      ports:        - 4369:4369        - 5671:5671        - 5672:5672        - 15672:15672        - 25672:25672      environment:        - TZ=Asia/Shanghai        - RABBITMQ_ERLANG_COOKIE=iweru238roseire        - RABBITMQ_DEFAULT_USER=mcst_admin        - RABBITMQ_DEFAULT_PASS=mcst_admin_123        - RABBITMQ_DEFAULT_VHOST=mcst_vhost      hostname: rabbitmq3      extra_hosts:        - rabbitmq1:192.168.1.213        - rabbitmq2:192.168.1.203        - rabbitmq3:192.168.1.212      volumes:        - ./rabbitmq-ram.sh:/home/rabbitmq-ram.sh        - ./data:/var/lib/rabbitmq

部署命令

$ docker-compose -f mcst-rabbitmq-node3.yaml up -d

在啟動 rabbitmq3 節(jié)點,啟動后,進入容器內(nèi)部,執(zhí)行 bash /home/rabbitmq-ram.sh 腳本添加內(nèi)存節(jié)點到集群中。

腳本內(nèi)容:

rabbitmqctl stop_app  rabbitmqctl reset  rabbitmqctl join_cluster --ram rabbit@rabbitmq1  rabbitmqctl start_app

在容器內(nèi)部使用命令查看集群狀態(tài):rabbitmqctl cluster_status。

Cluster status of node rabbit@rabbitmq1 ...  [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2]},{ram,[rabbit@rabbitmq3]}]},   {running_nodes,[rabbit@rabbitmq2,rabbit@rabbitmq3,rabbit@rabbitmq1]},   {cluster_name,<<"rabbit@rabbitmq2">>},   {partitions,[]},   {alarms,[{rabbit@rabbitmq2,[]},{rabbit@rabbitmq3,[]},{rabbit@rabbitmq1,[]}]}]

也可以通過 http://192.168.1.213:15672 進入管理端查看集群狀態(tài)。

如何搭建高可用RabbitMQ集群和HAProxy軟負載

HAProxy 負載均衡

創(chuàng)建目錄 /app/mcst/haproxy,將鏡像 tar 包,haproxy 配置文件,docker 服務編排文件上傳到該目錄。

導入鏡像方法同上。

查看服務編排文件內(nèi)容:

version: '3'  services:    haproxy:      container_name: mcst-haproxy      image: haproxy:2.1      restart: always      ports:        - 8100:8100        - 15670:5670      environment:        - TZ=Asia/Shanghai      extra_hosts:        - rabbitmq1:192.168.1.213        - rabbitmq2:192.168.1.203        - rabbitmq3:192.168.1.212      volumes:        - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro

重點是設(shè)置 extra_hosts(rabbitmq 集群節(jié)點 ip) 和 volumes(使用自定義的配置文件)。

haproxy 配置文件內(nèi)容:

global      log 127.0.0.1 local0 info      maxconn 4096  defaults      log     global      mode    tcp      option  tcplog      retries 3      option  redispatch      maxconn 2000      timeout connect 5s      timeout client 120s      timeout server 120s  # ssl for rabbitmq  # frontend ssl_rabbitmq      # bind *:5673 ssl crt /root/rmqha_proxy/rmqha.pem      # mode tcp      # default_backend rabbitmq  # web 管理界面  listen stats      bind *:8100      mode http      stats enable      stats realm Haproxy\ Statistics      stats uri /      stats auth admin:admin123  # 配置負載均衡  listen rabbitmq      bind *:5670      mode tcp      balance roundrobin      server  rabbitmq1 rabbitmq1:5672  check inter 5s rise 2 fall 3      server  rabbitmq2 rabbitmq2:5672  check inter 5s rise 2 fall 3      server  rabbitmq3 rabbitmq3:5672  check inter 5s rise 2 fall 3

部署命令

$ docker-compose -f mcst-haproxy.yaml up -d

服務分布情況

192.168.1.212 服務器部署 HAProxy Master。  192.168.1.203 服務器部署 HAProxy Backup。

分別在以上兩個節(jié)點起好 HAProxy 服務。

登錄 HAProxy 的管理端查看集群狀態(tài):http://192.168.1.212:8100/。

如何搭建高可用RabbitMQ集群和HAProxy軟負載

使用 Keepalived 給 HAProxy 做主備

準備工作

申請一個和服務節(jié)點同一局域網(wǎng)的 ip 地址,該 ip 不能被占用,作為 VIP(虛擬ip)。

安裝 Keepalived

到 Keepalived 官網(wǎng)下載最新版本包,本次安裝使用的是 2.0.20 版本。

下載好后的文件是:keepalived-2.0.20.tar.gz。

上傳到服務器,對 tar 包解壓縮。

$ tar -xf keepalived-2.0.20.tar.gz

檢查依賴

$ cd keepalived-2.0.20  $ ./configure

Keepalived 的安裝需要以下依賴 gcc,openssl-devel。

安裝命令

$ yum install -y gcc  $ yum install -y openssl-devel

因為是內(nèi)網(wǎng)服務器不能使用外網(wǎng)的 yum 源,所以需要更改用本地 yum 源。

將 linux 的安裝光盤鏡像上傳到 /mnt/iso 目錄下,并 mount 到 /mnt/cdrom 目錄下,作為 yum 的一個安裝源。

$ mkdir /mnt/iso  $ mkdir /mnt/cdrom   $ mv /ftp/rhel-server-7.3-x86_64-dvd.iso /mnt/iso

掛載光盤鏡像

$ mount -ro loop /mnt/iso/rhel-server-7.3-x86_64-dvd.iso /mnt/cdrom   $ mv /ftp/myself.repo /etc/yum.repos.d  $ yum clean all   $ yum makecache   $ yum update

附:myself.repo文件內(nèi)容:

[base]  name= Red Hat  Enterprise Linux $releasever  -  $basearch  -  Source  baseurl=file:///mnt/cdrom  enabled=1  gpgcheck=1  gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release

更改完成后,以后每次需要 linux 安裝盤安裝軟件包時,只需要執(zhí)行 mount 命令,將光盤 ISO 文件加載即可。

$ mount -ro loop /mnt/iso/rhel-server-7.3-x86_64-dvd.iso /mnt/cdrom

這時使用 yum 安裝 gcc,openssl-devel就沒問題了。

如果使用本地 yum 源的條件也不具備,那么可以使用 yum 的 downloadonly 插件。

要在能連接外網(wǎng)和系統(tǒng)版本一致的機器上將需要的依賴下載下來,到目標內(nèi)網(wǎng)機器上本地安裝。

還是推薦使用本地 yum 源的方式

安裝完 gcc,openssl-devel 后,再次執(zhí)行 ./configure 會報一個警告。

“this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.”

安裝如下依賴解決

$ yum install -y libnl libnl-devel

安裝完成后再次 ./configure 就沒問題了。

然后執(zhí)行 make 編譯

最后執(zhí)行 make install 安裝

安裝完成后執(zhí)行 keepalived --version,輸出版本號即為安裝成功。

創(chuàng)建 Keepalived 配置文件

創(chuàng)建配置文件 /etc/keepalived/keepalived.conf

Master 節(jié)點配置:

vrrp_script chk_haproxy {      script "killall -0 haproxy"  # verify haproxy's pid existance      interval 5                   # check every 2 seconds      weight -2                    # if check failed, priority will minus 2  }  vrrp_instance VI_1 {      # 主機: MASTER      # 備機: BACKUP      state MASTER      # 實例綁定的網(wǎng)卡, 用ip a命令查看網(wǎng)卡編號      interface ens192      # 虛擬路由標識,這個標識是一個數(shù)字(1-255),在一個VRRP實例中主備服務器ID必須一樣      virtual_router_id 51      # 優(yōu)先級,數(shù)字越大優(yōu)先級越高,在一個實例中主服務器優(yōu)先級要高于備服務器      priority 101      # 虛擬IP地址,可以有多個,每行一個      virtual_ipaddress {          192.168.1.110      }      track_script {               # Scripts state we monitor          chk_haproxy                    }  }

ens192 是網(wǎng)卡名,ifconfig 命令查看服務器網(wǎng)卡,找到和本機服務 ip 對應的網(wǎng)卡,virtual_router_id 的值要和 backup 節(jié)點上的配置保持一致。killall \-0 haproxy 命令的意思是,如果 haproxy 服務存在執(zhí)行該命令,什么都不會發(fā)生,如果服務不存在,執(zhí)行該命令會報找不到進程 haproxy: no process found。

# 網(wǎng)卡信息  ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500          inet 192.168.1.203  netmask 255.255.255.0  broadcast 192.168.1.255          inet6 fe80::250:56ff:fe94:bceb  prefixlen 64  scopeid 0x20<link>          ether 00:50:56:94:bc:eb  txqueuelen 1000  (Ethernet)          RX packets 88711011  bytes 12324982140 (11.4 GiB)          RX errors 0  dropped 272  overruns 0  frame 0          TX packets 88438149  bytes 10760989492 (10.0 GiB)          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  # haproxy 服務不存在  [root@localhost ~]# killall -0 haproxy  haproxy: no process found

master 節(jié)點的 priority 在減去 weight 后要比 backup 節(jié)點的 priority 低才行,否則主備切換不成功。

Backup節(jié)點配置:

vrrp_script chk_haproxy {      script "killall -0 haproxy"  # verify haproxy's pid existance      interval 5                   # check every 2 seconds      weight -2                    # if check failed, priority will minus 2 }  vrrp_instance VI_1 {      # 主機: MASTER      # 備機: BACKUP      state BACKUP      # 實例綁定的網(wǎng)卡, 用ip a命令查看網(wǎng)卡編號      interface ens192      # 虛擬路由標識,這個標識是一個數(shù)字(1-255),在一個VRRP實例中主備服務器ID必須一樣      virtual_router_id 51      # 優(yōu)先級,數(shù)字越大優(yōu)先級越高,在一個實例中主服務器優(yōu)先級要高于備服務器      priority 100      # 虛擬IP地址,可以有多個,每行一個      virtual_ipaddress {          192.168.1.110      }      track_script {               # Scripts state we monitor          chk_haproxy                    }  }

創(chuàng)建完配置,啟動 keepalived。

$ systemctl restart keepalived

測試 Keepalived

在 Master,Backup 節(jié)點上,使用 ip addr 命令看下 vip 在哪臺機器的 ens192 網(wǎng)卡上。

2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000      link/ether 00:50:56:94:c1:79 brd ff:ff:ff:ff:ff:ff      inet 192.168.1.212/24 brd 192.168.1.255 scope global ens192         valid_lft forever preferred_lft forever      inet 192.168.1.110/32 scope global ens192         valid_lft forever preferred_lft forever      inet6 fe80::250:56ff:fe94:c179/64 scope link          valid_lft forever preferred_lft forever

默認在 master 主機上,停掉 master 主機的 haproxy 服務,然后在用 ip addr 查看虛擬 ip 在哪個機器上,如果漂移到備份主機上則代表熱備生效。

在開啟 master 主機的 haproxy 服務,ip addr 查看虛擬ip應該重新漂移回 master 主機上。

測試服務,使用虛擬 ip 加服務端口號訪問 HAProxy 服務。

以上是“如何搭建高可用RabbitMQ集群和HAProxy軟負載”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI