RabbitMq集群迁移

1. 集群知识要点

  • 普通的非镜像队列在rabbit集群下各个节点只保存元信息。客户端可以任意连接该集群的某个节点,RabbitMq会透明的将所有操作传递(转发)到声明该队列的主节点。当这个主节点不可用时,如果这个queue是durable的,那么所有的操作对这个queue的操作都会失败。如果不是durable那么这个queue会被删除。exchange不会被删除,因为exchange没有主节点的概念。
  • RabbitMq客户端应该都会实现自动重连功能,当一个节点不可用时会主动连接其他节点。所以一般来说客户端可以配置多个节点的地址。
  • 在组建rabbitMq集群的时候,仅仅只有2个节点是非常不推荐的。因为类似“仲裁队列”,“MQTT”等都要求能在集群中仲裁主节点。如果只有2个节点的话,是无法仲裁主节点的。所以最好节点数量是一个奇数。
  • RabbitMq之间要相互通讯必须有一个鉴权的过程,不然数据安全性就没有保障。Erlang Cookie就是一串密钥字符串,在一个集群中每个节点必须持有相同的cookie(密钥)才能相互通讯。
  • RabbitMq节点重启时,会自动同步集群中数据节点中的元数据。

2. 如何搭建一个新集群

  1. 将下面两个文件放到一个文件夹

Dockerfile

1
2
3
4
5
FROM rabbitmq:management

RUN rabbitmq-plugins enable rabbitmq_stomp
RUN rabbitmq-plugins enable rabbitmq_web_stomp
RUN rabbitmq-plugins enable --offline rabbitmq_management

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
rabbitmq:
build: .
container_name: rabbitmq
restart: always
# hostname的ip映射
extra_hosts:
- "jte203:192.168.10.203"
- "jte204:192.168.10.204"
environment:
RABBITMQ_ERLANG_COOKIE: 123456
# 本机节点名称
RABBITMQ_NODENAME: rabbit@jte203
volumes:
- $PWD/rabbitmq:/var/lib/rabbitmq
network_mode: "host"
  1. 执行修改对应的extra_hostsRABBITMQ_NODENAME配置
  2. 构建docker镜像docker-compose build
  3. 在机器jte203上启动rabbitmq,docker-compose up -d
  4. 访问http://192.168.10.203:15672/控制台确认rabbitmq启动成功
  5. 到机器jte204上重复执行步骤1-3
  6. 在jte204上docker-compose up -d启动rabbitmq,再进入docker内部docker-compose exec rabbitmq bash
  7. rabbitmqctl stop_app停止节点
  8. rabbitmqctl join_cluster rabbit@jte203将jte204的机器加入jte203的mq
  9. rabbitmqctl start_app启动mq,此时再进入http://192.168.10.203:15672/可以看到两台mq已经集群成功。rabbitmqctl cluster_status也可以看到是否集群成功!

3. 从集群中剔除老的节点

  1. rabbitmqctl stop_app停止节点
  2. rabbitmqctl reset重置节点
  3. rabbitmqctl start_app重启节点

4. 集群扩容节点

随时可以扩容,配置好了之后执行rabbitmqctl join_cluster nodename即可。