镜像模式
能够保证数据不丢失,并且实现简单。
目的是为了保证 rabbitmq 数据的高可靠解决方案,主要就是实现数据的同步。
可以主节点使用内存模式,其他节点磁盘模式
镜像集群搭建
节点安装
基础包
yum install -y build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
下载 rabbit 软件包
wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm
wget https://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-1.1.el7.lux.x86_64.rpm
wget www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm
安装 rabbit 软件包
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
修改集群用户
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
修改
loopback_users 中 guest 两边的 <<>> 去掉
启动服务
service rabbitmq-server start
安装管理插件
rabbitmq-plugins enable rabbitmq_management
检查是否启动成功
lsof -i:5672
lsof -i:15672
文件同步
找到 master节点的 /var/lib/rabbitmq/.erlang.cookie 文件,复制到其他节点的 /var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie 192.168.0.12:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie 192.168.0.13:/var/lib/rabbitmq/
也可以直接复制粘贴内容
如果 permission denied ,可以 chmod 777
/var/lib/rabbitmq/ 下也有 .erlang.cookie,也需要 chmod
最后把 修改的 cookie 权限还原成 400
镜像集群
停止 MQ 服务
停止所有节点的服务(不能使用原有命令:service rabbitmq-server stop)
命令与停止服务不一样
rabbitmqctl stop
启动集群
每个节点
rabbitmq-server -detached
slave 节点加入集群
注意slave节点第一步是 stop_app 不是 stop
//注意做这个步骤的时候:需要配置/etc/hosts 必须相互能够寻址到
node2:rabbitmqctl stop_app
node2:rabbitmqctl join_cluster --ram rabbit@rb1
node2:rabbitmqctl start_app
node3:rabbitmqctl stop_app
node3:rabbitmqctl join_cluster rabbit@rb1
node3:rabbitmqctl start_app
查看集群状态
rabbitmqctl cluster_status
修改集群名
默认名是第一个节点明
rabbitmqctl set_cluster_name rb_cluster1
配置镜像队列
任意一个节点执行
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致,RabbitMQ高可用集群就已经搭建好了,我们可以重启服务,查看其队列是否在从节点同步。
如果有3个节点,此时创建一个队列,这里就会显示+2
Features 会显示 ha-all
可能报错
rabbit@rb1:
connected to epmd (port 4369) on rb1
epmd reports node ‘rabbit’ running on port 25672
TCP connection succeeded but Erlang distribution failed
suggestion: hostname mismatch?
suggestion: is the cookie set correctly?
suggestion: is the Erlang distribution using TLS?
current node details:
- node name: ‘rabbitmq-cli-84@rb3’
- home dir: /var/lib/rabbitmq
- cookie hash: 9oVSjkmsOSLYXPNC8PiFgw==
- 检查集群 .erlang.cookie 是否一致
- 检查 /etc/hosts 与 /etc/hostname 配置是否正确