阿里云linux Docker 安装RabbitMQ

  单体安装
#拉取镜像 docker pull rabbitmq:management

 运行mq
docker run -d --hostname rabbit_host1 --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management

#介绍
-d 以守护进程方式在后台运行
-p 15672:15672 management 界面管理访问端口
-p 5672:5672 amqp 访问端口
--name:指定容器名
--hostname:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的别名,并且将显示在容器的bash中
-e 参数
  RABBITMQ_DEFAULT_USER 用户名
  RABBITMQ_DEFAULT_PASS 密码

4369 erlang 发现口
5672 client 端通信口
15672 管理界面 ui 端口
25672 server 间内部通信口

访问管理界面
ip:15672
注意事项!!!!
Linux服务器检查防火墙是否关闭
云服务器检查网络安全组是否开放端口
CentOS 7 以上默认使用的是firewall作为防火墙
查看防火墙状态
firewall-cmd --state

停止firewall
systemctl stop firewalld.service

禁止firewall开机启动
systemctl disable firewalld.service

集群安装

准备3个节点安装好rabbitmq,形成集群 (记得每个节点间隔几十秒再启动,如果失败删除宿主机文件重新搭建)

erlang.cookie是erlang的分布式token文件,集群内各个节点的erlang.cookie需要相同,才可以互相通信

开始安装

#节点一,主节点,创建-v映射目录
docker run -d --hostname rabbit_host1 --name rabbitmq1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_NODENAME=rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=xdclass.net168  -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie_xdclass' --privileged=true -v /usr/local/rabbitmq/1/lib:/var/lib/rabbitmq -v /usr/local/rabbitmq/1/log:/var/log/rabbitmq rabbitmq:management

#节点二,创建-v映射目录
docker run -d --hostname rabbit_host2 --name rabbitmq2  -p 15673:15672 -p 5673:5672 --link rabbitmq1:rabbit_host1 -e RABBITMQ_NODENAME=rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=xdclass.net168 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie_xdclass' --privileged=true -v /usr/local/rabbitmq/2/lib:/var/lib/rabbitmq -v /usr/local/rabbitmq/2/log:/var/log/rabbitmq rabbitmq:management

#节点三,创建-v映射目录
docker run -d --hostname rabbit_host3 --name rabbitmq3 -p 15674:15672 -p 5674:5672 --link rabbitmq1:rabbit_host1 --link rabbitmq2:rabbit_host2 -e RABBITMQ_NODENAME=rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=xdclass.net168 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie_xdclass' --privileged=true -v /usr/local/rabbitmq/3/lib:/var/lib/rabbitmq -v /usr/local/rabbitmq/3/log:/var/log/rabbitmq rabbitmq:management

--hostname 自定义Docker容器的 hostname

--link 容器之间连接,link不可或缺,使得三个容器能互相通信

--privileged=true 使用该参数,container内的root拥有真正的root权限,否则容器出现permission denied

-v 宿主机和容器路径映射

参数 RABBITMQ_NODENAME,缺省 Unix*: rabbit@$HOSTNAME
参数 RABBITMQ_DEFAULT_USER=admin
参数 RABBITMQ_DEFAULT_PASS=xdclass.net168

Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同, 相当于不同节点之间通讯的密钥,erlang.cookie是erlang的分布式token文件,集群内各个节点的erlang.cookie需要相同,才可以互相通信

安装完成后执行一下命令

  • 配置集群
  • 节点一配置集群
    docker exec -it rabbitmq1 bash
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl start_app
    exit


    节点二加入集群,--ram是以内存方式加入,忽略该参数默认为磁盘节点。
    docker exec -it rabbitmq2 bash
    rabbitmqctl stop_app
    rabbitmqctl join_cluster --ram rabbit@rabbit_host1
    rabbitmqctl start_app
    exit


    节点三加入集群,--ram是以内存方式加入,忽略该参数默认为磁盘节点。

    docker exec -it rabbitmq3 bash
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl join_cluster --ram rabbit@rabbit_host1
    rabbitmqctl start_app
    exit

    #查看集群节点状态,配置启动了3个节点,1个磁盘节点和2个内存节点

    rabbitmqctl cluster_status

image-20210117230617230

image-20210117225337724

SpringBoot项目配置集群
#配置文件修改
#消息队列
spring:
  rabbitmq:
    addresses: 10.211.55.13:5672,10.211.55.13:5673,10.211.55.13:5674
    virtual-host: /dev
    password: xdclass.net168
    username: admin
    #开启消息二次确认,生产者到broker的交换机
    publisher-confirm-type: correlated


    #开启消息二次确认,交换机到队列的可靠性投递
    publisher-returns: true
    #为true,则交换机处理消息到路由失败,则会返回给生产者
    template:
      mandatory: true

    #消息手工确认ACK
    listener:
      simple:
        acknowledge-mode: manual 

RabbitMQ高可用mirror镜像集群配置策略配置

  • 前面搭建了普通集群,如果磁盘节点挂掉后,如果没开启持久化数据就丢失了,其他节点也无法获取消息,所以我们这个集群方案需要进一步改造为
  • 策略policy介绍

    rabbitmq的策略policy是用来控制和修改集群的vhost队列和Exchange复制行为
    就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步
    创建一个策略来匹配队列

    路径:rabbitmq管理页面 —> Admin —> Policies —> Add / update a policy

    参数: 策略会同步同一个VirtualHost中的交换器和队列数据

    name:自定义策略名称
    Pattern:^ 匹配符,代表匹配所有
    Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)

ha-mode: 指明镜像队列的模式,可选下面的其中一个
  all:表示在集群中所有的节点上进行镜像同步(一般都用这个参数)
  exactly:表示在指定个数的节点上进行镜像同步,节点的个数由ha-params指定
  nodes:表示在指定的节点上进行镜像同步,节点名称通过ha-params指定
  
ha-sync-mode:镜像消息同步方式 automatic(自动),manually(手动)

image-20210215172043309

  • 配置好后,+2的意思是有三个节点,一个节点本身和两个镜像节点, 且可以看到策略名称 xdclass_mirror
  • 集群重启顺序

    • 集群重启的顺序是固定的,并且是相反的
    • 启动顺序:磁盘节点 => 内存节点
    • 关闭顺序:内存节点 => 磁盘节点
    • 最后关闭必须是磁盘节点,否则容易造成集群启动失败、数据丢失等异常情况
  • pringBoot AMQP单机配置

 spring:
  rabbitmq:
    host: 10.211.55.13
    port: 5672
    virtual-host: /
    password: guest
    username: guest
    # 投递到交换机
    publisher-confirm-type: correlated
    # 交换机到队列
    publisher-returns: true
    ##指定消息在没有被队列接收时是否强行退回还是直接丢弃,true是退回
    template:
      mandatory: true

    #开启手动确认消息,如果消息重新入对则会一直重试,可以配置重试次数
    listener:
      simple:
        acknowledge-mode: manual

  • 高可用镜像集群配置

#消息队列
spring:
  rabbitmq:
    addresses: 10.211.55.13:5672,10.211.55.13:5673,10.211.55.13:5674
    virtual-host: /dev
    password: xdclass.net168
    username: admin
    #开启消息二次确认,生产者到broker的交换机
    publisher-confirm-type: correlated


    #开启消息二次确认,交换机到队列的可靠性投递
    publisher-returns: true
    #为true,则交换机处理消息到路由失败,则会返回给生产者
    template:
      mandatory: true

    #消息手工确认ACK
    listener:
      simple:
        acknowledge-mode: manual

  • 高可用集群测试

    • 关闭消费者监听
    • 生产者发送一个消息
    • 停止节点一和节点二,web管控台访问不了
    • 启动消费者监听,可以消费到消息
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值