一、准备主机
准备3台主机用于rabbitmq部署,文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署,只需下载对应的版本进行相同的操作。
主机IP | 角色说明 |
---|---|
192.168.128.31 | 种子节点 |
192.168.128.32 | 普通节点 |
192.168.128.33 | 普通节点 |
二、部署rabbitmq
在每台主机上都进行相同的操作部署erlang和rabbitmq,版本对应信息及单机部署详情可以参观前一篇文章【部署篇】RabbitMq-02单机模式部署,无法下载部署包时可通过文章附件进行下载。
2.1安装Erlang
直接到rabbitmq仓库中下载,安装包下载地址:Releases · rabbitmq/erlang-rpm · GitHub,这里要注意下载的版本名称与操作系统版本的对应关系,如el7,el8,el9分别对应的是centos7、centos8、centos9版本。
备注:文章关联了安装部署使用的资源包,可以直接下载
# 下载erlang
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.18/erlang-23.3.4.18-1.el7.x86_64.rpm
# 安装erlang
yum install erlang-23.3.4.18-1.el7.x86_64.rpm -y
# 查看erlang
erl -v
2.2安装 RabbitMQ
1.进入rabbitmq仓库中下载,安装包下载地址:Releases · rabbitmq/rabbitmq-server · GitHub
2.选择名称中包含 noarch的rpm包
,表示该软件包是“无架构”(no architecture)特定的。这意味着该软件包不依赖于特定的硬件架构或操作系统架构,可以在任何架构上运行。
3.由于rabbitmq后期版本已经不在支持centos7,这里我选择3.8.30进行下载安装。
4.rabbitmq默认端口号:5672
备注:文章关联了安装部署使用的资源包,可以直接下载
# 下载安装包
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.30/rabbitmq-server-3.8.30-1.el7.noarch.rpm
# rabbitmq的安装依赖socat
yum install socat -y
# 安装Rabbitmq
yum install rabbitmq-server-3.8.30-1.el7.noarch.rpm -y
2.3检测服务
# 启动服务
systemctl start rabbitmq-server
# 查看状态
systemctl status rabbitmq-server
2.4关闭防火樯
#关闭防火樯
systemctl stop firewalld
三、集群准备
- 同步其中一台的erlan.cookie到其他服务器
# 复制31至32
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.128.32:/var/lib/rabbitmq/.erlang.cookie
# 复制31至33
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.128.33:/var/lib/rabbitmq/.erlang.cookie
备注:这步必须确保文件复制并被替换否则会影响加入集群。
- 修改主机名分别为node1,node2,node3
# 在31上执行
echo 'node1' > /etc/hostname
# 使用 hostname 命令使更改立即生效
sudo hostname -F /etc/hostname
# 在32上执行
echo 'node2' > /etc/hostname
# 使用 hostname 命令使更改立即生效
sudo hostname -F /etc/hostname
# 在33上执行
echo 'node3' > /etc/hostname
# 使用 hostname 命令使更改立即生效
sudo hostname -F /etc/hostname
- 配置host文件,并确保通过名称相互能ping通,这里的node1,2,3名称是可以自定义的。
# 编辑hosts文件
vi /etc/hosts
# 输入对应内容
192.168.128.31 node1
192.168.128.32 node2
192.168.128.33 node3
修改/etc/rabbitmq/rabbitmq-env.conf指定节点名称
# 设置31节点名称
echo 'RABBITMQ_NODENAME=rabbit@node1'>/etc/rabbitmq/rabbitmq-env.conf
# 设置31节点名称
echo 'RABBITMQ_NODENAME=rabbit@node2'>/etc/rabbitmq/rabbitmq-env.conf
# 设置31节点名称
echo 'RABBITMQ_NODENAME=rabbit@node3'>/etc/rabbitmq/rabbitmq-env.conf
四、加入集群
- 选择第一个节点作为种子节点
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
- 在其他节点上,使用
rabbitmqctl
命令加入集群
# 加入集群
rabbitmqctl stop_app
rabbitmqctl reset
#rabbitmqctl join_cluster {cluster_node}@{node_name}
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
# 如果.erlang.cookie无权限,可以设置
sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
其中 {cluster_name}@{node_name}
是种子节点的名称及/etc/rabbitmq/rabbitmq-env.conf中配置的名称相对应。
- 启用集群高可用,在任意节点执行
rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
- 设置管理员帐号
备注:由于前边调用了reset导致配置清空,需要重新设置管理员
# 配置管理员及权限
rabbitmqctl add_user admin 123456
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator
- 访问管理页面
登录管理页面地址:http://192.168.128.31:15672输入帐号:admin,密码:123456登录。
五、运维命令
1.查看节点状态
rabbitmqctl cluster_status
2.停止服务
rabbitmqctl stop_app
3.重置配置和数据
rabbitmqctl reset
4.加入集群
rabbitmqctl join_cluster [cluser_node]@[node_name]
5.启动服务
rabbitmqctl start_app
六、自动处理网络分区【可选】
RabbitMQ 提供了三种方法自动地处理网络分区pause-minority 模式、pause-if-all-down 模式和autoheal 模式。默认是 ignore 模式,即不自动处理网络分区,所以在这种模式下,当网络分区的时候需要人工介入。在 rabbitmq.config 配置文件中配置cluster_partition_handling
参数即可实现相应的功能。默认的 ignore 模式的配置如下,注意最后有个点号:
[
{
rabbit, [
{cluster_partition_handling, ignore}
]
}
]
pause-minority 模式
在pause-minority 模式下,当发生网络分区时,集群中的节点在观察到某些节点"down"的时候,会自动检测其自身是否处于"少数派"(分区中的节点小于或者等于集群中一半的节点数),RabbitMQ 会自动关闭这些节点的运作。根据 CAP 原理,这里保障了P,即分区耐受性。这样确保了在发生网络分区的情况下,大多数节点(当然这些节点得在同一个分区中)可以继续运行。"少数派"中的节点在分区开始时会关闭,当分区结束时又会启动。这里关闭是指RabbitMQ 应用的关闭,而Erlang 虚拟机并不关闭,类似于执行了 rabbitmqctl stop_app
命令。处于关闭的节点会每秒检测一次是否可连通到剩余集群中,如果可以则启动自身的应用。相当于执行 rabbitmqctl start_app
命令。
pause-minority 模式相应的配置如下:
[
{
rabbit, [
{cluster_partition_handling, pause-minority}
]
}
]
需要注意的是RabbitMQ 会关闭不是严格意义上的大多数,比如在一个集群中只有两个节点的时候并不适合采用pause-minority 的模式,因为其中任何一个节点失败而发生网络分区时,两个节点都会关闭。当网络恢复时有可能两个节点会自动启动恢复网络分区,也有可能仍保持关闭状态,然而如果集群中的节点数远大于2 个时,pause-minority 模式比 ignore 模式更加可靠,特别是网络分区通常是由单节点网络故障而脱离原有分区引起的。
当对等分区出现时,会关闭这些分区内的所有节点,对于前面的[node1,node2] [node3,node4] 的例子而言,这四个节点上的RabbitMQ 应用都会被关闭,只有等待网络恢复之后,才会自动启动所有的节点以求从网络分区中恢复。
pause-if-all-down 模式
在pause-if-all-down 模式下,RabbitMQ 集群中的节点在和所配置的列表中的任何节点不能交互时才会关闭 语法为 {pause_if_all_down, [nodes], ignore|autoheal},其中[nodes]为受信节点,参考配置如下:
[
{
rabbit, [
{cluster_partition_handling, {pause_if_all_down, ['rabbit@node1'], ignore}}
]
}
]
如果一个节点与 rabbit@node1 节点无法通信时,则会关闭自身的 RabbitMQ 应用。如果是rabbit@node1 本身发生了故障造成网络不可用,而其他节点都是正常的情况下,这种规则会让所有的节点中 RabbitMQ 应用都关闭,待rabbit@node1 中的网络恢复之后,各个节点再启动自身应用以从网络分区中恢复。
pause-if-all-down 模式下有ignore 和autoheal 两种不同的配置。考虑前面pause-minority 模式中提及的一种情形,node1、node2 部署在机架A 上,而node3、node4 部署在机架B,此时配置{cluster_partition_handling,{pause_if_all_down,['rabbit@node1' ,'rabbit@node3'], ignore}},那么当机架A 和机架B 通信出现异常时,由于node1、node2 保持着通信,node3、node4 保持着通信,这4 个节点都不会自行关闭,但是会形成两个分区,所以这样不能实现自动处理的功能。所以如果将配置中的ignore 替换成autoheal 就可以处理此种情形。
autoheal 模式
在autoheal 模式下,当认为发生网络分区时,RabbitMQ 会自动决定一个获胜(winning)的分区,然后重启不在这个分区中的节点来从网络分区中恢复。一个获胜的分区是指客户端连接最多的分区,如果产生一个平局,即有两个或者多个分区的客户端连接数一样多,那么节点数最多的一个分区就是获胜分区,如果此时节点数也一样多,将以节点名称的字典序来挑选获胜分区。
autoheal 模式参考配置如下:
[
{
rabbit, [
{cluster_partition_handling, autoheal}
]
}
]
注意:在autoheal 模式下,如果集群中有节点处于非运行状态,那么当发生网络分区的时候,将不会有任何自动处理的动作。