RabbitMQ(十)【高级 - 集群】

十、RabbitMQ - 高级 - 集群


上一篇文章内存磁盘的监控

RabbitMQ 集群

RabbitMQ 这款消息队列中间件产品本身是基于 Erlang 语言天生具备分布式特性(通过同步 Erlang 集群个节点的 magic cookie 来实现)。因此,RabbitMQ 天然支持 Clustering。这便得 RabbitMQ 本身不需要像 ActiveMQ、Kafka那样通过 Zookeeper 分别来实现 HA 方案和保存集群和元数据。集群是保证可靠性得一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力得目的

在实际使用过程中采取多机多实例部署方式

主要参考官方文档https://www.rabbitmq.com/clustering.html

10.1 集群搭建(在Linux虚拟机上使用docker部署)

配置得前提是rabbitmq服务可以运行起来,比如ps aux|grep rabbitmq可以看到相关进程,又比如运行rabbitmqctl status可以看到rabbitmq得运行状态

# 查看 rabbitmq 进程
[root@vinjcent /]# ps aux|grep rabbitmq

在这里插入图片描述

或者

# 查看 RabbitMQ 进程状态
[root@vinjcent /]# systemctl status rabbitmq-server

确保 RabbitMQ 可以运行,确保完成之后,需要将 RabbitMQ 服务停止,后台看不到RabbitMQ得进程为止

# 停止 RabbitMQ 服务
[root@vinjcent /]# systemctl stop rabbitmq-server

环境准备

  • docker
  • java环境
# 获取rabbitmq镜像
[root@vinjcent rabbitmq]# docker pull rabbitmq:3.10.5-management

单机实例搭建

# 创建容器并启动
[root@bogon ~]# docker run -d -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10.5-management

测试本地访问:http://192.168.159.100:15672/#/

默认账号密码是guest,guest

注意:如果运行容器过程出现错误,重启一下docker就可以解决了systemctl restart docker

docker: Error response from daemon: driver failed programming external connectivity on endpoint rabbitmq01 (77f97c9602f7d8490cc4ac82f67e846b0ed09ba7d1849aa83b2adcad465b2d53): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 15673 -j DNAT --to-destination 172.17.0.2:15672 ! -i docker0: iptables: No chain/target/match by that name.

集群模式搭建

  1. 首先创建容器映射目录,用于共享容器文件
# 创建rabbitmq用于存放rabbitmq集群映射信息
mkdir /mydata/rabbitmq
# 分别创建各集群映射目录
cd rabbitmq/
mkdir rabbitmq01 rabbitmq02 rabbitmq03
  1. 安装容器并运行
# rabbitmq01
docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='zr' rabbitmq:3.10.5-management

# rabbitmq02
docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='zr' --link rabbitmq01:rabbitmq01 rabbitmq:3.10.5-management

# rabbitmq03
docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='zr' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:3.10.5-management

### 参数信息
-d 后台运行

--hostname 设置容器的主机名

--name 设置容器名

-v 设置容器数据卷

-p 本地端口与容器端口映射

--link 配置网络桥接

RABBITMQ_ERLANG_COOKIE 节点认证作用,部署集成时,需要同步该值

RABBITMQ_ERLANG_COOKIE 为rabbitmq多节点之间通信所用到的cookie,rabbitmq集群就是利用这一特性实现的

在本机测试访问,默认账号密码是guest,guest

http://192.168.159.100:15673/#/

http://192.168.159.100:15674/#/

http://192.168.159.100:15675/#/

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 设置 rabbitmq01 为主节点
# 1.进入正在运行的rabbitmq01容器
[root@vinjcent rabbitmq]# docker exec -it rabbitmq01 /bin/bash
# 2.停止容器中rabbitmq应用
root@rabbitmq01:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@rabbitmq01 ...
# 3.清除节点上的历史数据(如果不清除,无法将节点加入到集群)
root@rabbitmq01:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@rabbitmq01 ...
# 4.启动应用
root@rabbitmq01:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Starting node rabbit@rabbitmq01 ...

### Ctrl + p + q 退出并运行(尽量避免个人的设置的快捷键与之冲突,从而失效)

在这里插入图片描述

  1. rabbitmq02加入rabbitmq01
# 1.进入正在运行的rabbitmq02容器
[root@vinjcent rabbitmq]# docker exec -it rabbitmq02 /bin/bash
# 2.停止容器中rabbitmq应用
root@rabbitmq02:/# rabbitmqctl stop_app
# 3.清除节点上的历史数据
root@rabbitmq02:/# rabbitmqctl reset
# 4.将rabbitmq02节点加入到rabbitmq01(主节点)集群当中
root@rabbitmq02:/# rabbitmqctl join_cluster --ram rabbit@rabbitmq01
# 5.启动应用
root@rabbitmq02:/# rabbitmqctl start_app

在这里插入图片描述

  1. rabbitmq03加入rabbitmq01
# 1.进入正在运行的rabbitmq03容器
[root@vinjcent rabbitmq]# docker exec -it rabbitmq03 /bin/bash
# 2.停止容器中rabbitmq应用
root@rabbitmq03:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@rabbitmq03 ...
# 3.清除节点上的历史数据
root@rabbitmq03:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@rabbitmq03 ...
# 4.将rabbitmq03节点加入到rabbitmq01(主节点)集群当中
root@rabbitmq03:/# rabbitmqctl join_cluster --ram rabbit@rabbitmq01
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq01

08:35:58.823 [warning] Feature flags: the previous instance of this node must have failed to write the `feature_flags` file at `/var/lib/rabbitmq/mnesia/rabbit@rabbitmq03-feature_flags`:

08:35:58.823 [warning] Feature flags:   - list of previously disabled feature flags now marked as such: [:maintenance_mode_status]

08:35:59.030 [warning] Feature flags: the previous instance of this node must have failed to write the `feature_flags` file at `/var/lib/rabbitmq/mnesia/rabbit@rabbitmq03-feature_flags`:

08:35:59.030 [warning] Feature flags:   - list of previously enabled feature flags now marked as such: [:maintenance_mode_status]

08:35:59.057 [error] Failed to create a tracked connection table for node :rabbit@rabbitmq03: {:node_not_running, :rabbit@rabbitmq03}

08:35:59.057 [error] Failed to create a per-vhost tracked connection table for node :rabbit@rabbitmq03: {:node_not_running, :rabbit@rabbitmq03}

08:35:59.057 [error] Failed to create a per-user tracked connection table for node :rabbit@rabbitmq03: {:node_not_running, :rabbit@rabbitmq03}
# 5.启动应用
root@rabbitmq03:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Starting node rabbit@rabbitmq03 ...

  1. 在主节点查看web管理界面

在这里插入图片描述

添加用户

### 在rabbitmq01添加用户
[root@vinjcent rabbitmq]# docker exec -it rabbitmq01 /bin/bash
# 创建一个账号、密码为"admin"的用户
root@rabbitmq01:/# rabbitmqctl add_user admin admin
# 设置用户身份
root@rabbitmq01:/# rabbitmqctl set_user_tags admin administrator
# 设置所有权限
root@rabbitmq01:/# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

在这里插入图片描述

测试数据同步

  1. 主节点创建一个fanout类型交换机

在这里插入图片描述

查看从节点的交换机

在这里插入图片描述

  1. 主节点创建一个队列

在这里插入图片描述

查看从节点的消息队列

在这里插入图片描述

  1. 从节点中将交换机与队列进行绑定

在这里插入图片描述

查看主节点的消息队列绑定关系

在这里插入图片描述

小结

如果采用的是多机部署的方式,需读取其中一个节点的cookie,并复制到其它节点(节点之间通过cookie确定相互是否可通信)

cookie 存放位置:/var/lib/rabbitmq/.erlang.cookie

例如:主机名分别为 rabbitmq01rabbitmq02rabbitmq03

1、逐个启动节点

2、配置个节点的hosts文件(vim /etc/hosts)

ip1: rabbitmq01

ip2: rabbitmq02

ip3: rabbitmq03

其它的步骤跟单机模式类似

下一篇文章高级 - 分布式事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值