赞
踩
在本系列第一篇文章中介绍了搭建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
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
6. 配置每个节点上rabbitmq的名字
在node1服务器上执行 vi /etc/rabbitmq/rabbitmq-env.conf
打开文件添加如下配置
RABBITMQ_NODENAME=rabbit@node1
同理在node2节点上执行 vi /etc/rabbitmq/rabbitmq-env.conf
添加如下配置
RABBITMQ_NODENAME=rabbit@node2
同理在node3节点上执行 vi /etc/rabbitmq/rabbitmq-env.conf
添加如下配置
RABBITMQ_NODENAME=rabbit@node3
7. 启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务
分别在3个节点上执行下面命令
rabbitmq-server -detached
8. 分别把node2、ndoe3加入到node1集群中
首先把node2加到node1中,在node2上执行下面命令,把Rabbitmq服务器先停止,加入到node1中,然后再重启
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
在执行完上面命令后如没有任何报错,则说明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==
针对该问题,是因为没有放开4369和25672两个端口防火墙,可以在3个节点上分别执行下面命令放开端口
firewall-cmd --permanent --add-port=4369/tcp
firewall-cmd --permanent --add-port=25672/tcp
service firewalld restart
开放端口后重新执行join_cluster,则会显示加入node1集群成功。
9. 检查集群的状态
执行命令 rabbitmqctl cluster_status
10. 需要为集群重新添加账户
在node1节点上执行下面命令
创建账号
rabbitmqctl add_user admin 123
设置用户角色
rabbitmqctl set_user_tags admin administrator
设置用户权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
执行完后,admin用户拥有了管理员的权限,可以登录管理端进行查看了
提示:集群搭建好后如果只可以通过一个节点访问页面管理端,比如192.168.85.101:15672无法访问,有可能是不能访问的节点未关闭防火墙缘故,只需要分别在不能访问的节点上执行下面命令关闭防火墙即可。
systemctl stop firewalld.service
systemctl disable firewalld.service
创建好集群后,集群中有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上有镜像队列。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。