当前位置:   article > 正文

10. RabbitMq 集群搭建_rabbitmq集群搭建

rabbitmq集群搭建

1. RabbitMq集群搭建

在本系列第一篇文章中介绍了搭建RabbitMq环境的过程,现在要搭建含有3台RabbitMq服务器的集群环境。

1. 首先通过克隆方式,从第一台RabbitMq服务器环境克隆出另外2套出来,如下所示
在这里插入图片描述
2. 修改克隆出的2台RabbitMq服务器的Ip地址,修改成喜欢的IP即可
只需修改/etc/sysconfig/network-scripts/ifcfg-ens33文件中的IPADDR即可。

3. 修改3台RabbitMq服务器的hostname
3台服务器的hostname分别设置为node1、node2、node3
比如以第一台为例,通过vi /etc/hostname直接编辑hostname文件内容为node1即可,另外2台同样设置。

4. 分别修改3台RabbitMq服务器节点的hosts文件,目的是为了让各个节点互相识别对方
修改方式,分别在各个节点执行vi /etc/hosts,在hosts文件中追加下面内容

192.168.85.100 node1
192.168.85.101 node2
192.168.85.102 node2
  • 1
  • 2
  • 3

5. 把第1个节点上的cookie文件复制到另外2台克隆的节点上,确保各节点用的同一个cookie
在node1上执行下面2条命令,把node1节点上的cookie文件复制到node2和node3上。

scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie
  • 1
  • 2

6. 配置每个节点上rabbitmq的名字
在node1服务器上执行 vi /etc/rabbitmq/rabbitmq-env.conf打开文件添加如下配置

RABBITMQ_NODENAME=rabbit@node1
  • 1

同理在node2节点上执行 vi /etc/rabbitmq/rabbitmq-env.conf添加如下配置

RABBITMQ_NODENAME=rabbit@node2
  • 1

同理在node3节点上执行 vi /etc/rabbitmq/rabbitmq-env.conf添加如下配置

RABBITMQ_NODENAME=rabbit@node3
  • 1

7. 启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务
分别在3个节点上执行下面命令

rabbitmq-server -detached
  • 1

8. 分别把node2、ndoe3加入到node1集群中
首先把node2加到node1中,在node2上执行下面命令,把Rabbitmq服务器先停止,加入到node1中,然后再重启

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
  • 1
  • 2
  • 3
  • 4

在执行完上面命令后如没有任何报错,则说明node2已经加入到node1集群中了。但有不少老铁们在执行joint_cluster一步时会报下面的错误

[root@node2 ~]# rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1
Error: unable to perform an operation on node 'rabbit@node1'. Please see diagnostics information and suggestions below.

Most common reasons for this are:

 * Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
 * CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
 * Target node is not running

In addition to the diagnostics info below:

 * See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
 * Consult server logs on node rabbit@node1
 * If target node is configured to use long node names, don't forget to use --longnames with CLI tools

DIAGNOSTICS
===========

attempted to contact: [rabbit@node1]

rabbit@node1:
  * connected to epmd (port 4369) on node1
  * epmd reports node 'rabbit' uses port 25672 for inter-node and CLI tool traffic 
  * can't establish TCP connection to the target node, reason: ehostunreach (host is unreachable)
  * suggestion: check if host 'node1' resolves, is reachable and ports 25672, 4369 are not blocked by firewall

Current node details:
 * node name: 'rabbitmqcli-9574-rabbit@node2'
 * effective user's home directory: /var/lib/rabbitmq
 * Erlang cookie hash: pFfLvMk3grI/EMzFLFq+Mw==
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

针对该问题,是因为没有放开4369和25672两个端口防火墙,可以在3个节点上分别执行下面命令放开端口

firewall-cmd --permanent --add-port=4369/tcp
firewall-cmd --permanent --add-port=25672/tcp 
service firewalld restart
  • 1
  • 2
  • 3

开放端口后重新执行join_cluster,则会显示加入node1集群成功。

9. 检查集群的状态
执行命令 rabbitmqctl cluster_status
在这里插入图片描述
10. 需要为集群重新添加账户
在node1节点上执行下面命令
创建账号

rabbitmqctl add_user admin 123
  • 1

设置用户角色

 rabbitmqctl set_user_tags admin administrator
  • 1

设置用户权限

rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
  • 1

执行完后,admin用户拥有了管理员的权限,可以登录管理端进行查看了
在这里插入图片描述
提示:集群搭建好后如果只可以通过一个节点访问页面管理端,比如192.168.85.101:15672无法访问,有可能是不能访问的节点未关闭防火墙缘故,只需要分别在不能访问的节点上执行下面命令关闭防火墙即可。

systemctl stop firewalld.service
systemctl disable firewalld.service
  • 1
  • 2

2. 镜像队列

创建好集群后,集群中有3个broker节点,如果创建的队列在其中任何一个节点上,当该节点宕机后,容易导致消息丢失,即使队列设置了durable持久化属性依然不能绝对保证消息不丢失,因为broker节点宕机后,不能保证队列中所有消息立即刷到磁盘中。
鉴于这种原因,镜像队列(mirror queue)机制尤为重要,镜像队列机制可以保证一个节点上的队列被镜像到其它节点上,当一个节点挂了后还有其它几点继续运行,保证了消息不丢失。可以为镜像队列设置镜像属性n,比如设置的n=2,表示队列在集群中会有2个副本,当一个节点宕机后,还有一个副本队列继续运行,该副本队列会在其他broker节点上继续镜像一个副本,保证每时每刻集群中都有2个副本。

下面进行创建镜像队列
首先创建一个策略,表示对什么样的队列进行镜像,登录管理端,进入policies创建策略
其中hello_policy为自定义的策略名字;^hello为策略的模式,表示名字以hello开头的队列会被镜像,比如hello_queue队列就会被镜像;然后设置ha-mode、ha-params、ha-sync-mode三兄弟属性,ha-mode=explicty表示随机镜像到一些节点上,ha-params=2表示镜像到2个节点上,ha-sync-mode=automatic表示自动镜像的,非手动。

在这里插入图片描述
策略创建好后,我们通过客户端创建一个名字为hello_my_queue队列,当然也可通过程序创建
在这里插入图片描述
创建好队列后,进入队列进行查看,如下所示,表示镜像策略生效了,在rabbit@node2节点上创建的队列,在rabbit@node1上有镜像队列。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/436822
推荐阅读
相关标签
  

闽ICP备14008679号