联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:18888888888 QQ:88888

rabbitmq在docker的部署,rabbitmq集群的搭建

rabbitmq在docker的部署,rabbitmq集群的搭建

rabbitmq在docker的部署

1.拉去rabbitmq镜像

docker pull rabbitmq:4.0

2.创建存储目录,并设置权限

mkdir -p /docker/rabbitmq/data
sudo chmod -R 777 /docker/rabbitmq/data

3.运行镜像

docker run -d --name rabbitmq -p 5672:5672 \     
-p 15672:15672 -v /docker/rabbitmq/data:/var/lib/rabbitmq \ 
-e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 \ 
rabbitmq:4-management
#5672 amqp交互端口(客户端)  15672web管理端
#-v /docker/rabbitmq/data:/var/lib/rabbitmq  持久化存储数据
#-e 设置账号和密码

4.开放防火墙端口

#1.查看是否开启防火墙
systemctl status firewalld
#2.查看防火墙开放的端口
sudo firewall-cmd --list-ports
#3.开放端口
sudo firewall-cmd --add-port=5672/tcp --permanent
sudo firewall-cmd --add-port=15672/tcp --permanent
#4.重新加载
sudo firewall-cmd --reload
#5.查看端口是否开放
sudo firewall-cmd --list-ports
#浏览器访问:192.168.56.100:15672

rabbitmq集群的搭建

前提需要:配置epel仓库和rabbitmq的官方仓库

1.仓库的配置

epel仓库:见笔记
rabbitmq仓库:

# 1. 导入RabbitMQ签名密钥
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc

# 2. 添加RabbitMQ仓库
cat > /etc/yum.repos.d/rabbitmq.repo << EOF
[rabbitmq_erlang]
name=rabbitmq_erlang
baseurl=https://packagecloud.io/rabbitmq/erlang/el/8/\$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
       https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

[rabbitmq_erlang-source]
name=rabbitmq_erlang-source
baseurl=https://packagecloud.io/rabbitmq/erlang/el/8/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=0
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

[rabbitmq_server]
name=rabbitmq_server
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/8/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
       https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

[rabbitmq_server-source]
name=rabbitmq_server-source
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/8/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=0
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOF

# 3. 更新yum缓存
yum makecache

2.安装rabbitmq-server

前提:他需要elrang运行环境,但是yum安装会自动处理依赖关系

yum install -y rabbitmq-server

3.环境准备和配置

  1. 修改主机名,每台主机都要,为rabbit1,rabbit2,rabbit3

    # 以 rabbit1 为例
    sudo hostnamectl set-hostname rabbit1
    sudo hostnamectl set-hostname rabbit2
    sudo hostnamectl set-hostname rabbit3

  2. 修改 /etc/hosts 文件

    192.168.56.151  rabbit1
    192.168.56.152  rabbit2
    192.168.56.153  rabbit3

  3. 开启防火墙

    sudo firewall-cmd --permanent --add-port=4369/tcp    # EPMD端口
    sudo firewall-cmd --permanent --add-port=25672/tcp   # 集群通信端口
    sudo firewall-cmd --permanent --add-port=5672/tcp    # AMQP端口
    sudo firewall-cmd --permanent --add-port=15672/tcp   # 管理端口
    sudo firewall-cmd --permanent --add-port=35197/tcp   # Erlang分布式端口范围
    sudo firewall-cmd --permanent --add-port=55197/tcp   # Erlang分布式端口范围
    
    # 重新加载防火墙
    sudo firewall-cmd --reload

3.启动rabbitma,每台都启动

systemctl start rabbitmq-server
systemctl enable rabbitmq-server

# 查看是否启动
sudo systemctl status rabbitmq-server

4.启用管理插件并创建管理员账号

RabbitMQ 集群部署完成后,我们通常需要启用管理插件(Management Plugin)来访问可视化管理界面,并创建管理员账号

  1. 启用管理插件
    在每台 RabbitMQ 节点上执行

    sudo rabbitmq-plugins enable rabbitmq_management

  2. 创建管理员账号
    在每台节点上都可以执行(若已存在相同名称则会提示)

    sudo rabbitmqctl add_user admin 123456
    sudo rabbitmqctl set_user_tags admin administrator
    # 设置该用户在 "/" 虚拟主机下的权限,授予全部读写权限
    sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

5.集群通信Cookie同步

RabbitMQ 集群依赖 Erlang Cookie 来进行节点间的验证与通信。在同一个集群中的所有节点必须使用相同的 Cookie。该 Cookie 默认保存在 /var/lib/rabbitmq/.erlang.cookie 文件中

  1. 选择一台节点作为Cookie
    rabbit1为源

  2. 复制Cookie到其他节点
    rabbit1上查看Cookie

    sudo cat /var/lib/rabbitmq/.erlang.cookie
    # IDZEDJMYBHJEHYQWDXXD

    将内容复制,然后分别在rabbit2rabbit3上执行:
    sudo systemctl stop rabbitmq-server
    echo "IDZEDJMYBHJEHYQWDXXD" | sudo tee /var/lib/rabbitmq/.erlang.cookie
    sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
    sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
    sudo systemctl start rabbitmq-server

    确保三台节点的 Cookie 完全一致,并且权限和拥有者正确,才能保证后续正常组建集群

6.节点加入集群

下面以rabbit1作为主节点,先将rabbit2rabbit3加入到rabbit1的集群中

  1. rabbit2,rabbit3上执行

    sudo rabbitmqctl stop_app
    sudo rabbitmqctl join_cluster rabbit@rabbit1
    sudo rabbitmqctl start_app

  2. 查看集群状态
    可以在任意节点上运行以下命令查看集群状态:

    sudo rabbitmqctl cluster_status

    若一切顺利,会看到类似如下输出,其中 running_nodes 中包含 rabbit@rabbit1、rabbit@rabbit2、rabbit@rabbit3:
    [root@vbox ~]# sudo rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbit2 ...
    Basics
    
    Cluster name: rabbit@rabbit2
    Total CPU cores available cluster-wide: 2
    
    Disk Nodes
    
    rabbit@rabbit1
    rabbit@rabbit2
    rabbit@rabbit3
    
    Running Nodes
    
    rabbit@rabbit1
    rabbit@rabbit2
    rabbit@rabbit3
    
    Versions
    
    rabbit@rabbit2: RabbitMQ 3.13.7 on Erlang 26.2.5.4
    rabbit@rabbit1: RabbitMQ 3.13.7 on Erlang 26.2.5.4
    rabbit@rabbit3:   on Erlang 
    
    CPU Cores
    
    Node: rabbit@rabbit2, available CPU cores: 1
    Node: rabbit@rabbit1, available CPU cores: 1
    Node: rabbit@rabbit3, available CPU cores: 0
    
    Maintenance status
    
    Node: rabbit@rabbit2, status: not under maintenance
    Node: rabbit@rabbit1, status: not under maintenance
    Node: rabbit@rabbit3, status: unknown
    
    Alarms
    
    (none)
    
    Network Partitions
    
    (none)
    
    Listeners
    
    Node: rabbit@rabbit2, interface: [::], port: 15672, protocol: http, purpose: HTTP API
    Node: rabbit@rabbit2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
    Node: rabbit@rabbit2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
    Node: rabbit@rabbit1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
    Node: rabbit@rabbit1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
    Node: rabbit@rabbit1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
    
    Feature flags
    
    Flag: classic_mirrored_queue_version, state: enabled
    Flag: classic_queue_type_delivery_support, state: enabled
    Flag: detailed_queues_endpoint, state: enabled
    Flag: direct_exchange_routing_v2, state: enabled
    Flag: drop_unroutable_metric, state: enabled
    Flag: empty_basic_get_metric, state: enabled
    Flag: feature_flags_v2, state: enabled
    Flag: implicit_default_bindings, state: enabled
    Flag: khepri_db, state: disabled
    Flag: listener_records_in_ets, state: enabled
    Flag: maintenance_mode_status, state: enabled
    Flag: message_containers, state: enabled
    Flag: message_containers_deaths_v2, state: enabled
    Flag: quorum_queue, state: enabled
    Flag: quorum_queue_non_voters, state: enabled
    Flag: restart_streams, state: enabled
    Flag: stream_filtering, state: enabled
    Flag: stream_queue, state: enabled
    Flag: stream_sac_coordinator_unblock_group, state: enabled
    Flag: stream_single_active_consumer, state: enabled
    Flag: stream_update_config_command, state: enabled
    Flag: tracking_records_in_ets, state: enabled
    Flag: user_limits, state: enabled
    Flag: virtual_host_metadata, state: enabled

7.设置镜像队列(HA)策略

为保证队列数据在集群节点之间进行复制,我们需要设置 镜像队列策略。这里示例设置所有队列自动镜像到所有节点上,并自动同步

sudo rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}' --priority 0 --apply-to queues
  • ha-mode: all 表示所有队列将镜像到集群中的所有节点。

  • ha-sync-mode: automatic 表示当新的节点加入时,会自动同步队列数据。

  • ^.* 是正则表达式,表示对名称匹配任意队列生效;如需针对特定队列或前缀,可自行修改。

  • --apply-to queues 表示将策略应用到队列。

8.验证集群

  1. 使用rabbitmqctl cluster_status命令查看集群健康状态

    sudo rabbitmqctl cluster_status

    确认三个节点都在running_nodes列表里。

  2. 访问管理界面进行验证
    在浏览器中分别访问三台机器的 http://<节点IP或主机名>:15672,使用前面创建的账号(如 admin)进行登录,查看集群信息、节点信息、队列信息等。

  3. 测试队列高可用

  • 连接到其中一个节点,创建一个队列并发送消息。

  • 关闭该节点的 RabbitMQ 服务或者网络,使用另一个节点进行消费,验证消息是否正常可消费、数据是否依旧存在。
    若一切无误,则说明 RabbitMQ 集群部署成功并具备了高可用能

9.上述集群即可成功搭建,解决安装过程中遇到的问题

rabbitmq.conf 位于 /etc/rabbitmq/rabbitmq.conf,这是 RabbitMQ 的主配置文件,采用 INI 格式,用来定义更高级别的功能,如集群、插件、TLS、虚拟主机等。

advanced.config 位于 /etc/rabbitmq/advanced.config,这是 RabbitMQ 的高级配置文件,采用 Erlang 的 term 语法,主要用于复杂的配置需求,例如队列策略、插件配置等。

默认配置文件可能不存在,可以手动创建:

  1. 创建配置文件

    sudo nano /etc/rabbitmq/rabbitmq.conf
    

  2. 添加基础配置(可自行追加)

    ## Basic configuration
    listeners.tcp.default = 5672
    management.listener.port = 15672
    management.listener.ip = 0.0.0.0

  3. 保存文件并重启服务

    sudo systemctl restart rabbitmq-server

 

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册