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

 

 

原文地址:https://www.cnblogs.com/Deaseyy/p/13580547.html