rabbitmq集群部署
·
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 内部组件
绑定 = 转发规则配置
核心流程:生产者 → 交换机 →(绑定)→ 队列 → 消费者
更多推荐
所有评论(0)