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 插件名字 來啟用插件