RabbitMQ RPM部署
| 系统 | 架构 | IP | 主机 | 内核 | 数据目录 |
|---|---|---|---|---|---|
| Anolis OS(8.6) | x86_64 | 172.16.5.81 | node1 | 4.19.91-26 | /data |
| Anolis OS(8.6) | x86_64 | 172.16.5.82 | node2 | 4.19.91-26 | /data |
| Anolis OS(8.6) | x86_64 | 172.16.5.83 | node3 | 4.19.91-26 | /data |
# 1. 基础环境
# 修改主机名
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld.service
# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 2. 添加hosts解析
cat >> /etc/hosts << EOF
172.16.5.81 node1
172.16.5.82 node2
172.16.5.83 node3
EOF
1
2
3
4
5
2
3
4
5
# 3.安装erlang环境,RabbitMQ 安装需要依赖 Erlang 环境,版本对应 (opens new window)
# 三台节点都执行
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.14/erlang-23.3.4.14-1.el8.x86_64.rpm
yum -y install erlang-23.3.4.14-1.el8.x86_64.rpm
1
2
3
2
3
# 4.rabbitmq 安装
# 三台节点都执行
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.16/rabbitmq-server-3.9.16-1.el7.noarch.rpm
yum install -y rabbitmq-server-3.9.16-1.el7.noarch.rpm
1
2
3
2
3
# 5.创建集群
# 5.1 配置 erlang cookie
[root@node1 rabbitmq]# scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/
[root@node1 rabbitmq]# scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/
1
2
2
# 5.2授权erlang.cookie,在 node2、node3中分别执行以下命令
[root@node2 ~]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
[root@node2 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie
------------------------------------------------------------------------------------
[root@node3 ~]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
[root@node3 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie
1
2
3
4
5
2
3
4
5
# 5.3重启服务,三个节点依次执行
# 创建数据目录
mkdir -p /data/rabbitmq/{data,log}
chown -R rabbitmq:rabbitmq /data/rabbitmq
# 编辑配置文件
cat >/etc/rabbitmq/rabbitmq-env.conf<<EOF
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/log
EOF
# 开启插件
cat >/etc/rabbitmq/enabled_plugins<<EOF
[rabbitmq_management,rabbitmq_stomp,rabbitmq_web_stomp,rabbitmq_web_stomp_examples,rabbitmq_prometheus].
EOF
systemctl restart rabbitmq-server
systemctl status rabbitmq-server
systemctl enable rabbitmq-server
# 使用 rabbitmq-diagnostics 验证
rabbitmq-diagnostics environment | grep mnesia
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 5.4 将 node2、node3 节点加入 node1 节点集群中,在 node2、node3中分别执行以下命令,默认的是作为磁盘节点
[root@node2 ~]# rabbitmqctl stop_app # 停止服务
[root@node2 ~]# rabbitmqctl join_cluster rabbit@node1 # 加入节点
[root@node2 ~]# rabbitmqctl start_app # 启动服务
Starting node rabbit@node2 ...
----------------------------------------------------------------------------------------
[root@node3 ~]# rabbitmqctl stop_app
[root@node3 ~]# rabbitmqctl join_cluster rabbit@node1
[root@node3 ~]# rabbitmqctl start_app
Starting node rabbit@node3 ...
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 5.5 验证是否加入成功
[root@node1 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
Basics
Cluster name: rabbit@node1
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Versions
rabbit@node1: RabbitMQ 3.9.16 on Erlang 23.3.4.14
rabbit@node2: RabbitMQ 3.9.16 on Erlang 23.3.4.14
rabbit@node3: RabbitMQ 3.9.16 on Erlang 23.3.4.14
Maintenance status
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node2, status: not under maintenance
Node: rabbit@node3, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@node1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 5.6将集群设为镜像模式
# 所有队列exchangess 或者 queue都为镜像模式
[root@node1 rabbitmq]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
[root@node1 rabbitmq]# echo $?
0
注: 该策略仅对新队列生效,若要应用到已有队列,需手动删除并重建
1
2
3
4
5
6
2
3
4
5
6
# 6.集群验证
# 6.1 开启插件
rabbitmq-plugins enable rabbitmq_managemen
1
# 6.2 设置用户
# 添加用户名/密码
[root@node1 rabbitmq]# rabbitmqctl add_user admin 123
# 提升管理员
[root@node1 rabbitmq]# rabbitmqctl set_user_tags admin administrator
# 给admin用户授权
[root@node1 rabbitmq]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 6.3 登录 http://172.16.5.83:15672 用户:admin 密码:123,创建demo队列验证

# 6.4 查看镜像集群

可以看到我们创建了demo队列,Node中的+2表示备份,下图中的Mirrors就是备份的节点,若node1宕机了node2,node3就会代替node1继续提供服务
1

# 6.6 测试---首先关闭node1 节点

然后查看node2,node3 节点上的镜像状态,发现在node2,node3节点也进行了备份,以此说明:就算整个集群只剩下一台机器了,依然能消费队列里面的消息
1

# 7.调优
# 创建配置文件
cat>/etc/rabbitmq/rabbitmq.conf<<EOF
# 当占用的内存超过这个阈值时,会暂停接收新消息(即:生产者被阻塞),只允许消费者把消息消费掉,从而降低内存使用
vm_memory_high_watermark.relative = 0.7
# 磁盘可用空间少于 3GB 时,RabbitMQ 会自动阻止新的消息写入磁盘,防止磁盘被写满导致服务异常或崩溃
disk_free_limit.absolute = 3GB
# 检测消费者长时间未响应,自动关闭无响应的消费者连接,避免资源浪费
consumer_timeout = 300000
# 调整日志级别,避免日志过多导致性能下降
log.console.level = warning
EOF
# 重启服务
systemctl restart rabbitmq-server
# 验证
rabbitmqctl environment | grep disk_free_limit
rabbitmqctl environment | grep vm_memory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
上次更新: 2026/05/31, 03:30:34