搭建普通集群
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
登录管理界面,展示如下状态:
-
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