当前位置: 首页 > news >正文

RabbitMQ—运维篇

RabbitMQ安装

  • RabbitMQ需要依赖erlang,如果普通安装需要安装erlang并保证二者兼容,因此选择较为简单的docker安装方式

1.获取rabbitmq镜像

docker pull rabbitmq:3.11.19-management #rabbitmq-management表示带有客户端(控制台)
docker pull rabbitmq:3.11.19 #如果只要服务端

2.启动rabbitmq容器

docker run \
-d \
--name rabbitmq \
--hostname=rabbitmqNode1 \ #设置hostname,后续做集群时方便管理,这里将rabbitmq设为节点1
-v rabbitmq-plugins:/plugins \ #将rabbitmq的plugin目录进行挂载,以便后续进行安装rabbitmq插件
-v rabbitmq:/var/lib/rabbitmq \
-e RABBITMQ_DEFAULT_USER=admin \ #设置rabbitmq管理账户为admin、密码为admin
-e RABBITMQ_DEFAULT_PASS=admin \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \ #集群部署时,Erlang Cookie 值必须都相同
-p 15672:15672 \ #15672是客户端的端口,5672是服务端的端口
-p 5672:5672 \
--restart=always \
rabbitmq:3.11.19-management

3.开启防火墙

firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all # 查看已经开放的端口号

3.测试rabbitmq是否安装完成

  • 访问部署IP:15672,观察rabbitmq是否正常部署

RabbitMQ集群

  • RabbitMQ集群部署时,必须保证Erlang Cookie相同

普通集群模式

  • 目的:提高MQ的吞吐量

  • 原理:普通集群模式下,broker之间复制元数据

    1. 生产者给一个broker发送消息,消费者连接的是另一个broker
    2. 生产者连接的broker会将消息转发给消费者的broker,这样就实现了分离消费端和生产端
  • 普通集群模式进一步提高了MQ效率,但不保证高可用,如果一个节点宕机仍然会丢失消息

#如果要再加第三个节点就再--link
docker run -d --name rabbitmqCluster02 --hostname=node2 -v rabbitmqCluster02.plugins:/plugins -v rabbitmqCluster02:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -p 15673:15672 -p 5673:5672 --link rabbitmqCluster01:node1 rabbitmq:3.11.19-management
#节点2,进入容器,开启集群
rabbitmqctl stop_apprabbitmqctl resetrabbitmqctl join_cluster  rabbit@node1rabbitmqctl start_app#节点1,进入容器,重载配置
rabbitmqctl stop_apprabbitmqctl resetrabbitmqctl start_app
#这里加了一个--add-host,即将集群中其他的节点加入,这样才能相互通信
#这里演示一主一从,创建node1节点时就将node2节点也加入,如果如果需要多个就增加几个add-host参数即可
docker run \
-d \
--name rabbitmq \
-v rabbitmq-plugins:/plugins \
-v rabbitmq:/var/lib/rabbitmq \
--hostname=node1 \
--add-host=node2:192.168.1.43 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \
-p 4369:4369 \
-p 25672:25672 \
-p 15672:15672 \
-p 5672:5672 \
--restart=always \
rabbitmq:3.11.19-managementdocker run \
-d \
--name rabbitmq \
-v rabbitmq-plugins:/plugins \
-v rabbitmq:/var/lib/rabbitmq \
--hostname=node2 \
--add-host=node1:192.168.1.35 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \
-p 4369:4369 \
-p 25672:25672 \
-p 15672:15672 \
-p 5672:5672 \
--restart=always \
rabbitmq:3.11.19-management

镜像队列

  • 目的:解决普通集群环境下高可用的问题

  • 原理

    • 队列内容通过主从复制同步到多个节点,主节点处理读写请求,从节点实时同步数据
    • 主节点故障时,从节点通过选举机制自动接管,服务无感知切换
  • 镜像队列虽然实现了高可用,但消息在节点间同步时出现宕机,仍有可能丢失消息

  • 加入集群

    # Node2/Node3执行
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl join_cluster --ram rabbit@rabbit1  # Node1为磁盘节点,其他可设为内存节点
    rabbitmqctl start_app
    
  • 验证集群状态

    rabbitmqctl cluster_status
    # 输出应包含所有节点,且running_nodes列表完整
    
  • 创建镜像策略

    # 将所有队列设置为镜像队列(全量同步)
    rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'# 或指定队列前缀(如以"mirror_"开头的队列)
    rabbitmqctl set_policy ha-mirror "^mirror_" '{"ha-mode":"exactly","ha-params":2}'
    

仲裁队列

  • 目的:类似于redis的哨兵机制,进一步减小了消息丢失的风险

  • 原理

    1. 多数派确认:消息需被超过半数节点(如3节点集群需2个确认)持久化后才返回成功响应,确保数据安全
    2. 选举机制:若Leader宕机,Followers通过Raft协议发起选举,新Leader需获多数节点投票,避免脑裂
  • 队列声明与配置

Map<String, Object> arguments = new HashMap<>();
arguments.put("x-queue-type", "quorum");  // 声明为Quorum队列
channel.queueDeclare("test-quorum-queue", true, false, false, arguments);

Streams队列

  • 目的:数据分片,进一步提高了传输性能

  • 队列声明与配置

Map<String, Object> args = new HashMap<>();
args.put("x-queue-type", "stream");       // 必须设置为stream
args.put("x-max-length-bytes", 20_000_000_000L); // 最大20GB
args.put("x-stream-max-segment-size-bytes", 100_000_000); // 每段100MB
channel.queueDeclare("my-stream", true, false, false, args);

文章转载自:

http://jyUouJqv.chhhq.cn
http://LQFe7RZQ.chhhq.cn
http://eg0gHIay.chhhq.cn
http://sXIveZzS.chhhq.cn
http://B27mwYpC.chhhq.cn
http://ez1HkYsF.chhhq.cn
http://DezFjKlT.chhhq.cn
http://vw8GPIUn.chhhq.cn
http://XWkWtMkT.chhhq.cn
http://HRRZ8xP4.chhhq.cn
http://PD0KlEGi.chhhq.cn
http://TaHAUb3k.chhhq.cn
http://gSPZpX3D.chhhq.cn
http://BSYyQBvx.chhhq.cn
http://kCLbku86.chhhq.cn
http://f1g7eQjf.chhhq.cn
http://Z4t2WsuQ.chhhq.cn
http://kdaACVzT.chhhq.cn
http://2NMT1wNw.chhhq.cn
http://1rz0iKjE.chhhq.cn
http://ztT77Rrx.chhhq.cn
http://WiRwtv9s.chhhq.cn
http://c3MQDWZj.chhhq.cn
http://FVSPVAAE.chhhq.cn
http://paVykDBA.chhhq.cn
http://w5VBPtIb.chhhq.cn
http://l2O0ahsC.chhhq.cn
http://JZCI4Yc5.chhhq.cn
http://KCFS0mcP.chhhq.cn
http://N3SogYzN.chhhq.cn
http://www.dtcms.com/a/385122.html

相关文章:

  • 一站式YOLO目标检测解决方案:训练、测试、推理与数据集转换全流程指南
  • lamp脚本部署
  • 前端构建工具有哪些?常用前端构建工具对比、前端构建工具推荐与最佳实践分析
  • Charles日志分析与流量监控技巧 高效排查接口与性能问题
  • ACM模式的输入部分——input().strip() 与 sys.stdin.readline() 的不同
  • ““.equals(studentID)
  • 【Lesson 3】CUDA 编程模型:线程、块、网格 —— Ubuntu 22.04 + RTX 30/40 系列实战
  • [Windows]C盘瘦身 --- 软件搬家
  • CLIP 完全上手指南:从安装、下载加速、文本/图像编码到图文匹配,一篇全搞定!
  • BKY莱德因:5大黑科技逆转时光
  • 开源嵌入模型推荐与选型指南
  • 科普:Python中为什么“from .utils” 不能写成 “from ./utils”?
  • 客户粘性提升策略是什么?系统化策略提升客户粘性指南
  • Spring 框架从入门到精通(第一篇)—— 框架核心与 IOC 容器实践
  • 通过DSL生成Jenkins流水线
  • 构建AI智能体:三十四、LangChain SQLDatabaseToolkit终极指南:架构、优势与最佳实践
  • 算法 --- 字符串
  • PDF 文件创建时间属性怎样批量修改详细教程
  • hutool DesensitizedUtil
  • train.py代码学习 自学
  • 安全与效率的平衡术:安全空间
  • 【Unity】事件分发系统的使用示例
  • dinov3 源码 笔记1
  • 飞书项目,再交卷中国智造
  • c++多线程(3)------休眠函数sleep_for和sleep_until
  • 正则表达式 - 元字符
  • RDS-MYSQL,这个RDS是什么?和mysql有什么区别?
  • HarmonyOS事件订阅与通知:后台事件处理
  • 医疗器械飞检常见问题:强生测量系统分析中30%误差的改进方法
  • 可视化数字平台如何重塑未来城市空间?