久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

152次閱讀
沒有評論

共計 9138 個字符,預計需要花費 23 分鐘才能閱讀完成。

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

RabbitMQ 高可用集群架構

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

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

準備工作

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

服務器節點間可以相互 ping 通。

RabbitMQ 集群

使用 RabbitMQ 內建集群,持久化隊列無法在隊列節點崩潰時,自動連接別的節點創建隊列,非持久化隊列可以自動連接可用節點創建隊列。我們的項目使用的非持久化隊列。

至少保證有兩個磁盤節點,否則在唯一磁盤節點崩潰時,無法在集群中創建隊列,交換器等元數據。

服務分布情況

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

創建第一個 RabbitMQ 節點

登錄服務器,創建目錄 /app/mcst/rabbitmq。

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

導入鏡像

$ 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

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

部署第二個 RabbitMQ 節點

方法同上,上傳 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

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

進入容器的命令:

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

腳本內容如下(磁盤節點):

rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@rabbitmq1 rabbitmqctl start_app

部署第三個 RabbitMQ 節點

方法同上,查看 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 節點,啟動后,進入容器內部,執行 bash /home/rabbitmq-ram.sh 腳本添加內存節點到集群中。

腳本內容:

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

在容器內部使用命令查看集群狀態: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 進入管理端查看集群狀態。

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

HAProxy 負載均衡

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

導入鏡像方法同上。

查看服務編排文件內容:

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

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

haproxy 配置文件內容:

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。

分別在以上兩個節點起好 HAProxy 服務。

登錄 HAProxy 的管理端查看集群狀態:http://192.168.1.212:8100/。

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

使用 Keepalived 給 HAProxy 做主備

準備工作

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

安裝 Keepalived

到 Keepalived 官網下載最新版本包,本次安裝使用的是 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

因為是內網服務器不能使用外網的 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 文件內容:

[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 安裝盤安裝軟件包時,只需要執行 mount 命令,將光盤 ISO 文件加載即可。

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

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

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

要在能連接外網和系統版本一致的機器上將需要的依賴下載下來,到目標內網機器上本地安裝。

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

安裝完 gcc,openssl-devel 后,再次執行 ./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 就沒問題了。

然后執行 make 編譯

最后執行 make install 安裝

安裝完成后執行 keepalived –version,輸出版本號即為安裝成功。

創建 Keepalived 配置文件

創建配置文件 /etc/keepalived/keepalived.conf

Master 節點配置:

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 #  實例綁定的網卡,  用 ip a 命令查看網卡編號  interface ens192 #  虛擬路由標識,這個標識是一個數字 (1-255),在一個 VRRP 實例中主備服務器 ID 必須一樣  virtual_router_id 51 #  優先級,數字越大優先級越高,在一個實例中主服務器優先級要高于備服務器  priority 101 #  虛擬 IP 地址, 可以有多個,每行一個  virtual_ipaddress { 192.168.1.110 } track_script { # Scripts state we monitor chk_haproxy } }

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

#  網卡信息  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 節點的 priority 在減去 weight 后要比 backup 節點的 priority 低才行,否則主備切換不成功。

Backup 節點配置:

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 #  實例綁定的網卡,  用 ip a 命令查看網卡編號  interface ens192 #  虛擬路由標識,這個標識是一個數字 (1-255),在一個 VRRP 實例中主備服務器 ID 必須一樣  virtual_router_id 51 #  優先級,數字越大優先級越高,在一個實例中主服務器優先級要高于備服務器  priority 100 #  虛擬 IP 地址, 可以有多個,每行一個  virtual_ipaddress { 192.168.1.110 } track_script { # Scripts state we monitor chk_haproxy } }

創建完配置,啟動 keepalived。

$ systemctl restart keepalived

測試 Keepalived

在 Master,Backup 節點上,使用 ip addr 命令看下 vip 在哪臺機器的 ens192 網卡上。

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 軟負載”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計9138字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 阳曲县| 老河口市| 荥经县| 丰原市| 郓城县| 安仁县| 原阳县| 民权县| 德令哈市| 新丰县| 舒兰市| 桑日县| 长宁区| 威海市| 西吉县| 沂南县| 玛曲县| 巴青县| 玛纳斯县| 鄂温| 静乐县| 武宁县| 顺昌县| 阳新县| 舞阳县| 陆河县| 胶南市| 休宁县| 无极县| 巴楚县| 彝良县| 那曲县| 胶州市| 大城县| 志丹县| 当涂县| 巧家县| 阿坝县| 公主岭市| 射洪县| 关岭|