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

    搭建普通集群

    1.使用docker启动mq

    首先拉取镜像:rabbitmq:management 镜像id:771d109b8bde

    创建容器并运行(15672是管理界面的端口,5672是服务的端口。可将管理系统的用户名和密码设置为admin admin),例如:

    docker run -dit --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:managemen

    下面开始运行集群的rabbitmq节点(这里使用三个节点)

      node1(mq1_host):  mq1 master 主节点

      node2(mq2_host):  mq2 slave1 副本节点

      node3(mq3_host):  mq3 slave2 副本节点

    启动mq1:
    docker run -id --name mq1 -p 15600:15672 -p 5600:5672 --hostname mq1_host -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' 771d109b8bde
    
    启动mq2: docker run
    -id --name mq2 -p 15601:15672 -p 5601:5672 --hostname mq2_host -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' --link mq1:mq1_host 771d109b8bde
    启动mq3: docker run
    -id --name mq3 -p 15602:15672 -p 5602:5672 --hostname mq3_host -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' --link mq1:mq1_host --link mq2:mq2_host 771d109b8bde

    参数解释:

    • -p :宿主机端口映射容器端口,分别为web插件端口,rbbitmq服务端口

    • --hostname:主机名称,也是rabbitmq节点名称

    • -e:使用环境变量 RABBITMQ_ERLANG_COOKIE 设置 rabbitmq 的 cookie,一个集群中的rabbitmq节点必须使用相同cookie文件;

      • rabbitmq服务首次启动时,都会生成一个cookie,在/var/lib/rabbitmq/.erlang.cookie文件中

      • rabbitmq是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证

    • --link:容器之间进行相互连接

     

    2.检查各节点的cookie是否一致

    node1: cat /var/lib/rabbitmq/.erlang.cookie 
    node2: cat /var/lib/rabbitmq/.erlang.cookie
    node3: cat /var/lib/rabbitmq/.erlang.cookie

     

    3.加入节点到集群

    在node2和node3执行加入集群命令:

    docker exec -it mq2(mq3) /bin/bash     // 进入容器
    rabbitmqctl stop_app        // 关闭应用(关闭当前启动的节点)
    // 非必须
    rabbitmqctl reset // 从管理数据库中移除所有数据,如配置过的用户和虚拟宿主, 删除所有持久化的消息(该命令要在rabbitmqctl stop_app之后使用)
    rabbitmqctl join_cluster rabbit@mq1_host   // 加入集群,成功会返回:Clustering node rabbit@mq2_host with rabbit@mq1_host
    rabbitmqctl start_app    // 启动应用

    注意:必须rabbit@开头,后面接主机名(不能是ip),所以前面的主机名和ip映射很重要

    查看集群状态,任意节点执行:

    rabbitmqctl cluster_status

    登录管理界面,展示如下状态:

    集群测试:

    1.在node1上创建队列hello

    2.查看node2和node3节点

    2.关闭node1节点,执行命令 rabbitmqctl stop_app,查看node2和node3: 

    从结果看到:普通集群当主节点宕机后,从节点状态state变为down,无法继续提供服务

    总结:

    集群搭建的关键:

    • ip和主机名的映射

    • 各节点的cookie需保证一致

    镜像集群

    1.策略说明

    策略,简单来说就是规则:

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

    普通集群下,从节点无法复制队列数据,虽然可以从slave节点看到queue;

    现在对队列做镜像,需要添加一个策略:

    rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern>  <definition>

    主要参数:

    • -p vhost : 可选,针对指定vhost下的queue进行镜像

    • name:策略名称(自定义)

    • pattern:queue的匹配模式(正则),对匹配到的queue进行镜像

    • definition:镜像定义,主要包括三部分:ha-mode,ha-params,ha-sync-mode

      • ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes

        • all:表示在集群中所有的节点上进行镜像

        • exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定

        • nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定

      • ha-params:ha-mode模式需要用到的参数

      • ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual

      • priority:可选参数,policy的优先级(当有多个策略作用时,该策略的优先级)

     

    2.查看当前策略

    rabbitmqctl list_policies

     

    3.添加策略

    现添加一个策略:

    • 在集群中所有的节点上进行镜像, ha-mode: all

    • 只对 hello 开头的队列做镜像, '^hello'

    • 队列中消息的同步方式为自动,ha-sync-mode: automatic

    rabbitmqctl set_policy ha-all '^hello' '{"ha-mode":"all","ha-sync-mode":"automatic"}' 
    // 说明:策略正则表达式为 “^” 表示匹配所有队列名称  “^hello”:匹配hello开头队列

     

    4.删除策略

    rabbitmqctl clear_policy ha-all

     

     

  • 相关阅读:
    Chrome V75V76新版无法存为mhtml格式解决办法
    RHEL7 的注册
    JQuery淡入淡出 banner切换特效
    怎样把小坚果做成大生意
    黄页前台联动菜单修改时不能显示,要重新选择|没样式
    V9任何页面GET调用内容分页的说明
    phpcms v9 自定义伪静态的分页函数
    phpcms v9 自定义分页 带下拉跳转
    discuz X2.5自己写代码,获取当前登录的用户信息
    discuz!X2.5技术文档
  • 原文地址:https://www.cnblogs.com/Deaseyy/p/13580547.html
Copyright © 2011-2022 走看看