RabbitMQ集群部署、高可用和持久化


RabbitMQ 安裝和使用

1、安裝依賴環境

在 http://www.rabbitmq.com/which-erlang.html 頁面查看安裝rabbitmq需要安裝erlang對應的版本

在 https://github.com/rabbitmq/erlang-rpm/releases 頁面找到需要下載的erlang版本,`erlang-*.centos.x86_64.rpm`就是centos版本的。

復制下載地址后,使用wget命令下載,wget -P /home/download https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm

安裝 Erlang sudo rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm

安裝時如果提示‘libcrypto.so.10(OPENSSL_1.0.2)(64bit) is needed’則需要下載 openssl-libs-1.0.2k-16.el7.x86_64.rpm,地址http://rpmfind.net/linux/centos/7.6.1810/os/x86_64/Packages/openssl-libs-1.0.2k-16.el7.x86_64.rpm,然后升級一下 rpm -ivh openssl-libs-1.0.2k-16.el7.x86_64.rpm --force

安裝 socat  sudo yum install -y socat

2、安裝RabbitMQ

在官方下載頁面http://www.rabbitmq.com/download.html)找到CentOS7版本的下載鏈接,下載rpm安裝包

wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm

可以在https://github.com/rabbitmq/rabbitmq-server/tags下載歷史版本

添加環境配置 vi /etc/rabbitmq/rabbitmq-env.conf ,沒有目錄時先創建對應的目錄, 添加 NODENAME=rabbit@localhost

安裝 sudo rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm

3、基本操作

啟動服務  sudo systemctl start rabbitmq-server

查看狀態 sudo systemctl status rabbitmq-server

停止服務 sudo systemctl stop rabbitmq-server

設置開機啟動 sudo systemctl enable rabbitmq-server

開啟Web管理插件 rabbitmq-plugins enable rabbitmq_management,rabbitmq有一個默認的guest用戶,但只能通過localhost訪問,所以需要添加一個能夠遠程訪問的用戶

添加用戶 rabbitmqctl add_user admin admin

為用戶分配操作權限 rabbitmqctl set_user_tags admin administrator

 為用戶分配資源權限 rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

4、防火牆添加端口

sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent

重啟防火牆 sudo firewall-cmd --reload

多機多節點集群部署

1、准備三台安裝好RabbitMQ 的機器,ip分別為192.168.5.125、192.168.5.135、192.168.5.145

2、修改hosts文件,sudo vim /etc/hosts,三台機器分別都添加如下配置,可以通過sudo scp /etc/hosts root@192.168.5.135:/etc/復制到node2

192.168.5.125 node1

192.168.5.135 node2

192.168.5.145 node3

3、修改對應主機的hostname hostnamectl set-hostname 名字(重啟后仍有效)

4、將192.168.5.125上的/var/lib/rabbitmq/.erlang.cookie文件復制到另外兩台機器上

5、給每台機器的防火牆添加端口

6、 啟動每台機器的RabbitMQ,sudo systemctl start rabbitmq-server或者 rabbitmq-server -detached

7、 將192.168.5.135加入到集群,停止RabbitMQ 應用 rabbitmqctl stop_app, 重置RabbitMQ 設置  rabbitmqctl reset 加入到集群  rabbitmqctl join_cluster rabbit@node1 --ram

啟動RabbitMQ 應用 rabbitmqctl start_app

8、查看集群狀態,看到`running_nodes,[rabbit@node1,rabbit@node2]`表示節點啟動成功  rabbitmqctl cluster_status

9、在管理端界面界面查看

鏡像隊列模式集群

 鏡像隊列屬於RabbitMQ 的高可用方案,見:https://www.rabbitmq.com/ha.html#mirroring-arguments

通過前面的步驟搭建的集群屬於普通模式集群,是通過共享元數據實現集群

開啟鏡像隊列模式需要在管理頁面添加策略,添加方式:

1. 進入管理頁面 選擇默認虛擬主機"/" -> Admin -> Policies(在頁面右側)-> Add / update a policy

2. 在表單中填入:

name:ha-all  策略名稱,如果使用已有的名稱,保存后將會修改原來的信息

Apply to:Queues 策略應用到什么對象上

Pattern:^ 策略應用到對象時,對象名稱的匹配規則(正則表達式)

Priority: 0 優先級,數值越大,優先級越高,相同優先級取最后一個

Definition:策略定義的類容,對於鏡像隊列的配置來說,只需要包含3個部分: `ha-mode` 、`ha-params` 和 `ha-sync-mode`。其中,`ha-sync-mode`是同步的方式,自動還是手動,默認是自動。`ha-mode` 和 `ha-params` 組合使用。組合方式如下:

  |all | (empty) | 隊列鏡像到集群類所有節點 |

  | exactly | count | 隊列鏡像到集群內指定數量的節點。如果集群內節點數少於此值,隊列將會鏡像到所有節點。如果大於此值,而且一個包含鏡像的節點停止,則新的鏡像不會在其它節點創建。 |

  | nodes | nodename | 隊列鏡像到指定節點,指定的節點不在集群中不會報錯。當隊列申明時,如果指定的節點不在線,則隊列會被創建在客戶端所連接的節點上。 |

鏡像隊列模式相比較普通模式,鏡像模式會占用更多的帶寬來進行同步,所以鏡像隊列的吞吐量會低於普通模式,但普通模式不能實現高可用,某個節點掛了后,這個節點上的消息將無法被消費,需要等待節點啟動后才能被消費。

除了鏡像隊列模式,還可以借助插件 shovel、federation來實現高可用,但是不常用,下面是兩種方式的區別

 持久化

RabbitMQ消息持久化分為消息持久化、隊列持久化和交換器持久化,不管持久化還是非持久化消息都可以被寫入磁盤,區別在於重啟后消息是否還存在

隊列持久化是通過定義隊列是durable參數指定的,交換器持久化和隊列持久化一樣,也是通過在定義時durable參數指定,消息持久化是通過消息的屬性deliverymode來設置是否持久化
RabbitMQ內存/磁盤控制:內存使用超過閾值后,Rabbit會暫時阻塞客戶端的連接,停止接收消息,可以通過管理命令臨時調整閾值

rabbitmqctl set_vm_memery_high_watermark <fraction> ,fraction為內存閾值,默認為0.4;

或者通過改配置文件在/etc/rabbitmq/rabbitmq.conf添加 vm_memery_high_watermark.relative = 0.5(相對值) /absolute = 1GB (絕對值)

內存換頁:在某個rabbitmq節點內存到達閾值之前,它會嘗試將隊列中的消息換頁到磁盤以釋放內存空間,持久化和非持久化的消息都會被轉儲到磁盤中,同時會將持久化的消息在內存中清除,內存換頁閾值設置 vm_memery_high_watermark_paging_ratio=0.75

磁盤閾值:當磁盤剩余空間小於默認值時,RabbitMQ同樣會阻塞生產者,默認值為50M,但是並不能完全消除RabbitMQ崩潰的可能性(因為磁盤掃描是有時間間隔的)。

管理命令 rabbitmq set_disk_free_limit <8GB> /mem_relative 2.0(與內存的相對比值)

配置文件 disk_free_limit.relative =2.0 /disk_free_limit.absolute = 50M


最后提一下rabbimq的 插件機制, rabbitmq_plugins list 命令查看插件, rabbitmq_plugins enable 插件名字 來啟用插件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM