赞
踩
在服务器上使用一个rabbitmq服务,但是需要多个项目使用这一个mq服务,于是就建立了rabbitmq的虚拟主机virtual host来作为各个服务的迷你版mq来使用;
再使用docker compose命令重启后,某个项目报错如下:
com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(reply-code=530, reply-text=NOT_ALLOWED - vhost my-test1 not found, class-id=10, method-id=4
其中my-test1
就是我建立的多个vhosts(virtual hosts)其中的一个
背景:本地安装的docker,然后使用docker-compose.yml文件方式安装的rabbitmq服务 ;
问题:在使用docker compose up -d命令重启rabbitmq后发现;
网上找帖子和查阅机器人一直提示没有做数据持久化存储,仔细检查yml配置文件后发现,已对数据做了持久化处理;
volumes:
- /data/docker/rabbit/data:/var/lib/rabbitmq
- /data/docker/rabbit/config:/rabbit-config
- /data/docker/rabbit/cert:/var/lib/cert
原因: 在linux中,RabbitMQ运行中的数据保存在我们一般是默认保存在/var/lib/rabbitmq/mnesia/
中,数据目录是通过主机名自动生成,(在此背景下)我们是通过docker命令操作yml文件来部署安装的,所以RabbitMQ数据目录跟名字跟容器的id相同;
但是我们每次使用docker compose up -d 重启后docker容器的id都会重新生成新的,就会找不到原有的数据;如下图:
解析:
rabbit@54bc8ceb7ac1
文件夹中(看文件生成时间);rabbit@0098c3b23dbb
文件;rabbit@54bc8ceb7ac1
的数据容器是找不到的;所以我们要告诉容器我们要一直把这些数据持久化在某个文件夹下,这样重启后便不会再生成新的文件夹;
解决方法
hostname: myrabbitmq
(注:hostname和container_name无关联)RabbitMQ 在启动时会依据 hostname 等标识来决定加载哪些配置文件或状态。如果 hostname 不明确,RabbitMQ 可能无法正确匹配到之前的配置状态,从而丢失了之前设置的 vhosts 配置。没有明确的 hostname,可能会影响其正确指向持久化存储的数据。明确 hostname 后,它能更准确地定位到对应的配置或数据存储,确保配置的连续性。
例图:
此时我们就可以在data文件夹下看到hostname对应的文件夹已经生成
(这里我把名字换了,大家理解即可)
然后我们再去rabbitmq的管理端界面去新建我们的用户和vhosts;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。