zoukankan      html  css  js  c++  java
  • docker搭建Rabbitmq集群

    环境说明:

    • 阿里云服务器
    • Ubuntu 16.04
    • docker

    1、拉取镜像

    docker pull rabbitmq:management
    root@iZ282zj76jqZ:~# docker images|grep rabbitmq
    rabbitmq            management          30e33de9be86        3 days ago          184MB

    2、创建容器 ( 指定密码可添加参数  -e RABBITMQ_DEFAULT_USER=tom -e RABBITMQ_DEFAULT_PASS=tomkluas )

    docker run -d --hostname host0 --name mq0 -e RABBITMQ_ERLANG_COOKIE='tomkluas' -p 5672:5672 -p 80:15672 rabbitmq:management
    docker run -d --hostname host1 --name mq1 -e RABBITMQ_ERLANG_COOKIE='tomkluas' -p 5673:5672 --link mq0:host0 rabbitmq:management
    docker run -d --hostname host2 --name mq2 -e RABBITMQ_ERLANG_COOKIE='tomkluas' -p 5674:5672 --link mq0:host0 --link mq1:host1 rabbitmq:management
    root@iZ282zj76jqZ:~# docker ps 
    CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                                                                                     NAMES
    ec64e363924b        rabbitmq:management   "docker-entrypoint.s…"   7 seconds ago        Up 5 seconds        4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp                    mq2
    8ae49e19d609        rabbitmq:management   "docker-entrypoint.s…"   20 seconds ago       Up 18 seconds       4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp                    mq1
    8c5f2220f14a        rabbitmq:management   "docker-entrypoint.s…"   About a minute ago   Up About a minute   4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5672->5672/tcp, 0.0.0.0:80->15672/tcp   mq0

    3、配置容器

    配置mq0

    root@iZ282zj76jqZ:~# docker exec -it mq0 bash
    root@host0:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@host0 ...
    root@host0:/# rabbitmqctl reset
    Resetting node rabbit@host0 ...
    root@host0:/# rabbitmqctl start_app
    Starting node rabbit@host0 ...
     completed with 3 plugins.
    root@host0:/# exit
    exit

    配置mq1

    root@iZ282zj76jqZ:~# docker exec -it mq1 bash
    root@host1:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@host1 ...
    root@host1:/# rabbitmqctl reset
    Resetting node rabbit@host1 ...
    root@host1:/# rabbitmqctl join_cluster --ram rabbit@host0
    Clustering node rabbit@host1 with rabbit@host0
    root@host1:/# rabbitmqctl start_app
    Starting node rabbit@host1 ...
     completed with 3 plugins.
    root@host1:/# exit
    exit

    配置mq2

    root@iZ282zj76jqZ:~# docker exec -it mq2 bash
    root@host2:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@host2 ...
    root@host2:/# rabbitmqctl reset
    Resetting node rabbit@host2 ...
    root@host2:/# rabbitmqctl join_cluster --ram rabbit@host0
    Clustering node rabbit@host2 with rabbit@host0
    root@host2:/# rabbitmqctl start_app
    Starting node rabbit@host2 ...
     completed with 3 plugins.
    root@host2:/# exit
    exit

    效果图如下:

     到此以上整个集群部署成功了,但是上述只是普通集群,在此之外,还有镜像集群

    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

    方法二:进入mq0执行如下命令

    rabbitmqctl set_policy-p/ha-all"^"'{"ha-mode":"all"}'

    简单对比:

    镜像集群模式

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

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

    普通集群模式

    概念:
    默认的集群模式。需要创建多个 RabbitMQ 节点。但对于 Queue 和消息来说,只存在于其中一个节点,其他节点仅同步元数据,即队列的结构信息。

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

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

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

  • 相关阅读:
    Interview with BOA
    Java Main Differences between HashMap HashTable and ConcurrentHashMap
    Java Main Differences between Java and C++
    LeetCode 33. Search in Rotated Sorted Array
    LeetCode 154. Find Minimum in Rotated Sorted Array II
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 31. Next Permutation
    LeetCode 60. Permutation Sequence
    LeetCode 216. Combination Sum III
  • 原文地址:https://www.cnblogs.com/tomkluas/p/12699509.html
Copyright © 2011-2022 走看看