RabbitMQ模式大概分爲如下三種:
(1)單一模式。
(2)普通模式(默認的集羣模式)。
(3) 鏡像模式(把須要的隊列作成鏡像隊列,存在於多個節點,屬於RabbiMQ的HA方案,在對業務可靠性要求較高的場合中比較適用)。
要實現鏡像模式,須要先搭建一個普通集羣模式,在這個模式的基礎上再配置鏡像模式以實現高可用。node
RabbitMQ的集羣節點包括內存節點、磁盤節點。
RabbitMQ支持消息的持久化也就是數據寫在磁盤上,默認是磁盤節點。瀏覽器
RabbitMQ相關端口服務器
4369 (epmd), 25672 (Erlang distribution) 5672, 5671 (AMQP 0-9-1 without and with TLS) 15672 (if management plugin is enabled) 61613, 61614 (if STOMP is enabled) 1883, 8883 (if MQTT is enabled)
RabbitMQ 集羣節點設置cookie
server103.example.com IP: 192.168.72.103 Node: disk
server105.example.com IP: 192.168.72.105 Node: disk
server106.example.com IP: 192.168.72.106 Node: diskapp
1. 安裝erlang依賴yum install -y epel-release
或者經過yum源安裝
#添加EPEL源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
添加Erlang源
rpm -Uvh http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpmtcp
2. 安裝RabbitMQ Serveryum install -y rabbitmq-server
(默認安裝目錄爲:/usr/lib/rabbitmq/bin/)ide
或者經過yum源安裝oop
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-3.6.1-1.noarch.rpm rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc yum install rabbitmq-server-3.6.1-1.noarch.rpm
3. 單機配置
#調整系統限制阿里雲
vi /etc/sysctl.conf fs.file-max = 300000
#設置生效sysctl -p
#查看sysctl fs.file-max
插件
#調整用戶限制
vi /etc/security/limits.conf
* soft nofile 65536 * hard nofile 65536
#添加hostecho "192.168.72.103 server103" >> /etc/hosts
#防火牆打開端口
firewall-cmd --permanent --add-port=15672/tcp firewall-cmd –-reload
#設置自動重啓
chkconfig rabbitmq-server on service rabbitmq-server start
#啓動監控插件
rabbitmq-plugins list //查看插件安裝狀況 rabbitmq-plugins enable rabbitmq_management //啓用rabbitmq_management服務
4. 用戶管理
#添加用戶
rabbitmqctl add_user admin admin rabbitmqctl add_user travel 88gongxiangrbq
#設置用戶角色
rabbitmqctl set_user_tags admin administrator rabbitmqctl set_user_tags travel administrator
#設置用戶權限(設置admin用戶配置、寫、讀的權限)
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" rabbitmqctl set_permissions -p / travel ".*" ".*" ".*"
#刪除guest用戶rabbitmqctl delete_user guest
rabbitmq從3.3.0開始禁止使用guest/guest權限經過除localhost外的訪問。
若是想使用guest/guest經過遠程機器訪問,須要在rabbitmq配置文件中(/etc/rabbitmq/rabbitmq.config)中設置loopbackusers爲[]。
[{rabbit, [{loopbackusers, []}]}].
#管理界面
在瀏覽器中打開http://192.268.72.104:15672
#默認配置說明
cat /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.1/sbin/rabbitmq-defaults
1. 配置三臺機器的主機名(三臺機器分別執行)
hostnamectl set-hostname server103 hostnamectl set-hostname server105 hostnamectl set-hostname server106
查看效果:
hostname
配置三臺機器的hosts解析(三臺機器都添加以下配置)
vi /etc/hosts 192.168.72.103 server103 192.168.72.105 server105 192.168.72.106 server106
2. 設置每一個節點Cookie
Rabbitmq的集羣是依賴於erlang的集羣來工做的,因此必須先構建起erlang的集羣環境。Erlang的集羣中各節點是經過一個magic cookie來實現的,這個cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的權限。因此必須保證各節點cookie保持一致,不然節點之間就沒法通訊
選擇其中一臺做爲集羣主節點,將其cookiecopy到另外兩臺機器上。
chmod 700 /var/lib/rabbitmq/.erlang.cookie echo -n "YACWQCCKIKHSVKFFJYBL" > /var/lib/rabbitmq/.erlang.cookie chmod 400 /var/lib/rabbitmq/.erlang.cookie
網上看到有些朋友,將其中一臺的cookie,遠程發送到其餘節點服務器,這樣容易致使cookie文件的屬組變化,默認爲rabbitmq,下面的一個錯誤會提到。
#修改cookie後須要重啓mq
ps -ef | grep ^rabbitmq | awk '{print $2}' | xargs kill -9 service rabbitmq-server start
常見的啓動失敗:
Starting rabbitmq-server (via systemctl): Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
查看日誌:
tail -f /var/log/rabbitmq/startup_log {error_logger,{{2019,2,19},{16,10,19}},"Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces",[]} {error_logger,{{2019,2,19},{16,10,19}},crash_report,[[{initial_call,{auth,init,['Argument__1']}},{pid,<0.20.0>},{registered_name,[]},{error_info,{exit,{"Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces",[{auth,init_cookie,0,[{file,"auth.erl"},{line,285}]},{auth,init,1,[{file,"auth.erl"},{line,139}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]},[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,328}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}},{ancestors,[net_sup,kernel_sup,<0.10.0>]},{messages,[]},{links,[<0.18.0>]},{dictionary,[]},{trap_exit,true},{status,running},{heap_size,610},{stack_size,27},{reductions,643}],[]]}
主要是訪問cookie失敗致使的,能夠嘗試修改cookie的權限和屬組:
cd /var/lib/rabbitmq/ chown rabbitmq:rabbitmq .erlang.cookie chmod 400 .erlang.cookie
啓動成功後查看狀態:rabbitmqctl status
狀態顯示可能會遇到連接不上的錯誤,以下:
Status of node rabbit@server104 ...
Error: unable to connect to node rabbit@server104: nodedown
DIAGNOSTICS attempted to contact: [rabbit@server104] rabbit@server104: * connected to epmd (port 4369) on server104 * epmd reports node 'rabbit' running on port 25672 * TCP connection succeeded but Erlang distribution failed * suggestion: hostname mismatch? * suggestion: is the cookie set correctly? * suggestion: is the Erlang distribution using TLS?
緣由:
RabbitMQ的erlang.cookie和用戶的cookie衝突了,須要用rabbitmq的cookie去覆蓋用戶的cookie。
解決方式: sudo cp /var/lib/rabbitmq/.erlang.cookie ~/.erlang.cookie
重啓
rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@server106 --ram rabbitmqctl start_app
#將節點從集羣中去掉rabbitmqctl forget_cluster_node rabbit@server104
節點恢復過程當中把數據刪掉很重要,恢復一單結點,再清數據
節點增長:
1. rabbitmq-server -detached --- .erlang.cooike的權限,400 屬主rabbitmq 2. rabbitmqctl stop_app 3. rabbitmqctl join_cluster --ram rabbit@rabbitmq1 4. rabbitmqctl start_app 5. rabbitmqctl cluster_status
節點刪除
1. rabbitmq-server -detached 以上爲基礎,正常運行的mq節點直接進行二、3兩步;4可省略或更改成rabbitmqctl stop 2. rabbitmqctl stop_app 3. rabbitmqctl reset 4. rabbitmqctl start_app
若是想切換節點類型,譬如由disc-->ram,能夠先恢復到單結點,重啓,清數據,再添加集羣。