集群的好处
生产环境中不会应用单机部署的方式,如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况,单台 RabbitMQ就会故障导致系统瘫痪。
同时集群还可以增加MQ的吞吐量
搭建集群
准备三台物理机环境,这里我用三台虚拟机的方式去模拟
RabbitMQ的安装与启停
以下操作需要在三台机器分别执行
检查是否由Erlang环境
erl -version
卸载低版本Erlang(未安装通常不需要操作)
如果通过yum install erlang
安装了Erlang的话,版本可能会太低没办法安装高版本RabbitMQ,需要卸载Erlang后再安装高版本Erlang。
安装Erlang
先切换到root
用户,如果已经是root
用户无需操作
su - root
Erlang各版本地址
下载rpm包
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4/erlang-23.3.4-1.el7.x86_64.rpm
安装
rpm -ivh erlang-23.3.4-1.el7.x86_64.rpm
下载并安装RabbitMQ安装包
RabbitMQ与Erlang版本对照
https://www.rabbitmq.com/which-erlang.html
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.8/rabbitmq-server-3.8.8-1.el7.noarch.rpm
在安装RabbitMQ之前需要先安装socat
yum install socat -y
socat
安装完成
安装RabbitMQ
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
设置开机自启动
chkconfig rabbitmq-server on
启动RabbitMQ服务
/sbin/service rabbitmq-server start
查看RabbitMQ的状态
/sbin/service rabbitmq-server status
停止RabbitMQ
/sbin/service rabbitmq-server stop
修改 3 台机器的主机名称hostname
vim /etc/hostname
分别修改为host5
host6
host7
在3台机器的 hosts 文件上追加主机名和ip的映射
vim /etc/hosts
192.168.146.105 host5
192.168.146.106 host6
192.168.146.107 host7
这样在任意一台机器上可以通过机器名代替ip去连接两外两台机器了
同步cookie 文件
以确保各个节点的 cookie 文件使用的是同一个值
在 host5 上执行文件同步命令
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.146.106:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.146.107:/var/lib/rabbitmq/.erlang.cookie
启动 RabbitMQ 服务
需要在三个节点所在的机器上分别执行以以下服务启动命令
rabbitmq-server -detached
配置附属节点 host6
在host6执行
# rabbitmqctl stop 会将 Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务
rabbitmqctl stop_app
# 重置
rabbitmqctl reset
# 加入集群 host1就是host1所在机器的ip
rabbitmqctl join_cluster rabbit@host5
# 启动rabbitmq服务,无需启动erlang虚拟机
rabbitmqctl start_app
配置附属节点host7
这里是将host7加入到了host6,加入host5也是可以的
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@host6
rabbitmqctl start_app
集群状态
rabbitmqctl cluster_status
开启 web 管理插件
三台机器都要开启
rabbitmq-plugins enable rabbitmq_management
设置用户
创建账号
rabbitmqctl add_user admin admin
设置用户角色
rabbitmqctl set_user_tags admin administrator
设置用户权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
解除集群节点(host6 和 host7 机器分别执行)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
rabbitmqctl forget_cluster_node rabbit@host6(host5 机器上执行)
镜像队列
镜像队列的优点
如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,
但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一个短暂却会产生问题的时间窗。通过 publisherconfirm 机制能够确保客户端知道哪些消息己经存入磁盘,
尽管如此,一般不希望遇到因单点故障导致的服务不可用。
引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中
的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。
镜像队列配置步骤
任选一个节点的web管理端
集群的停止和启动
停止集群节点
rabbitmqctl stop_app
启动集群节点
集群创建后每次重启节点即可加入集群
节点disk和ram切换
更改节点类型
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
评论区