文章目录
- 一、一机多实例集群
- 1.1 三机启动
- 1.2 立主纳从
- 1.3 查看集群状态
- 1.4 web监控
- 1.5 测试
- 1.5.1 数据同步
- 1.5.2 一从死,主仍战
- 1.5.3 从复活,死亡期间数据同步
- 1.5.4 主死,从活但不可用
- 二、多机集群
- 2.1 确定主机名
- 2.2 三机部署rabbitmq
- 2.3 设主纳从
- 2.4 开启web插件
- 2.5 新建用户,赋权限
- 2.6 web监控
- 2.7 测试
- 2.7.1 正常关闭时,最后关闭的节点需要第一个启动
- 2.7.2 异常断电
一、一机多实例集群
一机多实例,顾名思义就是在一台机器上面部署多个rabbitmq服务组成集群。RabbitMQ的单机多节点配置大多用于实验性论证,安全性和高可用性太低。
- 需要注意,每个rabbitmq节点名称、内部端口、插件端口等信息不能冲突。
1.1 三机启动
参照前面章节,先部署erlang环境、安装rabbitmq服务,再开始做以下步骤。
1.启动第一个节点,第一个节点名称为rabbitmq_1,监听端口为5672,web页面的端口默认为15672,节点内部通信的端口为25672就不需要使用指定参数多此一举了。
[root@node1 ~]# RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbitmq_1 rabbitmq-server start
2. 查看第一个节点进程
3. 启动第二个节点,第二个节点名称为rabbitmq_2,监听端口为5673,web页面的端口默认为15673,节点内部通信的端口为25673。
[root@node1 rabbitmq_2]# RABBITMQ_NODE_PORT=5673 RABBITMQ_DIST_PORT=25673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbitmq_2 rabbitmq-server start
4. 查看第二个节点进程。
5. 启动第三个节点,第三个节点名称为rabbitmq_3,监听端口为5674,web页面的端口默认为15674,节点内部通信的端口为25674。
[root@node1 ~]# RABBITMQ_NODE_PORT=5674 RABBITMQ_DIST_PORT=25674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbitmq_3 rabbitmq-server start
6 查看第三个节点进程。
1.2 立主纳从
假设把rabbitmq_1当作主节点,rabbitmq_2和rabbitmq_3当作从节点。
1.设置rabbitmq_1为主节点
#停止rabbitmq_1节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 stop_app
#将rabbitmq_1重置还原到最初状态,包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据、配置的用户、vhost 等,以及删除所有的持久化消息。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 reset
#启动rabbitmq_1节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 start_app
2. 将rabbitmq_2、rabbitmq_3加入到主节点。
#停止rabbitmq_2节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 stop_app
#将rabbitmq_2节点加入到主节点(rabbitmq_1),“node1”为服务器主机名。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 join_cluster rabbitmq_1@node1
#启动rabbitmq_2节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 start_app
#停止rabbitmq_3节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 stop_app
#将rabbitmq_3节点加入到主节点(rabbitmq_1),“node1”为服务器主机名。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 join_cluster rabbitmq_1@node1
#启动rabbitmq_3节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 start_app
1.3 查看集群状态
[root@node1 ~]# rabbitmqctl cluster_status -n rabbitmq_1
1.4 web监控
- 开启web插件
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
- 此时用15672、15673、15674三个端口都可以访问到web界面。
3.新建用户,设置密码,指定角色,添加权限。
#给主节点添加baimu用户,密码为citms。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 add_user baimu citms
#将主节点的baimu用户设置成administrator角色,拥有最高权限。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 set_user_tags baimu administrator
#给主节点的baimu用户添加权限。可配置、可写、可读。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 set_permissions -p / baimu ".*" ".*" ".*"
同时也给其他两个从节点添加用户,授权,不然15673和15674页面登陆不了。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 add_user baimu citms
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 set_user_tags baimu administrator
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 set_permissions -p / baimu ".*" ".*" ".*"
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 add_user baimu citms
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 set_user_tags baimu administrator
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 set_permissions -p / baimu ".*" ".*" ".*"
4. 使用创建的用户密码分别登录IP:15672、IP:15673、IP:15674。
1.5 测试
1.5.1 数据同步
- 主节点创建一个交换器和队列,并绑定,发送消息“武汉”。
2. 从节点查看消息“武汉”,主从消息同步。
1.5.2 一从死,主仍战
其中一个从节点宕机后,不影响主节点的写入,也不营销那个其余存活的从节点数据同步。
- 将rabbitmq_2从节点停掉。
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_2 stop_app
- IP:15673访问不了,但是主节点依然可以写入,rabbitmq_3从节点依然可以消息同步。
1.5.3 从复活,死亡期间数据同步
- 将rabbitmq_2从节点启动。
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_2 start_app
Starting node rabbitmq_2@node1 ...
- IP:15673恢复访问,死掉期间主节点写入的“beijing”数据依然可以读出来。
1.5.4 主死,从活但不可用
- 停止rabbitmq_1主节点
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_1 stop_app
Stopping rabbit application on node rabbitmq_1@node1 ...
- rabbitmq_2等从节点已让可以访问,但是无法数据写入。
二、多机集群
2.1 确定主机名
准备三台服务器,并修改主机名,最好是能一眼看出哪个节点的。
如图:
- 192.168.130.129为第一个节点,主机名为node1;
- 192.168.130.130为第二个节点,主机名为node2;
- 192.168.130.131为第三个节点,主机名为node3。
- 编辑各节点的/etc/hosts文件,在其上添加IP 地址与节点名称的映射信息。
[root@node1 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3
[root@node2 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3
[root@node3 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3
2.2 三机部署rabbitmq
第一步,分别在三台机器上部署rabbitmq服务,怎么来部署可以参考第二章节,这里我就提前部署好了。各节点的erlang和rabbitmq版本需一致。可以设置rabbitmq-enc.conf变量文件来定义我们想要的信息。
- 第一个节点信息。
- 第二个节点信息。
- 第三个节点信息
- 各节点启动正常,可以直接后台运行:rabbitmq-server -detached。
第二步,把所有节点的rabbitmq停掉,将node1节点的cookie文件内容复制替换node2、node3节点上的cookie文件,以确保各个节点的 cookie 文件使用的是同一个值。
- cookie文件默认路径为/var/lib/rabbitmq/.erlang.cookie ,或者在$HOME/.erlang.cookie。
- 二进制安装的rabbitmq服务,.erlang.cookie文件在/root/目录下面,是个隐藏文件。
- cookie文件权限必须是400,不然启动时会报错。
- 第一个节点
- 第二个节点
- 第三个节点
第三步,三节点的.erlang.cookie文件内容替换统一后,依次启动各节点rabbitmq服务,必须保证每个节点的rabbitmq服务运行正常。
- 如果遇到启动异常,应该是在第一步先启动了未停止好,导致有端口占用,可以用 lsof -i:25672命令查看进程,将其杀掉,再重新启动就可以了。
- 问题:
- 解决:
- 查看各节点运行状态。
- 第一个节点运行正常
- 第二个节点运行正常
- 第三个节点运行正常
2. 查看各节点集群信息
- node1节点。
- node2节点
- node3节点
2.3 设主纳从
这里把node1名为主节点,node2和node3为从节点,操作步骤和前面差不多。
1.主节点不用做任何操作,分别在node2和node3机器上进行加入集群操作,先把node2节点加进来。
# 把node2节点加入到node1节点,组成以node1为主、node2为从的集群。
[root@node2 ~]# rabbitmqctl stop_app
[root@node2 ~]# rabbitmqctl reset
[root@node2 ~]# rabbitmqctl join_cluster rabbitmq_1@node1
[root@node2 ~]# rabbitmqctl start_app
2. 分别在node1和node2上查看集群状态,此时node1和node2已经组成集群。
3. 将node3加入node1。
# 把node3节点加入到node1节点,组成以node1为主、node3为从的集群。
[root@node3 ~]# rabbitmqctl stop_app
[root@node3 ~]# rabbitmqctl reset
[root@node3 ~]# rabbitmqctl join_cluster rabbitmq_1@node1
[root@node3 ~]# rabbitmqctl start_app
4.分别在node1和node3上查看集群状态,此时node1、node2、node3已经组成集群。
2.4 开启web插件
每个节点上都需要开启。
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node2 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node3 ~]# rabbitmq-plugins enable rabbitmq_management
2.5 新建用户,赋权限
只需要在主节点执行就可以了。
#创建一个qingjun用户,密码为citms。
[root@node1 ~]# rabbitmqctl add_user qingjun citms
#给qingjun用户设为administrator角色,拥有最高权限。
[root@node1 ~]# rabbitmqctl set_user_tags qingjun administrator
#给qingjun用户授权,可操作、可写、可读。
[root@node1 ~]# rabbitmqctl set_permissions -p / qingjun ".*" ".*" ".*"
2.6 web监控
通过web页面可以只管看到集群状态。
2.7 测试
2.7.1 正常关闭时,最后关闭的节点需要第一个启动
- 如果关闭了集群中的所有节点,则需要确保在启动的时候最后关闭的那个节点是第一个启动的。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的节点启动。
- 比如,现在依次关闭node1、node2、node3节点,node3节点是最后关闭的,那么启动的时候需要先启动node3节点。若先启动node1或者node2,会一致等待node3节点启动,等待多久有个机制,后面再讲,咱们先来测试下效果。
1.依次关闭node1、node2、node3节点。
[root@node1 rabbitmq]# rabbitmqctl stop
Stopping and halting node rabbitmq_1@node1 ...
[root@node2 ~]# rabbitmqctl stop
Stopping and halting node rabbitmq_2@node2 ...
[root@node3 ~]# rabbitmqctl stop
Stopping and halting node rabbitmq_3@node3 ...
2.此时先启动node1,node1日志显示一直在启动中,这个时候就是在等待node3节点启动。
3.此时启动node3节点,node1会过一段时间更新日志,显示服务启动成功。此时node2节点还是死掉状态,所以监控node2节点是红色。
4.最后我们启动node2节点,集群恢复。
2.7.2 异常断电
- 如果集群中的所有节点由于某些非正常因素,比如断电而关闭,那么集群中的节点都会认为还有其他节点在它后面关闭,此时需要调用 rabbitmgctl force_boot 命令来启动一个节点,之后集群才能正常启动。
- 我这里是在虚拟机运行正常的情况下突然关掉电脑来模拟此种情况。
1.电脑关机前,所有节点运行正常。
2.电脑突然关闭后,所有节点全部停止运行,监控页面不能访问。此时随便启动一个节点显示一直启动中。
3.此时执行命令,再次启动node1,就会启动成功,监控页面可以访问。
4.此时再去正常启动第二个节点就会启动成功,无论是node2,还是node3。我这里启动的是node2,192.168.130.130:15672监控页面可以访问。
5.最后再把第三个节点正常启动起来,恢复集群。