说明
- 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
》配置镜像队列
-
启动所有集群中的node,登陆任意一个node的RabbitMQ后台
-
配置策略policy:Admin -> Policies -> Add/update a policy
- name:策略名字,随便写
- Pattern:正则匹配规则,(比如^mirror=以mirror开头)
- Apply to:应用到交换机还是队列或全部
- Priority:优先级,默认空即可
- Definition:
- ha-mode:备份模式,exactly=备份模式,指备份几份
- ha-params:备份的分数
- ha-sync-mode:同步模式,automatic=自动
-
策略说明
- name:my-policy001 - Pattern:^mirror - Apply to: - Priority: - Definition: - ha-mode:exactly - ha-params:2 - ha-sync-mode:automatic
备注
- 该教程部分内容收集自网络,感谢原作者。
附录
- 无