跳到主要内容

镜像模式

100% 数据可靠性解决方案,一般采用 3 个节点,节点与节点之间通过镜像队列达到数据交互,从而实现高可用,互联网行业常用

复制ErLange的Cookie:

RabbitMQ集群需要在每个从节点上使用与主节点一样的ErLang Cookie,因此需要使用远程操作命令,将主节点的Cookies复制给从节点(从节点服务器有配置root用户需要输入对应密码)

scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie

组成集群服务:

在集群所有主机(node1/2/3)执行组成集群命令

rabbitmq-server -detached

从节点加入集群:

节点加入到集群中选择的节点其对应的MQ服务必须为开启状态

1、停止MQ服务

rabbitmqctl stop_app

1、重置MQ

rabbitmqctl reset

3、加入主节点

rabbitmqctl join_cluster rabbit@node1

4、重启服务

rabbitmqctl start_app(只启动应用服务)

查看集群状态:

rabbitmqctl cluster_status

搭建镜像队列:

创建镜像配置:

Name:  policy的名称

Pattern: queue的匹配模式(正则表达式)

Definition: 镜像定义,包括三个部分 ha-mode,ha-params,ha-sync-mode

ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes

all表示在集群所有的节点上进行镜像

exactly表示在指定个数的节点上进行镜像,节点的个数由ha-params指定,个数包含主机

nodes表示在指定的节点上进行镜像,节点名称通过ha-params指定

ha-params: ha-mode模式需要用到的参数

ha-sync-mode: 镜像队列中消息的同步方式,有效值为 automatic、manually

Priority: 可选参数, policy的优先级



#设置镜像队列
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>

#清除镜像队列
rabbitmqctl clear_policy [-p <vhost>] <name>

#查看镜像队列
rabbitmqctl list_policies [-p <vhost>]


例子: 对所有虚拟主机设置名为 backup-one 的所有节点备份规则
rabbitmqctl set_policy backup-one "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

创建镜像队列:

创建一个名为 backup-node1 的队列,刷新后可以看到控制页上多出 **+1 提示,意为当前已有一个备份,**点击查看详情可看到备份队列具体存在的节点

主备模式

​ 主节点提供读写,从节点不提供读写服务,只是负责提供备份服务,备份节点的主要功能是在主节点宕机时,从节点将升级到主节点,适合并发和数据量不高的情况 通过 HaProxy 对MQ从节点和主节点进行监听,如果MQ主节点宕机则直接切换到从节点,两节点之间可通过联邦交换机、Slove等方式实现数据同步

联邦插件

FederationExchange 联邦交换机

rabbitmq-plugins enable rabbitmq_federation rabbitmq-plugins enable rabbitmq_federation_management

FederationQueue 联邦队列

上游队列的数据同步到下游队列,被称为联邦队列,构建联邦队列需要上下游的队列名称相同,消费消息遵循就近原原则

集群恢复和故障转移方案

介绍常见的集群故障恢复方案

镜像队列停机问题:

主机名为A、B 两个RabbitMQ服务做镜像队列可能会出现的情况,其中A为从节点,B为主节点

场景一:A、B先后停机

先启动主节点服务B再启动从节点服务A即可,如果先启动从节点A则30秒之后再启动主节点服务B

场景二:A、B同时停机

30秒内连续启动AB两个节点服务

场景三:A先停,B后停,且A无法再次启动

启动B节点后移除A节点(rabbitmqctl forget_cluster_node rabbit@主机名称)然后将新从节点加入集群

场景四:A先停,B后停,且B无法再次启动

在 3.4.2的RabbtiMQ之前没有解决方案,只能重新搭建集群环境

3.4.2版本之后的版本支持在停止状态下移除节点,因此只需要在从节点A上移除主节点B即可

rabbitmqctl forget_cluster_node --offline B

场景五:A先停,B后停,且A、B无法恢复,但是可以导出磁盘文件

​ 该情况只能通过恢复数据的方式尝试恢复,RabbitMQ数据库文件默认在 $RABBIT_HOME/var/lib 目录中

先创建出两个新的MQ服务C、D,然后Hostname名改为之前的A、B服务的HostName,将拷贝的数据库文件

复制到新MQ机器上

如果只有A节点的数据库文件,复制完数据库文件后启动服务,然后按照场景四的处理方案执行

如果只有B节点的数据库文件,复制完数据库文件后启动服务,然后按照场景三的处理方案执行

场景六:A先停,B后停,且A、B无法恢复,且没有磁盘文件

这种情况无法恢复,只能remake