zoukankan      html  css  js  c++  java
  • docker部署RabbitMQ集群

    一、RabbitMQ集群概念

    RabbitMQ 有三种模式:单机模式,普通集群模式,镜像集群模式。单机模式即单独运行一个 rabbitmq 实例,而集群模式需要创建多个 rabbitmq实例。

    1、普通集群模式

    概念:
    默认的集群模式。需要创建多个 RabbitMQ 节点。但对于 Queue 和消息来说,只存在于其中一个节点,其他节点仅同步元数据,即队列的结构信息。
    当消息进入Queue后,如果 Consumer 从创建Queue的这个节点消费消息时,可以直接取出来;但如果 consumer 连接的是其他节点,那 rabbitmq 会把 queue 中的消息从创建它的节点中取出并经过连接节点转发后再发送给consumer。
    所以 consumer 应尽量连接每一个节点。并针对同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连接哪个节点,都会从创建 queue 的节点获取消息,会产生瓶颈。

    特点:
    (1)Exchange 的元数据信息在所有节点上是一致的,而 Queue(存放消息的队列)的完整数据则只会存在于创建它的那个节点上。其他节点只知道这个 queue 的 metadata 信息和一个指向 queue 的 owner node 的指针;

    (2)RabbitMQ 集群会始终同步四种类型的内部元数据(类似索引):
      a.队列元数据:队列名称和它的属性;
      b.交换器元数据:交换器名称、类型和属性;
      c.绑定元数据:一张简单的表格展示了如何将消息路由到队列;
      d.vhost元数据:为 vhost 内的队列、交换器和绑定提供命名空间和安全属性;
      因此,当用户访问其中任何一个 RabbitMQ 节点时,通过 rabbitmqctl 查询到的元数据信息都是相同的。

    (3)无法实现高可用性,当创建 queue 的节点故障后,其他节点是无法取到消息实体的。如果做了消息持久化,那么得等创建 queue 的节点恢复后,才可以被消费。如果没有持久化的话,就会产生消息丢失的现象。

    2、镜像集群模式

    概念:
    把队列做成镜像队列,让各队列存在于多个节点中,属于 RabbitMQ 的高可用性方案。镜像模式和普通模式的不同在于,queue和 message 会在集群各节点之间同步,而不是在 consumer 获取数据时临时拉取。

    特点:
    (1)实现了高可用性。部分节点挂掉后,不会影响 rabbitmq 的使用。
    (2)降低了系统性能。镜像队列数量过多,大量的消息同步也会加大网络带宽开销。
    (3)适合对可用性要求较高的业务场景。

    二、RabbitMQ普通集群部署

    1、拉镜像

    #docker pull rabbitmq:management

    2、运行容器

    #docker run -d --hostname rabbit_host1 --name rabbitmq1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
    #docker run -d --hostname rabbit_host2 --name rabbitmq2 -p 5673:5672 --link rabbitmq1:rabbit_host1 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
    #docker run -d --hostname rabbit_host3 --name rabbitmq3 -p 5674:5672 --link rabbitmq1:rabbit_host1 --link rabbitmq2:rabbit_host2 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management

    主要参数:
    -p 15672:15672 management 界面管理访问端口
    -p 5672:5672 amqp 访问端口
    --link 容器之间连接
    Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。

    3、加入节点到集群

    设置节点1:

    #docker exec -it myrabbit1 bash
    #rabbitmqctl stop_app
    #rabbitmqctl reset
    #rabbitmqctl start_app
    #exit

    设置节点2,加入到集群:

    #docker exec -it myrabbit2 bash
    #rabbitmqctl stop_app
    #rabbitmqctl reset
    #rabbitmqctl join_cluster --ram rabbit@rabbitmq_host1
    #rabbitmqctl start_app
    #exit

    设置节点3,加入到集群:

    #docker exec -it myrabbit3 bash
    #rabbitmqctl stop_app
    #rabbitmqctl reset
    #rabbitmqctl join_cluster --ram rabbit@rabbitmq_host1
    #rabbitmqctl start_app
    #exit

    主要参数:
    --ram 表示设置为内存节点,忽略次参数默认为磁盘节点。该配置启动了3个节点,1个磁盘节点和2个内存节点。

    设置好之后,使用 http://ip:15672 进行访问,默认账号密码:guest/guest

     可以看到,已经有多个节点了。

    三、RabbitMQ镜像集群部署

    1、策略policy概念

    使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。

    为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。

    2、添加策略

    登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy

    name:随便取,策略名称
    Pattern:^ 匹配符,只有一个^代表匹配所有
    Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)

    或者使用命令:
    #rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

    3、查看效果

    此策略会同步所在同一VHost中的交换器和队列数据。设置好policy之后,使用 http://ip:15672 再次进行访问,可以看到队列镜像同步。

    四、Springboot配置RabbitMQ集群

    1、配置RabbitMQ单机

    spring:
      rabbitmq:
        host: localhost
        port: 5672
        username: username
        password: password

    或者使用addresses

    spring:
      rabbitmq:
        addresses:ip1:port1
        username: username
        password: password

    2、配置RabbitMQ集群

    addresses节点用逗号分隔

    spring:
      rabbitmq:
        addresses:ip1:port1,ip2:port2,ip3:port3
        username: username
        password: password
  • 相关阅读:
    NetCore+AutoMapper多个对象映射到一个Dto对象
    log4net快速上手
    WebService基于soapheader的身份验证
    Canvas入门笔记-实现极简画笔
    .Net修改网站项目调试时的虚拟目录
    Roslyn导致发布网站时报错:编译失败
    .NET通过字典给类赋值
    键盘测试工具
    索引器基类定义
    自定义队列任务执行器
  • 原文地址:https://www.cnblogs.com/alan6/p/11691229.html
Copyright © 2011-2022 走看看