RabbitMQ模式大概分為以下三種:
(1)單一模式。
(2)普通模式(默認(rèn)的集群模式)。
(3) 鏡像模式(把需要的隊(duì)列做成鏡像隊(duì)列,存在于多個節(jié)點(diǎn),屬于RabbiMQ的HA方案,在對業(yè)務(wù)可靠性要求較高的場合中比較適用)。
要實(shí)現(xiàn)鏡像模式,需要先搭建一個普通集群模式,在這個模式的基礎(chǔ)上再配置鏡像模式以實(shí)現(xiàn)高可用。
RabbitMQ的集群節(jié)點(diǎn)包括內(nèi)存節(jié)點(diǎn)、磁盤節(jié)點(diǎn)。
RabbitMQ支持消息的持久化也就是數(shù)據(jù)寫在磁盤上,默認(rèn)是磁盤節(jié)點(diǎn)。
RabbitMQ相關(guān)端口
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 集群節(jié)點(diǎn)設(shè)置
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: disk
rabbitMQ單機(jī)安裝配置
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.rpm
2. 安裝RabbitMQ Server
yum install -y rabbitmq-server
(默認(rèn)安裝目錄為:/usr/lib/rabbitmq/bin/)
或者通過yum源安裝
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. 單機(jī)配置
#調(diào)整系統(tǒng)限制
vi /etc/sysctl.conf
fs.file-max = 300000
#設(shè)置生效
sysctl -p
#查看
sysctl fs.file-max
#調(diào)整用戶限制
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
#添加host
echo "192.168.72.103 server103" >> /etc/hosts
#防火墻打開端口
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd –-reload
#設(shè)置自動重啟
chkconfig rabbitmq-server on
service rabbitmq-server start
#啟動監(jiān)控插件
rabbitmq-plugins list //查看插件安裝情況
rabbitmq-plugins enable rabbitmq_management //啟用rabbitmq_management服務(wù)
4. 用戶管理
#添加用戶
rabbitmqctl add_user admin admin
rabbitmqctl add_user travel 88gongxiangrbq
#設(shè)置用戶角色
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_user_tags travel administrator
#設(shè)置用戶權(quán)限(設(shè)置admin用戶配置、寫、讀的權(quán)限)
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
rabbitmqctl set_permissions -p / travel ".*" ".*" ".*"
#刪除guest用戶
rabbitmqctl delete_user guest
rabbitmq從3.3.0開始禁止使用guest/guest權(quán)限通過除localhost外的訪問。
如果想使用guest/guest通過遠(yuǎn)程機(jī)器訪問,需要在rabbitmq配置文件中(/etc/rabbitmq/rabbitmq.config)中設(shè)置loopbackusers為[]。
[{rabbit, [{loopbackusers, []}]}].
#管理界面
在瀏覽器中打開http://192.268.72.104:15672
#默認(rèn)配置說明
cat /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.1/sbin/rabbitmq-defaults
系統(tǒng)prefix是空
配置文件路徑是 /etc/rabbitmq/rabbitmq.config (erlang會自動加上.config后綴)
環(huán)境配置文件是 /etc/rabbitmq/rabbitmq-env.conf
日志文件目錄是 /var/log/rabbitmq
插件文件目錄是 安裝目錄下的plugins,這里RPM安裝方式下是 /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.1/plugins
集群配置
1. 配置三臺機(jī)器的主機(jī)名(三臺機(jī)器分別執(zhí)行)
hostnamectl set-hostname server103
hostnamectl set-hostname server105
hostnamectl set-hostname server106
查看效果:
hostname
配置三臺機(jī)器的hosts解析(三臺機(jī)器都添加如下配置)
vi /etc/hosts
192.168.72.103 server103
192.168.72.105 server105
192.168.72.106 server106
2. 設(shè)置每個節(jié)點(diǎn)Cookie
Rabbitmq的集群是依賴于erlang的集群來工作的,所以必須先構(gòu)建起erlang的集群環(huán)境。Erlang的集群中各節(jié)點(diǎn)是通過一個magic cookie來實(shí)現(xiàn)的,這個cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的權(quán)限。所以必須保證各節(jié)點(diǎn)cookie保持一致,否則節(jié)點(diǎn)之間就無法通信
選擇其中一臺作為集群主節(jié)點(diǎn),將其cookiecopy到另外兩臺機(jī)器上。
chmod 700 /var/lib/rabbitmq/.erlang.cookie
echo -n "YACWQCCKIKHSVKFFJYBL" > /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie
網(wǎng)上看到有些朋友,將其中一臺的cookie,遠(yuǎn)程發(fā)送到其他節(jié)點(diǎn)服務(wù)器,這樣容易導(dǎo)致cookie文件的屬組變化,默認(rèn)為rabbitmq,下面的一個錯誤會提到。
#修改cookie后需要重啟mq
ps -ef | grep ^rabbitmq | awk '{print $2}' | xargs kill -9
service rabbitmq-server start
常見的啟動失?。?/p>
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失敗導(dǎo)致的,可以嘗試修改cookie的權(quán)限和屬組:
cd /var/lib/rabbitmq/
chown rabbitmq:rabbitmq .erlang.cookie
chmod 400 .erlang.cookie
啟動成功后查看狀態(tài):
rabbitmqctl status
狀態(tài)顯示可能會遇到鏈接不上的錯誤,如下:
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
重啟
加入集群
將 server103、server105 、server106組成集群:
默認(rèn)是磁盤節(jié)點(diǎn),如果是內(nèi)存節(jié)點(diǎn)的話,需要加--ram參數(shù)
在server103、server105上分別運(yùn)行:
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@server106 --ram
rabbitmqctl start_app
#將節(jié)點(diǎn)從集群中去掉
rabbitmqctl forget_cluster_node rabbit@server104
節(jié)點(diǎn)恢復(fù)過程中把數(shù)據(jù)刪掉很重要,恢復(fù)一單結(jié)點(diǎn),再清數(shù)據(jù)
節(jié)點(diǎn)增加:
1. rabbitmq-server -detached --- .erlang.cooike的權(quán)限,400 屬主rabbitmq
2. rabbitmqctl stop_app
3. rabbitmqctl join_cluster --ram rabbit@rabbitmq1
4. rabbitmqctl start_app
5. rabbitmqctl cluster_status
節(jié)點(diǎn)刪除
1. rabbitmq-server -detached
以上為基礎(chǔ),正常運(yùn)行的mq節(jié)點(diǎn)直接進(jìn)行2、3兩步;4可省略或更改為rabbitmqctl stop
2. rabbitmqctl stop_app
3. rabbitmqctl reset
4. rabbitmqctl start_app
設(shè)置鏡像策略
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
如果想切換節(jié)點(diǎn)類型,譬如由disc-->ram,可以先恢復(fù)到單結(jié)點(diǎn),重啟,清數(shù)據(jù),再添加集群。