CentOS7实现RabbitMQ高可用集群
CentOS安装RabbitMQ集群
1、有3台已安装RabbitMQ的机器
192.168.38.133 rabbitmq1
192.168.38.137 rabbitmq2
192.168.38.138 rabbitmq3
2、设置hosts解析,所有节点配置相同
# vi /etc/hosts 192.168.38.133 rabbitmq1 192.168.38.137 rabbitmq2 192.168.38.138 rabbitmq3
3、设置节点间认证的cookie
[root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie 192.168.38.137:~ [root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie 192.168.38.138:~
4、分别启动独立的单机版rabbitmq broker节点:
[root@rabbitmq1 ~]# rabbitmq-server -detached [root@rabbitmq2 ~]# rabbitmq-server -detached [root@rabbitmq3 ~]# rabbitmq-server -detached
5、查看broker的集群状态:
[root@rabbitmq1 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq1 ... [{nodes,[{disc,[rabbit@rabbitmq1]}]}, {running_nodes,[rabbit@rabbitmq1]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq1,[]}]}]
6、创建broker集群,为了把集群中的3个节点联系起来,我们把137和138分别加入到133的集群。先在137上stop rabbitmq,然后加到133的集群(join cluster会隐式的重置该节点,并删除该节点上所有的资源和数据),然后查看集群状态里有了2个node。
[root@rabbitmq2 ~]# rabbitmqctl stop_app [root@rabbitmq2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq1 [root@rabbitmq2 ~]# rabbitmqctl start_app [root@rabbitmq2 ~]# rabbitmqctl cluster_status #这时候会出现两个节点 Cluster status of node rabbit@rabbitmq2 ... [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2]}]}, {running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq1,[]},{rabbit@rabbitmq2,[]}]}] 138服务器同理,加入集群中
7、修改集群的名字为rabbit@rabbitmq1_cluster(默认是第一个node的名字):
[root@rabbitmq1 ~]# rabbitmqctl set_cluster_name rabbit@rabbitmq1_cluster
8、重启集群:通过rabbitmqctl stop、rabbitmq-server -detached来重启集群,观察集群的运行状态变化
9、删除集群节点,当一个节点不属于这个集群的时候,我们需要删除它,可以通过本地或者远程的方式
[root@rabbitmq2 ~]# rabbitmqctl stop_app [root@rabbitmq2 ~]# rabbitmqctl reset [root@rabbitmq2 ~]# rabbitmqctl start_app [root@rabbitmq2 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq2 ... [{nodes,[{disc,[rabbit@rabbitmq2]}]}, {running_nodes,[rabbit@rabbitmq2]}, {cluster_name,<<"rabbit@rabbitmq2">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq2,[]}]}]
10、通过管理控制台连接集群,进行创建队列、发布消息、创建用户、创建policy等
http://192.168.38.133:15672/
注:到这里为止,我们创建好了一个简单的聚合集群。默认情况下,集群中的队列存在于集群中单个节点上,这要看创建队列时声明在那个节点上创建,而exchange和binding则默认存在于集群中所有节点。在stop_app或者stop掉broker之后在133节点的上队列,重启133的app或broker之后,虽然集群工作正常,但133上队列中消息会被清空(queue还是存在的)。对于生产环境而已,这肯定是不可接受的,如果不能保证队列的高可用,那么做集群的意义也不太大了,还好rabbitmq支持Highly Available Queues,下面介绍queue的HA。
11、Queue HA配置,队列可以通过镜像来提高可用性,HA依赖rabbitmq cluster,所以队列镜像也不适合WAN部署,每个被镜像的队列包含一个master和一个或者多个slave,当master因任何原因故障时,最老的slave被提升为新的master。发布到队列的消息被复制到所有的slave上,消费者无论连接哪个节点,都会连接到master;如果master确认要删除消息,那么所有slave就会删除队列中消息。队列镜像可以提供queue的高可用性,但不能分担负载,因为所有参加的节点都做所有的工作。
12、配置队列镜像,通过policy来配置镜像,策略可在任何时候创建,比如先创建一个非镜像的队列,然后在镜像,反之亦然。镜像队列和非镜像队列的区别是非镜像队列没有slaves,运行速度也比镜像队列快。设置策略然后设置ha-mode,3中模式:all、exactly、nodes。每个队列都有一个home node,叫做queue master node
-> 设置policy,以ha.开头的队列将会被镜像到集群其他所有节点,一个节点挂掉然后重启后需要手动同步队列消息
[root@rabbitmq1 ~]# rabbitmqctl set_policy -p AAA ha-allqueue "^ha\." '{"ha-mode":"all"}'
->设置policy,以ha.开头的队列将会被镜像到集群其他所有节点,一个节点挂掉然后重启后会自动同步队列消息(生产环境建议采用这个方式)
[root@rabbitmq1 ~]# rabbitmqctl set_policy -p AAA ha-allqueue "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}' 注释:AAA 是VHost名称, ha-allqueue 是策略名称, ^ha\. 是匹配ha.开头的队列,如果只有^的话就是匹配所有队列都会自动同步数据 ha-mode:all是同步到所有节点, ha-sync-mode:automatic 自动同步,没有这个配置的话则需要手动同步数据
-> 在管理控制台中设置policy
导航 -> Admin -> Policies -> Add/Update a policy
注:
-
> 当整个集群down掉时,最 后一个down机的节点必须第一个启动到在线状态,如果不是这样,节点会等待30s等最后的磁盘节点恢复状态,然后失败。如果最后下线的节点不能上线,可以通过forget_cluster_node 指令来踢出集群。
-
> 如果所有的节点不受控制的同时宕机,比如掉电,会进入所有的节点都会认为其他节点比自己宕机的要晚,即自己先宕机,这种情况下可以使用force_boot指令来启动一个节点。