• 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指令来启动一个节点。
  • 相关阅读:
    使用IDEA创建Maven项目
    DHCP 服务详解
    Linux的使用
    Docker的使用
    记录一件小事
    Unity插件DOTween中的中的Ease
    入坑微信小程序必经之路(十)微信授权登录
    入坑微信小程序必经之路(九)发送 res.code 到C# API接口换取 openId, sessionKey
    POI3.17操作excel(读)
    Vue3.2 内置组件 Suspense
  • 原文地址:https://www.cnblogs.com/learn-dotnet/p/5519151.html
Copyright © 2020-2023  润新知