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/

1

注:到这里为止,我们创建好了一个简单的聚合集群。默认情况下,集群中的队列存在于集群中单个节点上,这要看创建队列时声明在那个节点上创建,而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 自动同步,没有这个配置的话则需要手动同步数据

2

-> 在管理控制台中设置policy

导航 -> Admin -> Policies -> Add/Update a policy

3

注:

  1. > 当整个集群down掉时,最 后一个down机的节点必须第一个启动到在线状态,如果不是这样,节点会等待30s等最后的磁盘节点恢复状态,然后失败。如果最后下线的节点不能上线,可以通过forget_cluster_node 指令来踢出集群。
  2. > 如果所有的节点不受控制的同时宕机,比如掉电,会进入所有的节点都会认为其他节点比自己宕机的要晚,即自己先宕机,这种情况下可以使用force_boot指令来启动一个节点。
原文地址:https://www.cnblogs.com/learn-dotnet/p/5519151.html