- RabbitMQ官网:https://www.rabbitmq.com/
- Github地址:https://github.com/rabbitmq/rabbitmq-server
- RabbitMQ是由Erlang语言编写的,因此,在安装RabbitMQ之前需要安装Erlang 。建议采用较新版的Erlang ,这样可以获得较多更新和改进
1、二进制安装RabbitMQ(单机单节点)
1.1、部署环境
- 软件版本
- Erlang:23.3.4.15
- RabbitMQ:3.9.19
- 系统环境
- 10.1.1.14:CentOSLinuxrelease7.7.1908(Core)
1.2、安装Erlang
- 注意,Erlang和Rabbit的版本兼容问题。(兼容矩阵:https://www.rabbitmq.com/which-erlang.html)
- 建议使用rpm安装Erlang,容易简单(下载地址:https://packagecloud.io/rabbitmq/erlang)。
1、下载Erlang
下载地址:https://www.erlang.org/downloads
安装包:https://github.com/erlang/otp/releases/download/OTP-23.3.4.15/otp_src_23.3.4.15.tar.gz
2、安装依赖
- 不安装这些依赖就会在执行./configure时,有对应的报错信息。
//报错信息:configure: error: no acceptable C compiler found in $PATH
]# yum install gcc-c++ -y
//报错信息:configure: error: No curses library functions found
]# yum install ncurses-devel -y
//报错信息: No usable OpenSSL found,ODBC library - link check failed
]# yum install openssl-devel unixODBC-devel -y
//报错信息:wx will NOT be usable wxWidgets not found
]# yum install epel-release -y
]# yum install wxWidgets-devel -y
]# cd /usr/bin; ln -s wx-config-3.0 wx-config
- 报错:不安装上面的依赖,在执行./configure时会有以下报错。
*********************************************************************
********************** APPLICATIONS DISABLED **********************
*********************************************************************
crypto : No usable OpenSSL found
jinterface : No Java compiler found
odbc : ODBC library - link check failed
ssh : No usable OpenSSL found
ssl : No usable OpenSSL found
*********************************************************************
*********************************************************************
********************** APPLICATIONS INFORMATION *******************
*********************************************************************
wx : No OpenGL headers found, wx will NOT be usable
No GLU headers (glu.h) found, wx will NOT be usable
wxWidgets not found, wx will NOT be usable
*********************************************************************
*********************************************************************
********************** DOCUMENTATION INFORMATION ******************
*********************************************************************
documentation :
fop is missing.
Using fakefop to generate placeholder PDF files.
*********************************************************************
3、安装Erlang
]# mkdir -p /apps/erlang
]# tar zxvf otp_src_23.3.4.15.tar.gz
]# cd otp_src_23.3.4.15
]# ./configure --prefix=/apps/erlang
]# make
]# make install
- ./configur时会有报错信息,这个是可以忽略的。

4、配置环境变量
//修改/etc/profile文件
]# cat >> /etc/profile << EOF
export ERLANG_HOME=/apps/erlang
export PATH=\$PATH:\$ERLANG_HOME/bin
EOF
//让配置文件生效
]# source /etc/profile
5、验证Erlang是否安装成功
]# erl
Erlang/OTP 23 [erts-11.2.2.14] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1]
Eshell V11.2.2.14 (abort with ^G)
1>
1.3、安装RabbitMQ
1、下载RabbitMQ
下载地址:https://www.rabbitmq.com/download.html
安装包:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.19/rabbitmq-server-generic-unix-3.9.19.tar.xz
2、安装RabbitMQ
]# xz -d rabbitmq-server-generic-unix-3.9.19.tar.xz
]# tar vfx rabbitmq-server-generic-unix-3.9.19.tar -C /apps/
]# cd /apps/
]# ln -s rabbitmq_server-3.9.19 rabbitmq
3、配置环境变量
//修改/etc/profile文件
]# cat >> /etc/profile << EOF
export RABBITMQ_HOME=/apps/rabbitmq
export PATH=\$PATH:\$RABBITMQ_HOME/sbin
EOF
//让配置文件生效
]# source /etc/profile
4、启动RabbitMQ
- 启动RabbitMQ后,会监听5672和25672端口。
]# rabbitmq-server #前台启动mq服务
]# rabbitmq-server -detached #后台启动mq服务
]# rabbitmqctl stop #停止mq服务
]# rabbitmqctl status #查看rabbitmq服务状态
]# rabbitmqctl cluster_status #查看集群状态
- 启动时的报错,这是因为主机名使用了数字(纯数字),需改主机名即可(这里改成了hh14)。

5、开启管理页面
]# rabbitmq-plugins list #查看插件打开情况
]# rabbitmq-plugins enable rabbitmq_management #启动管理页面
]# rabbitmq-plugins disable rabbitmq_management #关闭管理页面
- 添加一个用户root,并删除默认用户guest
- 默认情况下,访问RabbitMQ服务的用户名和密码都是"guest",这个账户有限制,默认只能通过本地网络(如localhost)访问,远程网络访问受限,所以在实现生产和消费消息之前,需要另外添加一个用户,并设置相应的访问权限。
//查看所有用户
]# rabbitmqctl list_users
//添加一个用户
]# rabbitmqctl add_user root root
//设置用户角色
]# rabbitmqctl set_user_tags root administrator
//删除用户(安全起见,删除默认用户)
]# rabbitmqctl delete_user guest
- 使用管理页面访问RabbitMQ(http://10.1.1.14:15672/ root/root)

2、二进制安装RabbitMQ集群(多机多节点)
- RabbitMQ集群允许消费者和生产者在RabbitMQ一个节点崩惯的情况下继续运行,它也可以通过添加更多的节点来水平扩展消息通信的吞吐量。
- RabbitMQ集群不能保证消息的不会丢失,可以通过特殊的配置比如镜像队列可以解决这个问题。
- RabbitMQ集群对延迟非常敏感,应当只在本地局域网内使用。在广域网中不应该使用RabbirMQ集群,而应该使用Federation或者Shovel来代替。
2.1、部署环境
- 软件版本
- Erlang:23.3.4.15
- RabbitMQ:3.9.19
- 系统环境
- 10.1.1.12:CentOSLinuxrelease7.7.1908(Core)
- 10.1.1.13:CentOSLinuxrelease7.7.1908(Core)
- 10.1.1.14:CentOSLinuxrelease7.7.1908(Core)
2.2、安装Erlang和RabbitMQ
- 在配置集群之前,需要在三台机器上根据单机单节点的安装方法分别正确地安装Erlang和RabbitMQ。
- 注意,要在三台机器上都启用rabbitmq_management插件。
- 否则,在web管理页面看不到没有开启rabbitmq_management插件的节点的信息。

2.3、配置集群
- 假设三台机器均己正确地安装了RabbitMQ,且主机名分别为hh12、hh13和hh14。
2.3.1、配置三台机器的hosts文件
- 配置各个节点的hosts文件,让各个节点都能互相识别对方的存在。
]# cat >> /etc/hosts << EOF
10.1.1.12 hh12
10.1.1.13 hh13
10.1.1.14 hh14
EOF
2.3.2、编辑RabbitMQ的cookie文件
- 编辑RabbitMQ的cookie文件,以确保各个节点的cookie文件使用的是同一个值。
- cookie相当于密钥令牌,集群中的RabbitMQ节点需要通过交换密钥令牌以获得相互认证。如果节点的密钥令牌不一致,在节点加入集群时会报错。
- cookie文件默认路径为/var/lib/rabbitmq/.erlang.cookie(rpm安装RabbitMQ)或者$HOME/.erlang.cookie(二进制安装RabbitMQ)。(启动RabbitMQ后才会有.erlang.cookie文件)
- 可以读取hh14节点的cookie值,然后将其复制到hh12和hh13节点中。
//启动hh14上的RabbitMQ服务
]# rabbitmq-server -detached
//将hh14的.erlang.cookie文件复制到hh12和hh13上
]# scp .erlang.cookie root@10.1.1.12:/root
//权限必须是400,否者启动rabbitmq时会报错
]# ls -l /root/.erlang.cookie
-r-------- 1 root root 20 7月 6 00:00 /root/.erlang.cookie
2.3.3、配置集群
- 配置集群有三种方式:
- 通过rabbitmqctl工具配置
- 通过rabbitmq.conf配置文件配置
- 通过rabbitmq-autoclusterl插件配置。
- 这里使用rabbitmqctl工具配置集群,这种方式是最常用的方式。其余两种方式在实际中很少使用,所以就不做介绍了。
1、启动hh12和hh13节点上的RabbitMQ服务
//启动hh12、hh13这3个节点的RabbitMQ服务。
]# rabbitmq-server -detached
//查看各个节点的状态
]# rabbitmqctl cluster_status
2、组成集群
- 将3个节点组成一个集群,需要以一个节点为基准,将另外两个节点加入基准节点,从而组成集群。(这些节点是平等的,即可以以任何一个节点为基准节点)
- 这里以hh14为基准,将hh12和hh13加入到hh14中。(在hh14执行以下命令)
//将rabbit@hh12加入rabbit@hh14
]# rabbitmqctl --node rabbit@hh12 stop_app
]# rabbitmqctl --node rabbit@hh12 reset
]# rabbitmqctl --node rabbit@hh12 join_cluster rabbit@hh14
]# rabbitmqctl --node rabbit@hh12 start_app
//将rabbit@hh13加入rabbit@hh14
]# rabbitmqctl --node rabbit@hh13 stop_app
]# rabbitmqctl --node rabbit@hh13 reset
]# rabbitmqctl --node rabbit@hh13 join_cluster rabbit@hh14
]# rabbitmqctl --node rabbit@hh13 start_app
- 报错:在执行rabbitmqctl join_cluster rabbit@hh14时,有报错信息。
- 通过网上了解,说这是之前加入集群失败造成的(虽然之前从没有加入过集群),可以忽略这些报错。(是否真正可以忽略这些报错,有待验证???)
11:25:43.119 [warning] Feature flags: the previous instance of this node must have failed to write the `feature_flags` file at `/apps/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@hh12-feature_flags`:
11:25:43.119 [warning] Feature flags: - list of previously disabled feature flags now marked as such: [:maintenance_mode_status]
11:25:43.419 [warning] Feature flags: the previous instance of this node must have failed to write the `feature_flags` file at `/apps/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@hh12-feature_flags`:
11:25:43.419 [warning] Feature flags: - list of previously enabled feature flags now marked as such: [:maintenance_mode_status]
11:25:43.444 [error] Failed to create a tracked connection table for node :rabbit@hh12: {:node_not_running, :rabbit@hh12}
11:25:43.445 [error] Failed to create a per-vhost tracked connection table for node :rabbit@hh12: {:node_not_running, :rabbit@hh12}
11:25:43.445 [error] Failed to create a per-user tracked connection table for node :rabbit@hh12: {:node_not_running, :rabbit@hh12}
3、查看集群状态
//在任意一个节点中都可以查看集群状态,并且输出的内容是一样的
]# rabbitmqctl cluster_status

Cluster status of node rabbit@hh14 ...
Basics
Cluster name: rabbit@hh14
Disk Nodes
rabbit@hh12
rabbit@hh13
rabbit@hh14
Running Nodes
rabbit@hh12
rabbit@hh13
rabbit@hh14
Versions
rabbit@hh12: RabbitMQ 3.9.19 on Erlang 23.3.4.15
rabbit@hh13: RabbitMQ 3.9.19 on Erlang 23.3.4.15
rabbit@hh14: RabbitMQ 3.9.19 on Erlang 23.3.4.15
Maintenance status
Node: rabbit@hh12, status: not under maintenance
Node: rabbit@hh13, status: not under maintenance
Node: rabbit@hh14, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@hh12, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@hh12, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@hh13, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@hh13, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@hh14, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@hh14, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: stream_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
View Code
3、二进制安装RabbitMQ集群(单机多节点)
- 在单台物理机器上搭建一个多RabbitMQ服务节点的集群。
- 在一台机器上部署多个RabbitMQ服务节点,需要确保每个节点都有独立的名称、数据存储位置、端口号(包括插件的端口号)等。
3.1、部署环境
- 软件版本
- Erlang:23.3.4.15
- RabbitMQ:3.9.19
- 系统环境
- 10.1.1.14:CentOSLinuxrelease7.7.1908(Core)
3.2、安装Erlang和RabbitMQ
- 在配置集群之前,需要在机器上根据单机单节点的安装方法正确地安装Erlang和RabbitMQ。
3.3、配置集群
- 在主机hh14上创建一个由rabbitl@hh14、rabbit2@hh14和rabbit3@hh14这3个节点组成RabbitMQ集群。
- 首先需要确保机器上己经安装了Erlang和RabbitMQ。
- 其次,为每个RabbitMQ服务节点设置不同的端口号和节点名称来启动相应的服务。
1、启动3个RabbitMQ节点
]# RABBITMQ_NODE_PORT=5671 RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
]# RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
]# RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
- 报错:在启动rabbit1@hh14节点之后,继续启动rabbit2@hh14和rabbit3@hh14节点可能会遇到启动失败的情况。这种情况大多数是由于配置发生了冲突造成的,需要进一步确认是否开启了某些功能,比如RabbitMQ Management插件。
- 如果开启了RabbitMQ Management插件,就需要为每个服务节点配置一个对应插件端口号。
//开启了RabbitMQ Management插件(注意,逗号的前后不要有空格)
RABBITMQ_NODE_PORT=5671 RABBITMQ_NODENAME=rabbit1 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15671}]" rabbitmq-server -detached
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit2 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit3 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" rabbitmq-server -detached
2、组成集群
- 以rabbit1为基准,将rabbit2和rabbit3加入到rabbit1中。
//将rabbit2@hh14加入rabbit1@hh14
]# rabbitmqctl --node rabbit2@hh14 stop_app
]# rabbitmqctl --node rabbit2@hh14 reset
]# rabbitmqctl --node rabbit2@hh14 join_cluster rabbit1@hh14
]# rabbitmqctl --node rabbit2@hh14 start_app
//将rabbit3@hh14加入rabbit1@hh14
]# rabbitmqctl --node rabbit3@hh14 stop_app
]# rabbitmqctl --node rabbit3@hh14 reset
]# rabbitmqctl --node rabbit3@hh14 join_cluster rabbit1@hh14
]# rabbitmqctl --node rabbit3@hh14 start_app
- 报错:在执行rabbitmqctl join_cluster时,有报错信息。
- 通过网上了解,说这是之前加入集群失败造成的(虽然之前从没有加入过集群),可以忽略这些报错。(是否真正可以忽略这些报错,有待验证???)
20:32:15.712 [warning] Feature flags: the previous instance of this node must have failed to write the `feature_flags` file at `/apps/rabbitmq/var/lib/rabbitmq/mnesia/rabbit3@hh14-feature_flags`:
20:32:15.712 [warning] Feature flags: - list of previously disabled feature flags now marked as such: [:maintenance_mode_status]
20:32:16.082 [warning] Feature flags: the previous instance of this node must have failed to write the `feature_flags` file at `/apps/rabbitmq/var/lib/rabbitmq/mnesia/rabbit3@hh14-feature_flags`:
20:32:16.083 [warning] Feature flags: - list of previously enabled feature flags now marked as such: [:maintenance_mode_status]
20:32:16.099 [error] Failed to create a tracked connection table for node :rabbit3@hh14: {:node_not_running, :rabbit3@hh14}
20:32:16.100 [error] Failed to create a per-vhost tracked connection table for node :rabbit3@hh14: {:node_not_running, :rabbit3@hh14}
20:32:16.100 [error] Failed to create a per-user tracked connection table for node :rabbit3@hh14: {:node_not_running, :rabbit3@hh14}
3、查看集群状态
//必须有-n参数,否者会报错
]# rabbitmqctl --node rabbit1@hh14 cluster_status
]# rabbitmqctl --node rabbit2@hh14 cluster_status
]# rabbitmqctl --node rabbit3@hh14 cluster_status