RabbitMQ-高可用 Highly Available (Mirrored) Queues

本文介绍RabbitMQ中队列镜像的基本概念及其配置方法。默认情况下,RabbitMQ集群内的队列内容位于单个节点上,但可通过配置镜像队列实现跨节点复制,提高可用性。镜像队列由一个主节点和多个镜像节点组成,当主节点故障时,最老的镜像节点将被提升为主节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Highly Available (Mirrored) Queues

What is Queue Mirroring

By default, contents of a queue within a RabbitMQ cluster are located on a single node (the node on which the queue was declared). This is in contrast to exchanges and bindings, which can always be considered to be on all nodes. Queues can optionally be made mirrored across multiple nodes. Each mirrored queue consists of one master and one or more mirrors, with the oldest mirror being promoted to the new master if the old master disappears for any reason.

默认情况下,RabbitMQ集群中的队列的内容位于单个节点(宣布队列的节点)上。这与交换和绑定形成了鲜明的对比,而交换和绑定总是可以被认为是在所有节点上。队列可以选择性地跨多个节点进行镜像。每个镜像队列由一个主和一个或多个镜像组成,如果老的主因任何原因消失,则将最旧的镜像提升为新主人。

镜像到底是什么

There are multiple terms commonly used to identify primary and secondary replicas in a distributed system. This guide typically uses "master" to refer to the primary replica of a queue and "mirror" for secondary replicas. However, you will find "slave" used here and there. This is because RabbitMQ CLI tools historically have been using the term "slave" to refer to secondaries. Therefore both terms are currently used interchangeably but we'd like to eventually get rid of the legacy terminology.

在分布式系统中,通常使用多个术语来标识主要副本和辅助副本。本指南通常使用“主”来指代队列的主要副本,而对于辅助副本则使用“镜像”。然而,你会发现“奴隶”在这里和那里使用。这是因为RabbitMQ CLI工具历史上一直使用术语“奴隶”来指代辅助。因此,这两个术语目前可以互换使用,但我们希望最终摆脱传统术语。

How Mirroring is Configured

Mirroring parameters are configured using policies. A policy matches one or more queues by name (using a regular expression pattern) and contains a definition (a map of optional arguments) that are added to the total set of properties of the matching queues. Please see Runtime Parameters and Policies for more information on policies.

镜像参数是使用策略配置的。策略通过名称(使用正则表达式模式)匹配一个或多个队列,并包含添加到匹配队列的全部属性集中的定义(可选参数的映射)。有关策略 的更多信息,请参阅运行时参数和策略

  1. 可以通过WEB-UI的方式来配置镜像队列例子

步骤详解:

  • Name: policy的名称 名称随意起

  • Pattern: queue的匹配模式(正则表达式) 这里填 ^ 代表匹配所有

  • Definition:

    • 第一行点击下方的ha-mode 在后面填入all(镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。)

    • 第二行点击ha-sync-mode 在后面填入automatic

    最后点击Add proclicy

配置详解

HA-MODEHA-PARAMS功能
all镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。 该设置非常保守,建议改为使用集群节点的quorum(n/2+1)。对所有节点进行镜像会对所有集群节点造成额外的压力,包括网络输入/输出、磁盘输入输出和磁盘空间使用。主要是集群节点之间的同步。
exactlycount镜像队列将会在集群上复制count份。如果集群数量少于count时候,队列会复制到所有节点上。如果大于Count集群,有一个节点crash后,新进入节点也不会做新的镜像。
nodesnode name镜像队列会在node name中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个node list中没有一个节点在线,那么这个queue会被声明在client连接的节点。
  1. 也可以通过命令的方式配置镜像队列

      
      rabbitmqctl set_policy -p 'ecas' --priority 9 --apply-to all ecas-ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
      
      给vhost为ecas 的所有的队列配置镜像队列

其他配置请参考Queue Arguments that Control Mirroring

错误:软件包:rabbitmq-server-3.13.7-1.el8.noarch (rabbitmq_server) 需要:erlang >= 26.0 已安装: erlang-23.3.4.11-1.el7.x86_64 (@rabbitmq-erlang) erlang = 23.3.4.11-1.el7 可用: erlang-R16B-03.18.el7.x86_64 (epel) erlang = R16B-03.18.el7 可用: erlang-20.3.8.25-1.el7.x86_64 (rabbitmq-erlang) erlang = 20.3.8.25-1.el7 可用: erlang-20.3.8.26-1.el7.x86_64 (rabbitmq-erlang) erlang = 20.3.8.26-1.el7 可用: erlang-21.3.8.14-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.14-1.el7 可用: erlang-21.3.8.15-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.15-1.el7 可用: erlang-21.3.8.16-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.16-1.el7 可用: erlang-21.3.8.18-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.18-1.el7 可用: erlang-21.3.8.21-1.el7.x86_64 (rabbitmq-erlang) erlang = 21.3.8.21-1.el7 可用: erlang-22.2.7-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.2.7-1.el7 可用: erlang-22.2.8-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.2.8-1.el7 可用: erlang-22.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3-1.el7 可用: erlang-22.3.1-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.1-1.el7 可用: erlang-22.3.2-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.2-1.el7 可用: erlang-22.3.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.3-1.el7 可用: erlang-22.3.4-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4-1.el7 可用: erlang-22.3.4.7-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.7-1.el7 可用: erlang-22.3.4.10-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.10-1.el7 可用: erlang-22.3.4.11-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.11-1.el7 可用: erlang-22.3.4.12-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.12-1.el7 可用: erlang-22.3.4.16-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.16-1.el7 可用: erlang-22.3.4.19-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.19-1.el7 可用: erlang-22.3.4.21-1.el7.x86_64 (rabbitmq-erlang) erlang = 22.3.4.21-1.el7 可用: erlang-23.1.2-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.1.2-1.el7 可用: erlang-23.1.5-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.1.5-1.el7 可用: erlang-23.2.1-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.1-1.el7 可用: erlang-23.2.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.3-1.el7 可用: erlang-23.2.4-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.4-1.el7 可用: erlang-23.2.5-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.5-1.el7 可用: erlang-23.2.6-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.6-1.el7 可用: erlang-23.2.7-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.7-1.el7 可用: erlang-23.2.7-2.el7.x86_64 (rabbitmq-erlang) erlang = 23.2.7-2.el7 可用: erlang-23.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3-1.el7 可用: erlang-23.3-2.el7.x86_64 (rabbitmq-erlang) erlang = 23.3-2.el7 可用: erlang-23.3.1-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.1-1.el7 可用: erlang-23.3.2-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.2-1.el7 可用: erlang-23.3.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.3-1.el7 可用: erlang-23.3.4-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4-1.el7 可用: erlang-23.3.4.1-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.1-1.el7 可用: erlang-23.3.4.3-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.3-1.el7 可用: erlang-23.3.4.4-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.4-1.el7 可用: erlang-23.3.4.5-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.5-1.el7 可用: erlang-23.3.4.6-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.6-1.el7 可用: erlang-23.3.4.7-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.7-1.el7 可用: erlang-23.3.4.8-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.8-1.el7 可用: erlang-23.3.4.10-1.el7.x86_64 (rabbitmq-erlang) erlang = 23.3.4.10-1.el7 您可以尝试添加 --skip-broken 选项来解决该问题 您可以尝试执行:rpm -Va --nofiles --nodigest
最新发布
07-13
<think>我们正在解决RabbitMQ安装时遇到的Erlang版本依赖问题。根据引用[1][2][3]的信息,RabbitMQ需要特定版本的Erlang支持,而当前系统安装的Erlang版本(R16B-03.18.el7)过低(需要>=26.0)。以下提供两种解决方案:升级Erlang版本或使用Docker安装RabbitMQ。 ### 解决方案一:升级Erlang并安装RabbitMQ(推荐) #### 步骤1:卸载旧版Erlang ```bash sudo yum remove erlang* -y sudo yum autoremove -y ``` #### 步骤2:添加Erlang 26+仓库 由于系统是CentOS/RHEL 7,需添加RabbitMQ官方提供的Erlang仓库: ```bash # 导入仓库密钥 sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc # 创建仓库文件 cat <<EOF | sudo tee /etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/\$basearch repo_gpgcheck=1 gpgcheck=1 enabled=1 gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOF ``` #### 步骤3:安装Erlang 26+ ```bash sudo yum clean all sudo yum makecache sudo yum install erlang-26.0 -y ``` #### 步骤4:验证Erlang版本 ```bash erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell ``` 输出应为`26.x`或更高版本。 #### 步骤5:安装RabbitMQ 3.13.7 ```bash # 添加RabbitMQ仓库 cat <<EOF | sudo tee /etc/yum.repos.d/rabbitmq.repo [rabbitmq-server] name=rabbitmq-server baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/\$basearch repo_gpgcheck=1 gpgcheck=1 enabled=1 gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOF # 安装RabbitMQ sudo yum install rabbitmq-server-3.13.7 -y ``` #### 步骤6:启动服务 ```bash sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server sudo rabbitmq-plugins enable rabbitmq_management ``` ### 解决方案二:使用Docker安装(快速规避依赖问题) 引用[4]提到,当系统版本(如CentOS 7)无法满足依赖时,可使用Docker安装: ```bash # 拉取RabbitMQ镜像(含管理插件) docker pull rabbitmq:3.13.7-management # 运行容器 docker run -d \ --name rabbitmq \ -p 5672:5672 \ -p 15672:15672 \ rabbitmq:3.13.7-management ``` 访问管理界面:`http://服务器IP:15672`(默认账号/密码:`guest`/`guest`)。 ### 注意事项 1. **版本兼容性**:RabbitMQ与Erlang版本必须严格匹配,具体对应关系参考[官方文档](https://www.rabbitmq.com/which-erlang.html)[^1]。 2. **强制安装风险**:引用[3]显示强制安装(`--nodeps`)会导致RabbitMQ无法运行,不推荐。 3. **环境清理**:若曾尝试错误安装,建议彻底卸载旧版: ```bash sudo yum remove rabbitmq-server -y sudo rm -rf /var/lib/rabbitmq/ ``` > **提示**:RabbitMQ 3.13.x需要Erlang 26+以支持新特性(如流式队列)[^1]。 §§相关问题§§ 1. 如何在ARM架构服务器上安装RabbitMQ? 2. 如何验证Erlang和RabbitMQ的版本兼容性? 3. 使用Docker部署RabbitMQ有哪些最佳实践? 4. 如何安全地升级生产环境的RabbitMQ版本? 5. RabbitMQ安装后如何进行基本安全配置?</think>### 解决 RabbitMQ 安装错误:需要 Erlang >= 26.0 根据您提供的错误信息和引用内容[^1][^3],RabbitMQ 3.13.7 需要 Erlang 26.0 或更高版本,而您的系统安装的是旧版 Erlang (R16B)。以下是完整解决方案: #### 方案一:安装匹配的 Erlang 版本(推荐) 1. **卸载旧版 Erlang** ```bash sudo yum remove erlang* -y sudo yum autoremove -y ``` 2. **添加 Erlang 26+ 仓库** ```bash # 导入仓库密钥 sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc # 添加仓库配置(CentOS/RHEL 7) cat <<EOF | sudo tee /etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/\$basearch repo_gpgcheck=1 gpgcheck=1 enabled=1 gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOF ``` 3. **安装 Erlang 26+** ```bash sudo yum clean all sudo yum makecache sudo yum install erlang-26.0 -y ``` 4. **验证安装** ```bash erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell ``` 应输出 `26.x` 或更高版本 5. **安装 RabbitMQ** ```bash # 添加 RabbitMQ 仓库 cat <<EOF | sudo tee /etc/yum.repos.d/rabbitmq.repo [rabbitmq-server] name=rabbitmq-server baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/\$basearch repo_gpgcheck=1 gpgcheck=1 enabled=1 gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOF sudo yum install rabbitmq-server-3.13.7 -y ``` #### 方案二:使用 Docker 安装(快速绕过依赖问题) 引用[^4]建议使用 Docker 作为替代方案: ```bash # 拉取带管理插件的镜像 docker pull rabbitmq:3.13.7-management # 运行容器 docker run -d \ --name rabbitmq \ -p 5672:5672 \ -p 15672:15672 \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=secret \ rabbitmq:3.13.7-management ``` 访问管理界面:`http://服务器IP:15672`(使用 admin/secret 登录) #### 方案三:手动安装 Erlang RPM 如果仓库安装失败,可手动下载安装: 1. 从 [Erlang Solutions](https://www.erlang-solutions.com/downloads/) 下载 Erlang 26+ RPM 2. 安装: ```bash wget https://packages.erlang-solutions.com/erlang/rpm/centos/7/x86_64/esl-erlang_26.0.2-1~centos~7_amd64.rpm sudo yum install esl-erlang_26.0.2-1~centos~7_amd64.rpm -y ``` ### 关键注意事项 1. **版本兼容性**:RabbitMQ 和 Erlang 必须版本匹配,参考[官方兼容表](https://www.rabbitmq.com/which-erlang.html)[^1] 2. **避免强制安装**:引用[^3]显示 `--nodeps` 安装会导致 RabbitMQ 无法正常运行 3. **环境清理**:安装前彻底移除旧版本 ```bash sudo yum remove rabbitmq-server -y sudo rm -rf /var/lib/rabbitmq/ ``` > **提示**:RabbitMQ 3.13.x 需要 Erlang 26+ 以支持新特性如流式队列和增强的 Quorum 队列[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值