rabbitmq集群部署

一、环境配置

1.用户创建

#以ROOT用户登录创建idaas用户 

groupadd idaas useradd -g idaasidaas 

#修改idaas用户密码 
echo idaas@123 | passwd --stdin idaas

2.操作系统内核参数调优

#永久关闭
selinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux   

# 修改 /etc/security/limits.conf 文件 

cat >> /etc/security/limits.conf << EOF 

* soft nofile 65536
* hard nofile 65536 
* soft nproc 65536 
* hard nproc 65536 
EOF


#修改 /etc/security/limits.d/20-nproc.conf 
添加: 
cat >> /etc/security/limits.d/20-nproc.conf << EOF 
root       soft    nproc     unlimited 
EOF




# 修改/etc/sysctl.conf文件

cat >> /etc/sysctl.conf <<EOF

vm.max_map_count = 262144

vm.swappiness =1

 

net.ipv4.tcp_fin_timeout=2

net.ipv4.tcp_tw_reuse=1

#net.ipv4.tcp_tw_recycle=1

net.ipv4.tcp_syncookies=1

net.ipv4.tcp_keepalive_time=600

net.ipv4.ip_local_port_range=4000 65000

net.ipv4.tcp_max_syn_backlog=16384

net.ipv4.route.gc_timeout=100

net.ipv4.tcp_max_tw_buckets = 5000

 

net.ipv4.tcp_syn_retries=1

net.ipv4.tcp_synack_retries=1

net.core.somaxconn=16384

net.core.netdev_max_backlog=16384

net.ipv4.tcp_max_orphans=16384

 

kernel.shmmax=15461882265

kernel.shmall=3774873

kernel.msgmax=65535

kernel.msgmnb=65535

EOF




# 修改文件 /etc/systemd/system.conf ,分别修改以下内容。

cat >> /etc/systemd/system.conf <<EOF

DefaultLimitNOFILE=65536

DefaultLimitNPROC=32000

DefaultLimitMEMLOCK=infinity

EOF

 

# 执行命令生效状态

sysctl -p

3.配置防火墙

systemctl stop firewalld

systemctl disable firewalld

4.配置hosts

vim /etc/hosts

192.168.52.15 rabbitmq-01

192.168.52.16 rabbitmq-02

192.168.52.17 rabbitmq-03

5.配置主机名

hostnamectl set-hostname rabbitmq-01

hostnamectl set-hostname rabbitmq-02

hostnamectl set-hostname rabbitmq-03

二、rabbitmq高可用

Rabbitmq cluster部署分布:

10.0.0.101 master

10.0.0.102 slave1

10.0.0.103 slave2

2.1、安装包下载

wget https://github.com/rabbitmq/erlang-rpm/releases/download/v27.3.1/erlang-27.3.1-1.el8.x86_64.rpm

wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v4.1.0/rabbitmq-server-4.1.0-1.el8.noarch.rpm

2.2、rabbitmq安装

rpm -ivh erlang-27.3.1-1.el8.x86_64.rpm

rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm --nodeps

rpm -ivh rabbitmq-server-4.1.0-1.el8.noarch.rpm

2.3、配置文件

创建自定义数据和日志目录

mkdir -p /data/rabbitmq/data /data/rabbitmq/log

编辑配置文件

vim /etc/rabbitmq/rabbitmq-env.conf

RABBITMQ_MNESIA_BASE=/data/rabbitmq/data

RABBITMQ_LOG_BASE=/data/rabbitmq/log

RABBITMQ_ERLANG_COOKIE=/data/rabbitmq/.erlang.cookie

 

赋予.erlang.cookie文件权限(其他2台从节点要与134.86.5.55保持一致)

vim /data/rabbitmq/.erlang.cookie

KAIJQVKJHAGMUCWXZGVG

 

chmod -R 400 /data/rabbitmq/.erlang.cookie

chown -R rabbitmq.rabbitmq /data/rabbitmq/

2.4、rabbitmq启动

启动web管理插件和分片插件

rabbitmq-plugins enable rabbitmq_management

rabbitmq-plugins enable rabbitmq_sharding

 

设置开机自启

systemctl enable rabbitmq-server

systemctl restart rabbitmq-server

systemctl status rabbitmq-server

2.5、加入集群

除192.168.52.15外其他四台rabbitmq服务器执行加入集群命令(主节点无需执行如下操作):

(1)关闭 

rabbitmqctl stop_app

(2)加入集群

rabbitmqctl join_cluster rabbit@rabbitmq-01

(3)启动服务

rabbitmqctl start_app

(4)查看集群状态,任意节点执行:

rabbitmqctl cluster_status

2.6、配置rabbitmq权限

创建用户并授权可操作的虚拟主机/超管权限

rabbitmqctl add_user admin 123456

rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

rabbitmqctl set_user_tags admin administrator

 

创建用户并授权可操作的虚拟主机/超管权限

rabbitmqctl add_user idaas 123456

rabbitmqctl set_permissions -p "/" idaas ".*" ".*" ".*"


rabbitmqctl add_vhost /idaas

rabbitmqctl set_permissions -p "/idaas" idaas ".*" ".*" ".*"

rabbitmqctl list_permissions -p /idaas

rabbitmqctl set_user_tags idaas administrator

rabbitmqctl delete_user guest

 

在其他节点检查,账户是否已同步:

rabbitmqctl list_users

2.7、访问rabbitmq

浏览器访问: http://10.0.0.101:15672

三、rabbitmq详细解释

rabbitmq 这些生产者(Producer):发送消息的程序。 
交换机(Exchange):接收消息并路由到队列,支持多种路由规则。 
队列(Queue):存储消息的缓冲区,供消费者拉取。 
消费者(Consumer):从队列接收并处理消息。 
绑定(Binding):定义交换机与队列的路由规则(如匹配 routing key)。
RabbitMQ 核心组件:到底是什么?实际工作原理
我用最通俗、最贴近实际工作的方式,把 RabbitMQ 这 5 个核心组件拆开讲清楚,告诉你它们实际是什么、长什么样、干什么用。

先给你一个总纲:
RabbitMQ 本质 = 快递分发系统
生产者 = 寄件人
交换机 = 快递分拣中心
队列 = 快递柜
消费者 = 取件人
绑定 = 分拣规则

1. 生产者(Producer)—— 实际就是:发送消息的业务代码 / 服务
实际是什么?
不是一个神秘组件,就是你写的一段程序、一个微服务、一个接口
任何语言(Java/Python/Go/PHP)都能写
唯一作用:把消息发给 RabbitMQ 的交换机,发完就不管了
实际例子
订单服务创建订单后,发送一条 “订单已创建” 消息
支付服务扣款成功,发送 “支付完成” 消息
日志服务收集日志,发送 “日志记录” 消息
实际代码里长这样(伪代码)
plaintext
// 你写的业务代码 = 生产者
connect(rabbitmq服务器)
channel.basicPublish(
  exchange = "订单交换机",  # 发给哪个分拣中心
  routingKey = "order.create", # 带个标签
  message = "订单ID:1001 已创建"
)



2. 交换机(Exchange)—— 实际就是:消息路由分发器
实际是什么?
RabbitMQ 内部的消息转发模块,你看不到它,但它是核心
不存储消息(除了特殊情况),只负责:收到消息 → 按规则转发到队列
必须绑定队列才能工作
实际有 4 种类型(工作中最常用)
direct(直连):精确匹配 routing key,一模一样才转发
topic(主题):通配符匹配,支持 user.* / order.#
fanout(广播):无脑转发给所有绑定队列,无视 routing key
headers(头匹配):用消息头属性匹配,极少用
实际作用
决定消息发给谁、不发给谁
实现:单播、广播、条件分发
3. 队列(Queue)—— 实际就是:消息缓存容器(内存 / 磁盘)
实际是什么?
真实存在的消息缓冲区
可以存在内存(快)或磁盘(持久化、安全)
只有队列会真正存储消息
消费者只能从队列拿消息,不能直接从交换机拿
实际特点
先进先出 FIFO
可以设置:持久化、优先级、长度限制、过期时间
多个消费者可以同时监听一个队列(负载均衡)
实际工作流程
交换机 → 把消息扔给队列 → 队列存起来 → 等着消费者来取
4. 消费者(Consumer)—— 实际就是:监听并处理消息的程序
实际是什么?
和生产者一样,就是你写的一段代码 / 服务
一直监听(订阅)某个队列
队列一有消息,立刻自动拉取并执行业务逻辑
实际例子
库存服务:监听订单队列 → 收到消息 → 扣减库存
短信服务:监听通知队列 → 收到消息 → 发送短信
物流服务:监听支付队列 → 收到消息 → 生成物流单
实际代码里长这样(伪代码)
plaintext
// 你写的业务代码 = 消费者
channel.basicConsume(
  queue = "订单队列",
  autoAck = false,
  callback = (消息) => {
    处理业务:扣库存、发通知...
    手动确认:消息处理完成
  }
)
5. 绑定(Binding)—— 实际就是:交换机 → 队列 的 “连线 + 规则”
实际是什么?
不是一个实体,是一条关系、一条配置
作用:告诉 RabbitMQ
“这个交换机,要把满足 XX 规则的消息,转发给这个队列”
实际包含 2 个东西
交换机名
队列名
路由键(routing key)/ 绑定键(binding key)
实际例子
plaintext
绑定:订单交换机 → 订单队列
规则:routing key = "order.create"
含义:只有带 "order.create" 标签的消息,才进这个队列
plaintext
绑定:日志交换机 → 错误日志队列
规则:routing key = "log.#"
含义:所有以 log 开头的消息,都进这个队列
最关键:它们实际是怎么配合工作的?(真实流程)
plaintext
1. 生产者(你的代码)发消息 → 发给【交换机】
2. 交换机根据【绑定规则】 → 把消息转发给对应【队列】
3. 队列把消息存起来
4. 消费者(你的代码)一直监听队列 → 拿到消息 → 处理业务
一句话总结它们的关系:
生产者发消息给交换机,交换机按绑定规则扔给队列,消费者从队列取消息。
用一句话记住每个组件实际是什么
生产者:发消息的业务代码
交换机:消息分拣转发器
队列:存消息的盒子
消费者:收消息处理的业务代码
绑定:交换机和队列之间的转发规则
总结
生产者 / 消费者 = 你写的代码
交换机 / 队列 = RabbitMQ 内部组件
绑定 = 转发规则配置
核心流程:生产者 → 交换机 →(绑定)→ 队列 → 消费者
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐