在阿里云服务器上利用Docker创建RabbitMq主从集群

在阿里云上利用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

  1. 创建主节点
    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
    
  2. 创建从节点
    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

  1. 进入主节点
    docker exec -it rabbitmqp1 bash
    
  2. 随机生成一段Cookie这个生成的下面也用的到
    openssl rand -base64 48
    
  3. 把这段Cookie写入**/var/lib/rabbitmq/.erlang.cookie**
    echo '这里替换上面生成的或者你自己随便想一个但是主从Cookie要相同' > /var/lib/rabbitmq/.erlang.cookie
    chmod 400 /var/lib/rabbitmq/.erlang.cookie #这个一定要加
    
  4. 检查是否写入成功
    cat /var/lib/rabbitmq/.erlang.cookie
    
  5. 次节点重复上面的操作流程第一个命令变为docker exec -it rabbitmqr1 bash
  6. 最后对两个节点进行重启来加载这个COOKIE
    docker restart rabbitmqp1
    docker restart rabbitmqr1
    

配置此节点和主节点连接

  1. 打开次节点
    docker exec -it rabbitmqr1 bash
    
  2. 关闭服务
    rabbitmqctl stop_app
    
  3. 刷新服务
    rabbitmqctl reset
    
  4. 连接主服务
    rabbitmqctl join_cluster rabbit@hrabbitmqp1
    
  5. 打开服务
    rabbitmqctl start_app
    
  6. 打开主节点查看集群是否连接成功
    docker restart rabbitmqp1
    rabbitmqctl cluster_status
    
  7. 成功示例
    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
    

本地连接

阿里云配置

  1. 配置15672,5672,15671,5671端口可以被其他人访问根据你的实际情况
    在这里插入图片描述

宝塔配置

  1. 配置15672,5672,15671,5671端口可以被其他人访问根据你的实际情况
  2. 在这里插入图片描述

错误处理

  1. 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
  2. “~/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
  3. 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
      
  4. 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_apprabbitmqctl reset来查看(执行命令后会有生成)
      •   root@hrabbitmqr1:/# rabbitmqctl stop_app
          Stopping rabbit application on node rabbit@hrabbitmqr1 ...可以看到这个网络名就显示出来了
          root@hrabbitmqr1:/# rabbitmqctl reset
          Resetting node rabbit@hrabbitmqr1 ...
        
  5. 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来获取权限之后重启主从节点

  6. 已经在阿里云或者宝塔打开相应的端口但是本机无法访问那个端口

    • 你选择的镜像不携带web管理界面的插件rabbitmq:latest改为rabbitmq:management
    • 下面都需要重新搞
  7. 实在不行就重新删除容器从头再来因为过程中修改可能会导致一些原本好的数据被修改相信你可以成功!!

1. 首先,在阿里云服务器上安装 DockerDocker Compose。 2. 创建一个新的目录,用于存放 Docker Compose 文件和相关配置文件。 3. 编写 Docker Compose 文件,定义需要运行的服务、容器和相关配置。例如: ``` version: '3' services: nginx: image: nginx ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf restart: always mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: example volumes: - ./data:/var/lib/mysql restart: always ``` 这个例子中,我们定义了两个服务:nginx 和 mysql。nginx 服务使用官方的 nginx 镜像,将本地的 nginx.conf 文件映射到容器内的 /etc/nginx/nginx.conf 文件,同时将容器的 80 端口映射到主机的 80 端口。mysql 服务使用官方的 mysql 镜像,设置了 root 用户的密码,将容器内的 /var/lib/mysql 目录映射到主机上的 ./data 目录。 4. 在终端中进入到 Docker Compose 文件所在的目录,执行以下命令部署服务: ``` docker-compose up -d ``` 这个命令会根据 Docker Compose 文件中定义的服务和容器启动相应的 Docker 容器,其中 -d 参数表示以后台方式运行。 5. 在浏览器中访问服务器的 IP 地址或域名,验证部署是否成功。例如,如果 nginx 服务运行正常,可以通过 http://yourserverip/ 访问到 nginx 的欢迎页面。 6. 如果需要更新 Docker Compose 文件,可以先按照以下命令停止服务: ``` docker-compose down ``` 然后修改 Docker Compose 文件,再次执行 docker-compose up -d 即可重新部署服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值