说明
- RabbitMQ-Java-09-集群搭建
- 官方文档已包含绝大多数本案例内容。请移步:https://docs.spring.io/spring-amqp/docs/current/reference/html/
核心概念
》集群搭建说明
- 集群搭建是为了解决什么问题呢?
- 注意点有哪些呢?
- 每个node(机器)需要设置正确的host(hostname、hosts),保证通过host能互相连通。
- 所有加入集群的node地位相等,新加入node只需要连接任意一个node都能加入到集群,任意一个node丢失都不会影响整个node。
- 所有加入集群的node必须保证erlang.cookie与其他相同
- 搭建集群后为什么要配置镜像队列?
- 默认搭建好集群,来一个消息会被随机分配到其中一台节点,一旦该节点宕机而该消息未被消费就会丢失,为了解决这个问题就需要配置镜像队列。
- 镜像队列一般是备份两份(主node、备node各一份),你也可以设置备份多份(最多不能超过所有node数量),但是这样是大大的浪费,没必要。
- 配置备份两份以后,当其中一个node宕机,会自动备份到其他node,保证数据永远有两份,即使剩下最后一台节点也不会数据丢失,除非所有节点全部宕机。
- 配置镜像队列必须配置好集群,单台node是没有镜像队列选项值的。
- 配置完镜像队列就基本上可以保证消息不丢失了。
操作步骤
》准备环境
- 准备三台服务器(虚拟机),先准备一台配置好RabbitMQ,如果是本地虚拟机的话其他两台用这一台创建链接克隆,如此一来就不用分别配置了。
》开始搭建集群
- 分别修改三台服务器主机名
# 第一个节点
[root@host0202 admin]# vi /etc/hostname
host0202
# 第二个节点
[root@host0203 admin]# vi /etc/hostname
host0203
# 第三个节点
[root@host0204 admin]# vi /etc/hostname
host0204
- 分别修改三台服务器hosts文件
# 第一个节点
[root@host0202 admin]# vi /etc/hosts
192.168.0.202 host0202
192.168.0.203 host0203
192.168.0.204 host0204
# 第二个节点
[root@host0203 admin]# vi /etc/hosts
192.168.0.202 host0202
192.168.0.203 host0203
192.168.0.204 host0204
# 第三个节点
[root@host0204 admin]# vi /etc/hosts
192.168.0.202 host0202
192.168.0.203 host0203
192.168.0.204 host0204
- 统一三台服务器的erlang.cookie,在第一台(host0202)执行以下操作(如果你是跟我一样直接克隆的虚拟机那么这一步可以省略)
[root@host0202 admin]# cd /var/lib/rabbitmq/
[root@host0202 rabbitmq]# ls -al
total 8
drwxr-xr-x. 3 rabbitmq rabbitmq 42 Dec 28 18:29 .
drwxr-xr-x. 27 root root 4096 Dec 28 18:23 ..
-r--------. 1 rabbitmq rabbitmq 20 Dec 28 00:00 .erlang.cookie
drwxr-x---. 4 rabbitmq rabbitmq 104 Dec 28 21:39 mnesia
[root@host0202 rabbitmq]# scp .erlang.cookie root@host0203:/var/lib/rabbitmq/
[root@host0202 rabbitmq]# scp .erlang.cookie root@host0204:/var/lib/rabbitmq/
- 分别在三台服务器中重启RabbitMQ、Erlang虚拟机
# 第一个节点
[root@host0202 rabbitmq]# rabbitmq-server -detached
# 第二个节点
[root@host0203 rabbitmq]# rabbitmq-server -detached
# 第三个节点
[root@host0204 rabbitmq]# rabbitmq-server -detached
- 将第二个节点加入第一个节点
[root@host0203 rabbitmq]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@host0203 ...
[root@host0203 rabbitmq]# rabbitmqctl reset
Resetting node rabbit@host0203 ...
[root@host0203 rabbitmq]# rabbitmqctl join_cluster rabbit@host0202
Clustering node rabbit@host0203 with rabbit@host0202
[root@host0203 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@host0203 ...
- rabbitmqctl stop_app:关闭RabbitMQ不关闭Erlang虚拟机
- rabbitmqctl stop:关闭RabbitMQ和Erlang虚拟机
- 将第三个节点加入第二个节点
[root@host0204 rabbitmq]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@host0204 ...
[root@host0204 rabbitmq]# rabbitmqctl reset
Resetting node rabbit@host0204 ...
[root@host0204 rabbitmq]# rabbitmqctl join_cluster rabbit@host0203
Clustering node rabbit@host0204 with rabbit@host0203
[root@host0204 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@host0204 ...
- 查看集群状态(任意一个节点都行)
[root@host0202 rabbitmq]# rabbitmqctl cluster_status
- 或者登陆RabbitMQ管理后台查看:Overview -> Nodes
- 如果配置完后台登陆不了,重新创建用户,具体参考我的安装RabbitMQ相关教程
- 解除集群节点
# 第一种方式:在第三个节点执行:
[root@host0204 rabbitmq]# rabbitmqctl stop_app
[root@host0204 rabbitmq]# rabbitmqctl reset
[root@host0204 rabbitmq]# rabbitmqctl start_app
[root@host0204 rabbitmq]# rabbitmqctl cluster_status
# 第二种方式:在第一个节点执行(该方式执行前需先stop掉要解除的节点):
[root@host0202 rabbitmq]# rabbitmqctl forget_cluster_node rabbit@host0204
》配置镜像队列
备注
附录
关于作者 · AdminI am Yasin, let's talk about these first!
文章评论
还没有评论,欢迎留下第一条回复。
登录 或 注册 后发表评论。