1. 集群知识要点
- 普通的非镜像队列在rabbit集群下各个节点只保存元信息。客户端可以任意连接该集群的某个节点,RabbitMq会透明的将所有操作传递(转发)到声明该队列的主节点。当这个主节点不可用时,如果这个queue是durable的,那么所有的操作对这个queue的操作都会失败。如果不是durable那么这个queue会被删除。exchange不会被删除,因为exchange没有主节点的概念。
- RabbitMq客户端应该都会实现自动重连功能,当一个节点不可用时会主动连接其他节点。所以一般来说客户端可以配置多个节点的地址。
- 在组建rabbitMq集群的时候,仅仅只有2个节点是非常不推荐的。因为类似“仲裁队列”,“MQTT”等都要求能在集群中仲裁主节点。如果只有2个节点的话,是无法仲裁主节点的。所以最好节点数量是一个奇数。
- RabbitMq之间要相互通讯必须有一个鉴权的过程,不然数据安全性就没有保障。Erlang Cookie就是一串密钥字符串,在一个集群中每个节点必须持有相同的cookie(密钥)才能相互通讯。
- RabbitMq节点重启时,会自动同步集群中数据节点中的元数据。
2. 如何搭建一个新集群
- 将下面两个文件放到一个文件夹
Dockerfile
1 | FROM rabbitmq:management |
docker-compose.yml
1 | version: '3' |
- 执行修改对应的
extra_hosts
和RABBITMQ_NODENAME
配置 - 构建docker镜像
docker-compose build
- 在机器jte203上启动rabbitmq,
docker-compose up -d
- 访问
http://192.168.10.203:15672/
控制台确认rabbitmq启动成功 - 到机器jte204上重复执行步骤1-3
- 在jte204上
docker-compose up -d
启动rabbitmq,再进入docker内部docker-compose exec rabbitmq bash
rabbitmqctl stop_app
停止节点rabbitmqctl join_cluster rabbit@jte203
将jte204的机器加入jte203的mqrabbitmqctl start_app
启动mq,此时再进入http://192.168.10.203:15672/
可以看到两台mq已经集群成功。rabbitmqctl cluster_status
也可以看到是否集群成功!
3. 从集群中剔除老的节点
rabbitmqctl stop_app
停止节点rabbitmqctl reset
重置节点rabbitmqctl start_app
重启节点
4. 集群扩容节点
随时可以扩容,配置好了之后执行rabbitmqctl join_cluster nodename
即可。