• 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 的节点恢复后,才可以被消费。如果没有持久化的话,就会产生消息丢失的现象。

  • 相关阅读:
    cf Round #766(Div. 2)
    网易评论盖楼效果前台实现。。。
    Golang 基础之基础语法梳理 (三)
    Golang 基础之基础语法梳理 (一)
    Golang 基础之基础语法梳理 (二)
    adonisJS mysql
    angular form表单
    adonisJS 入门(路由/控制器/模型/视图)
    angular 父子组件传值及通讯
    adonisJS 视图/查询/列表/单条
  • 原文地址:https://www.cnblogs.com/tomkluas/p/12699509.html
Copyright © 2020-2023  润新知