rabbitMQ的两种重要特性,异步化提高系统抗峰值能力和系统及功能解耦,这两个特点决定了rabbitMQ在我们的系统中占据了重要的地位,所以为了让RabbitMQ高可用,我们今天就来讲解下RabbitMQ的集群环境搭建
应用常识
一般情况下,一个单机版的rabbitMQ能承受大运1000/s的消息量(跟网络和消息的大小有关,数值存在波动),但是如果是集群环境中,就可以将访问的压力分摊到集群中的其他节点上,增大访问的QPS
RabbitMQ集群中所有的节点都会备份的元数据信息如下:
- 队列元数据
- 交换机
- 绑定关系元数据
- vhost元数据
集群搭建
首先按照之前的博文Centos7下RabbitMQ的搭建,我们来在另一个服务器上搭建RabbitMQ的环境,本博文只是演示集群环境的搭建,所以采用了两台服务器来搭建集群环境,如果再添加一台服务器的话,步骤是一样的
服务器 | IP | 节点 |
---|---|---|
RabbitMQ1 | 192.168.56.105 | node1 |
RabbitMQ2 | 192.168.56.106 | node2 |
- 首先我们来修改各个服务器上的hosts文件,让各个节点都互相的识别对方的存在
## 进入的 /etc/hosts 文件中设置hosts文件
vi /etc/hosts
## 添加
192.168.56.105 node1
192.168.56.106 node2
修改完成之后,执行下面语句,查看节点是否生效
## 启动rabbitmq服务
rabbitmq-server -detached
## 查看rabbitMQ的集群状态节点的命名是否正确
rabbitmqctl cluster_status
.......
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
{running_nodes,[rabbit@node2]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node2,[]}]}]
如果不是的话,则需要将/etc/hostname
中的主机名设置成节点名称,然后在/etc/hosts
中添加对应的节点
- 编辑RabbitMQ的Cookie文件,以确保各个节点的cookie文件使用的是同一个值
.erlang.cookie文件路径按照安装方式的不同,可以分为以下的情况:
1 如果采用解压缩的方式,那么该文件存在的位置在$HOME目录下,即:$HOME/.erlang.cookie
2 如果使用root安装,则位置为:/root/.erlang.cookie,其他用户对应的位置如下:/root/用户名/.erlang.cookie
3 使用rpm方式来安装,则位置为:/var/lib/rabbitmq目录下
找到该文件之后,使用如下的命令来拷贝文件到另一台服务上
## scp来拷贝文件
scp /root/.erlang.cookie node2:/root/.erlang.cookie
- 使用
rabbitmqctl
工具添加集群节点
如果想node1作为主节点,然后其余节点作为子节点,则需要在其余节点上执行如下的命令
## 先停止该节点的rabbitmq服务,但是不停止erlang的服务
rabbitmqctl stop_app
## 然后重置所有的节点信息 注意这里的重置会将之前添加的用户信息也重置点,重置之后,需要添加对应的用户,并且赋予用于权限
rabbitmqctl reset
## 添加节点到主节点
rabbitmqctl join_cluster rabbit@node1
## 添加完成之后,需要重启rabbitMQ的服务
rabbitmqctl start_app
这里有三点是需要注意的:
1.必须先停止子节点的rabbitMQ的服务,但是不能停止erlang的服务
2.节点重置后,之前的用户信息会消失,准确来说是所有非默认的消息都会被重置,所以需要额外添加用户,并且赋予对应的权限
3.添加集群节点完成之后需要重新启动rabbitMQ的服务
- 检测集群是否搭建成功
在任意一节点查看
## 查看集群信息
rabbitmqctl cluster_status
......
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
{running_nodes,[rabbit@node1,rabbit@node2]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]},{rabbit@node2,[]}]}]
集群注意的地方和命令
上面已经将集群搭建起来了,如果其中任意一个子节点关闭,则在其他节点看不到该节点信息
如果关闭了集群中的所有节点,则需要确保在启动的时候最后关闭的那个节点是第一个启动起来的
- 节点的类型
节点类型分为硬盘和内存两个类型,其中内存的性能比较高,但是信息不会持久化,硬盘的具有IO瓶颈,但是信息能持久化,我们默认创建的节点类型就是硬盘型的
我们可以手动修改节点的类型
## 修改节点的类型
rabbitmqctl change_cluster_node_type disc
在集群中,为了保证信息的完整和持久化,至少需要两个节点是硬盘类型的
- 剔除节点
这里提供重置来删除节点
## 关闭rabbitMQ的服务
rabbitmqctl stop_app
## 重置节点
rabbitmqctl reset
rabbitMQ常用的命令
用途 | 命令 |
---|---|
添加虚拟机 | rabbitmqctl add_vhost 虚拟机名称 |
删除虚拟机 | rabbitmqctl delete_vhost 虚拟机名称 |
虚拟机列表 | rabbitmqctl list_vhosts |
添加用户 | rabbitmqctl add_user 用户名 密码 |
修改用户密码 | rabbitmqctl change_password 用户名 密码 |
授权 | rabbitmqctl set_permissions -p / 用户名 "." "." ".*" |
分配角色 | rabbitmqctl set_user_tags 用户名 角色名 |
用户列表 | rabbitmqctl list_users |
删除用户 | rabbitmqctl delete_user 用户名 |
插件列表 | rabbitmq-plugins list |
启动插件 | rabbitmqctl enable 插件名 |
停止服务(rabbitMQ和erlang) | rabbitmqctl stop |
停止rabbitMQ服务 | rabbitmqctl stop_app |
启动服务(rabbitMQ和erlang) | rabbitmq-server -detached |
启动rabbitMQ服务 | rabbitmqctl start_app |
集群添加节点 | rabbitmqctl join_cluster 节点名称 (--ram) |
集群状态 | rabbitmqctl cluster_status |
修改节点类型 | rabbitmqctl change_cluster_node_type {disc/ram} |
集群删除节点 | rabbitmqctl forget_cluster_node (--offline) |