在阿里云上利用Docker创建RabbitMq主从集群
首先把里面要用到的命令都写出来方便快速查阅
docker run -d \
--name rabbitmqp1 \
--hostname hrabbitmqp1 \
--network hmall_clu \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=password \
-v /root/RABBITMQ_CLU/rabbitmqp1/rabbitmq:/var/lib/rabbitmq \
-v /root/RABBITMQ_CLU/rabbitmqp1/conf:/etc/rabbitmq/rabbitmq.config \
rabbitmq:management
docker run -d \
--name rabbitmqr1 \
--hostname hrabbitmqr1 \
--network hmall_clu \
-p 5671:5672 \
-p 15671:15672 \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=password \
-v /root/RABBITMQ_CLU/rabbitmqr1/rabbitmq:/var/lib/rabbitmq \
-v /root/RABBITMQ_CLU/rabbitmqr1/conf:/etc/rabbitmq/rabbitmq.config \
rabbitmq:management
docker rm -f rabbitmqp1
openssl rand -base64 48
.erlang.cookie
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@hrabbitmqp1
rabbitmqctl start_app
rabbitmqctl cluster_status
docker exec -it rabbitmqp1 bash
docker exec -it rabbitmqr1 bash
vim /root/RABBITMQ_CLU/rabbitmqp1/.erlang.cookie
vim /root/RABBITMQ_CLU/rabbitmqr1/.erlang.cookie
cat /root/RABBITMQ_CLU/rabbitmqp1/.erlang.cookie
cat /root/RABBITMQ_CLU/rabbitmqr1/.erlang.cookie
cat /var/lib/rabbitmq/.erlang.cookie
docker restart rabbitmqp1
docker restart rabbitmqr1
docker rm -f rabbitmqp1
docker rm -f rabbitmqr1
YTYDCbeG7VP/OYh0B+hN3B9yjYqymUXAw3sY8W4EJLaiYDZ+w/JMZ9e1OyZGNIiP
echo 'YTYDCbeG7VP/OYh0B+hN3B9yjYqymUXAw3sY8W4EJLaiYDZ+w/JMZ9e1OyZGNIiP' > /var/lib/rabbitmq/.erlang.cookie
echo 'YTYDCbeG7VP/OYh0B+hN3B9yjYqymUXAw3sY8W4EJLaiYDZ+w/JMZ9e1OyZGNIiP' > /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie
配置过程(建议严格遵循下面的教程)
注:本人是新手不怎么会写教程
创建主和从RabbitMq
- 创建主节点
docker run -d \ --name rabbitmqp1 \ # 设置实例名 --hostname hrabbitmqp1 \ # 设置主机名 --network hmall_clu \ # 设置连接到的网络 -p 5672:5672 \ # 设置端口 -p 15672:15672 \ # 设置端口 (为啥会有两个端口?) -e RABBITMQ_DEFAULT_USER=root \ # 设置默认账户 -e RABBITMQ_DEFAULT_PASS=password \ # 设置默认账户秘密 -v /root/RABBITMQ_CLU/rabbitmqp1/rabbitmq:/var/lib/rabbitmq \ # 设置RabbitMQ的数据的数据卷 -v /root/RABBITMQ_CLU/rabbitmqp1/conf/rabbitmq.config:/etc/rabbitmq/rabbitmq.config \ # 设置RabbitMQ配置文件的数据卷 rabbitmq:management
- 创建从节点
docker run -d \ --name rabbitmqr1 \ --hostname hrabbitmqr1 \ --network hmall_clu \ -p 5671:5672 \ -p 15671:15672 \ -e RABBITMQ_DEFAULT_USER=root \ -e RABBITMQ_DEFAULT_PASS=password \ -v /root/RABBITMQ_CLU/rabbitmqr1/rabbitmq:/var/lib/rabbitmq \ -v /root/RABBITMQ_CLU/rabbitmqr1/conf:/etc/rabbitmq/rabbitmq.config \ rabbitmq:latest
配置Erlang_Cookie
- 进入主节点
docker exec -it rabbitmqp1 bash
- 随机生成一段Cookie这个生成的下面也用的到
openssl rand -base64 48
- 把这段Cookie写入**/var/lib/rabbitmq/.erlang.cookie**
echo '这里替换上面生成的或者你自己随便想一个但是主从Cookie要相同' > /var/lib/rabbitmq/.erlang.cookie chmod 400 /var/lib/rabbitmq/.erlang.cookie #这个一定要加
- 检查是否写入成功
cat /var/lib/rabbitmq/.erlang.cookie
- 次节点重复上面的操作流程第一个命令变为docker exec -it rabbitmqr1 bash
- 最后对两个节点进行重启来加载这个COOKIE
docker restart rabbitmqp1 docker restart rabbitmqr1
配置此节点和主节点连接
- 打开次节点
docker exec -it rabbitmqr1 bash
- 关闭服务
rabbitmqctl stop_app
- 刷新服务
rabbitmqctl reset
- 连接主服务
rabbitmqctl join_cluster rabbit@hrabbitmqp1
- 打开服务
rabbitmqctl start_app
- 打开主节点查看集群是否连接成功
docker restart rabbitmqp1 rabbitmqctl cluster_status
- 成功示例
Cluster status of node rabbit@hrabbitmqp1 ... Basics Cluster name: rabbit@hrabbitmqp1 Disk Nodes rabbit@hrabbitmqp1 rabbit@hrabbitmqr1 Running Nodes rabbit@hrabbitmqp1 rabbit@hrabbitmqr1 Versions rabbit@hrabbitmqp1: RabbitMQ 3.9.11 on Erlang 24.2 rabbit@hrabbitmqr1: RabbitMQ 3.9.11 on Erlang 24.2 Maintenance status Node: rabbit@hrabbitmqp1, status: not under maintenance Node: rabbit@hrabbitmqr1, status: not under maintenance Alarms (none) Network Partitions (none) Listeners Node: rabbit@hrabbitmqp1, interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP Node: rabbit@hrabbitmqp1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@hrabbitmqp1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Node: rabbit@hrabbitmqr1, interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP Node: rabbit@hrabbitmqr1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@hrabbitmqr1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Feature flags Flag: drop_unroutable_metric, state: enabled Flag: empty_basic_get_metric, state: enabled Flag: implicit_default_bindings, state: enabled Flag: maintenance_mode_status, state: enabled Flag: quorum_queue, state: enabled Flag: stream_queue, state: enabled Flag: user_limits, state: enabled Flag: virtual_host_metadata, state: enabled
本地连接
阿里云配置
- 配置
15672
,5672
,15671
,5671
端口可以被其他人访问根据你的实际情况
宝塔配置
- 配置
15672
,5672
,15671
,5671
端口可以被其他人访问根据你的实际情况
错误处理
-
root@hostrabbitmqr1:/# 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@hostrabbitmqr1 …
root@hostrabbitmqr1:/# rabbitmqctl reset- 解决方法
- 该问题的主要原因是环境变量 RABBITMQ_ERLANG_COOKIE 的支持即将被弃用,因此建议使用 .erlang.cookie 文件来配置ERLANG cookie。你可以在每个容器中创建该文件并设置相同的cookie值。
- 但是建议重新创建容器不要使用RABBITMQ_ERLANG_COOKIE这个环境变量来设置COOKIE
-
“~/RABBITMQ_CLU/rabbitmqp1/.erlang.cookie”
E502: “~/RABBITMQ_CLU/rabbitmqp1/.erlang.cookie” is a directory
Press ENTER or type command to continue- 这里可能是因为配置数据卷的时候目录中多加了一级导致这一级被生成为文件例如上文中的错误就会导致.erlang.cookie被生成为目录而不是文件
- 建议把初始生成容器的命令**-v ~/RABBITMQ_CLU/rabbitmqp1/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie **删除改为自行更改.erlang.cookie的值
- 如果在外部更改不成功还是建议在内部更改Erlang.Cookie
-
Error: unable to perform an operation on node ‘rabbit@hrabbitmqp1’. Please see diagnostics information and suggestions below.
- 这个可能是因为设置Erlang.cookie未对容器重新启动导致的
- 重启后进入每个节点验证每个节点的Erlang.Cookie是否相同
cat /var/lib/rabbitmq/.erlang.cookie
-
root@hostrabbitmqr1:/# rabbitmqctl join_cluster rabbit@172.19.0.2
Clustering node rabbit@hostrabbitmqr1 with rabbit@172.19.0.2
Error:
{:badarg, [{:rpc, :rpcify_exception, 2, [file: ‘rpc.erl’, line: 491]}, {:rpc, :call, 5, [file: ‘rpc.erl’, line: 434]}, {:lists, :foldl, 3, [file: ‘lists.erl’, line: 1267]}, {:rabbit_mnesia, :discover_cluster, 1, [file: ‘rabbit_mnesia.erl’, line: 792]}, {:rabbit_mnesia, :join_cluster, 2, [file: ‘rabbit_mnesia.erl’, line: 224]}]}
root@hostrabbitmqr1:/# rabbitmqctl start_app
Starting node rabbit@hostrabbitmqr1 …- 这个可能是
rabbitmqctl join_cluster rabbit@hrabbitmqp1
配置错误导致@后面的为网络名称可以通过进入节点后执行rabbitmqctl stop_app
和rabbitmqctl reset
来查看(执行命令后会有生成)-
root@hrabbitmqr1:/# rabbitmqctl stop_app Stopping rabbit application on node rabbit@hrabbitmqr1 ...可以看到这个网络名就显示出来了 root@hrabbitmqr1:/# rabbitmqctl reset Resetting node rabbit@hrabbitmqr1 ...
-
- 这个可能是
-
14:18:00.825 [warn] Feature flags: the previous instance of this node must have failed to write the
feature_flags
file at/var/lib/rabbitmq/mnesia/rabbit@hrabbitmqr1-feature_flags
:14:18:00.825 [warn] Feature flags: - list of previously disabled feature flags now marked as such: [:maintenance_mode_status]
14:18:01.151 [warn] Feature flags: the previous instance of this node must have failed to write the
feature_flags
file at/var/lib/rabbitmq/mnesia/rabbit@hrabbitmqr1-feature_flags
:14:18:01.151 [warn] Feature flags: - list of previously enabled feature flags now marked as such: [:maintenance_mode_status]
14:18:01.184 [error] Failed to create a tracked connection table for node :rabbit@hrabbitmqr1: {:node_not_running, :rabbit@hrabbitmqr1}
14:18:01.185 [error] Failed to create a per-vhost tracked connection table for node :rabbit@hrabbitmqr1: {:node_not_running, :rabbit@hrabbitmqr1}
14:18:01.185 [error] Failed to create a per-user tracked connection table for node :rabbit@hrabbitmqr1: {:node_not_running, :rabbit@hrabbitmqr1}
- 解决办法1.停止主节点—>再次让从节点尝试加入主节点—>启动主节点—>再次让节点尝试加入主节点
- 解决办法可能因为Erlang,Cookie没有读取权限执行chmod 400 /var/lib/rabbitmq/.erlang.cookie
来获取权限之后重启主从节点 -
已经在阿里云或者宝塔打开相应的端口但是本机无法访问那个端口
- 你选择的镜像不携带web管理界面的插件将
rabbitmq:latest
改为rabbitmq:management
- 下面都需要重新搞
- 你选择的镜像不携带web管理界面的插件将
-
实在不行就重新删除容器从头再来因为过程中修改可能会导致一些原本好的数据被修改相信你可以成功!!