RabbitMQ 集群

一、集群形式

RabbiMQ 是用 Erlang 开发的,集群非常方便,因为 Erlang 天生就是一门分布式语言,但其 本身并不支持负载均衡。 RabbitMQ 集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化),集群中至少有 一个 Disk 节点。

1.1 普通模式(默认)

对于普通模式,集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节 点。对于消费者来说,若消息进入 A 节点的 Queue 中,当从 B 节点拉取时,RabbitMQ 会 将消息从 A 中取出,并经过 B 发送给消费者。
应用场景:该模式各适合于消息无需持久化的场合,如日志队列。当队列非持久化,且 创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化, 只能等故障节点恢复。

1.2 镜像模式

与普通模式不同之处是消息实体会主动在镜像节点间同步,而不是在取数据时临时拉 取,高可用;该模式下,mirror queue 有一套选举算法,即 1 个 master、n 个 slaver,生产 者、消费者的请求都会转至 master。
应用场景:可靠性要求较高场合,如下单、库存队列。 缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消 耗。
(1)镜像集群也是基于普通集群,即只有先搭建普通集群,然后才能设置镜像队列。
(2)若消费过程中,master 挂掉,则选举新 master,若未来得及确认,则可能会重复消费。

二、搭建集群

我们搭建的集群是普通模式和镜像模式的结合
整体流程

--rabitMQ集群----------------------------------------------------------estart--

# 创建目录
mkdir /mydata/rabbitmq
cd /mydata/rabbitmq
mkdir rabbitmq01 rabbitmq02 rabbitmq03
# 首先下载镜像,然后备份,这样后期安装出现问题可以回滚。
docker pull rabbitmq:management
# docker 启动第一个节点
docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672  rabbitmq:management
# docker 启动第二个节点
docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672  --link rabbitmq01:rabbitmq01 rabbitmq:management
# docker 启动第三个节点
docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672  --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management

## 至此这三台rabbitmq还没有关系,他们还不是集群,我们需要在每个rabbitmq的/var/lib/rabbitmq 下的.erlang.cookie 中的值设置为一样的。ZWWMAPUWLBFVYMESBNGX
## 第一步:设置cookie为同一个值
cd /mydata/rabbitmq/rabbitmq01
ls -al
chmod 600 .erlang.cookie
vi .erlang.cookie
cd /mydata/rabbitmq/rabbitmq02
chmod 600 .erlang.cookie
cd /mydata/rabbitmq/rabbitmq03
chmod 600 .erlang.cookie
docker restart rabbitmq01 rabbitmq02 rabbitmq03
## 第二步:rabbitmq01节点设置
	# 进入容器
	docker exec -it rabbitmq01 /bin/bash
	# 表示终止RabbitMQ的应用,但是Erlang节点还在运行。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之前,例如 reset
	rabbitmqctl stop_app
	# 表示设置RabbitMQ节点为原始状态。会从该节点所属的cluster中都删除,从管理数据库中删除所有数据,例如配置的用户和vhost,还会删除所有的持久消息。
	# 要想reset和force_reset操作执行成功,RabbitMQ应用需要处于停止状态,即执行过 stop_app
	rabbitmqctl reset
	# 表示启动RabbitMQ的应用。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之后,例如 reset
	rabbitmqctl start_app
	exit

## 第三步:rabbitmq02节点设置 加入到01中
	docker exec -it rabbitmq02 /bin/bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	## 如果加入不成功,重新执行上面2步,并且等待reset完成后在执行下面的命令
	rabbitmqctl join_cluster --ram rabbit@rabbitmq01  # 加入集群中
	rabbitmqctl start_app
	exit

## 第四步:rabbitmq03节点设置 加入到01中
	docker exec -it rabbitmq03 /bin/bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	## 如果加入不成功,重新执行上面2步,并且等待reset完成后在执行下面的命令
	rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #加入集群中
	rabbitmqctl start_app
	exit
	
## 第五步:实现镜像集群
docker exec -it rabbitmq01 bash
# 设置策略 ha表示高可用[high avaliable] ^ 表示对所有队列起作用 如:^hello只匹配hello开头的队列
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
# 查看vhost / 下的所有policy
rabbitmqctl list_policies -p /
	

--rabitMQ集群----------------------------------------------------------end-----

2.1 搭建普通集群

第一步:docker 启动三个rabbitMQ节点

# 创建目录
mkdir /mydata/rabbitmq
cd /mydata/rabbitmq
mkdir rabbitmq01 rabbitmq02 rabbitmq03
# 首先下载镜像,然后备份,这样后期安装出现问题可以回滚。
docker pull rabbitmq:management
# docker 启动第一个节点
docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672  rabbitmq:management
# docker 启动第二个节点
docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672  --link rabbitmq01:rabbitmq01 rabbitmq:management
# docker 启动第三个节点
docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672  --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management

参数说明:
–hostname 设置容器的主机名
RABBITMQ_ERLANG_COOKIE 已经过期了,不能使用了。节点认证作用,部署集成时 需要同步该值
在这里插入图片描述
第二步:设置cookie为同一个值
至此这三台rabbitmq还没有关系,他们还不是集群,我们需要在每个rabbitmq的/var/lib/rabbitmq 下的.erlang.cookie 中的值设置为一样的。ZWWMAPUWLBFVYMESBNGX

## 第一步:设置cookie为同一个值
cd /mydata/rabbitmq/rabbitmq01
ls -al
chmod 600 .erlang.cookie
vi .erlang.cookie
cd /mydata/rabbitmq/rabbitmq02
chmod 600 .erlang.cookie
cd /mydata/rabbitmq/rabbitmq03
chmod 600 .erlang.cookie
docker restart rabbitmq01 rabbitmq02 rabbitmq03

第三步:添加节点

## 第二步:rabbitmq01节点设置
	# 进入容器
	docker exec -it rabbitmq01 /bin/bash
	# 表示终止RabbitMQ的应用,但是Erlang节点还在运行。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之前,例如 reset
	rabbitmqctl stop_app
	# 表示设置RabbitMQ节点为原始状态。会从该节点所属的cluster中都删除,从管理数据库中删除所有数据,例如配置的用户和vhost,还会删除所有的持久消息。
	# 要想reset和force_reset操作执行成功,RabbitMQ应用需要处于停止状态,即执行过 stop_app
	rabbitmqctl reset
	# 表示启动RabbitMQ的应用。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之后,例如 reset
	rabbitmqctl start_app
	exit

## 第三步:rabbitmq02节点设置 加入到01中
	docker exec -it rabbitmq02 /bin/bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	## 如果加入不成功,重新执行上面2步,并且等待reset完成后在执行下面的命令
	rabbitmqctl join_cluster --ram rabbit@rabbitmq01  # 加入集群中
	rabbitmqctl start_app
	exit
	
## 第四步:rabbitmq03节点设置 加入到01中
	docker exec -it rabbitmq03 /bin/bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	## 如果加入不成功,重新执行上面2步,并且等待reset完成后在执行下面的命令
	rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #加入集群中
	rabbitmqctl start_app
	exit

2.2 实现镜像集群

普通的集群由缺陷就是如果主节点宕机,那么整个集群就会瘫痪,镜像集群可以在主节点宕机后自动拉起一个子节点作为主节点。

docker exec -it rabbitmq01 bash
#设置策略 ha表示高可用[high avaliable] ^ 表示对所有队列起作用 如:^hello只匹配hello开头的队列
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
# 查看vhost / 下的所有policy
rabbitmqctl list_policies -p /

参数:
automatic:自动同步
ha-sync-mode:高可用模式
在这里插入图片描述

2.3 测试

任意 进入一个rabbit地址
http://192.168.3.123:15675/#/
http://192.168.3.124:15675/#/
http://192.168.3.125:15675/#/
在这里插入图片描述
镜像集群:
主从会复制,宕机会自动拉起子节点为主节点。
在这里插入图片描述
在这里插入图片描述
还可以测试向hallo中发消息,只要有一个接受了,消息就会被清楚。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值