RabbitMQ集群搭建
操作系统:CentOS7
Erlang版本:22.2.1
RabbitMQ版本:3.8.1
端口:
• 4369:epmd(Erlang Port Mapper Daemon), 一个供RabbitMQ节点和CLI工具使用的名字发现守护程序,在所有RabbitMQ节点上启动,起到name server的作用。
• 5672, 5671:AMQP协议使用。
• 25672:AMQP端口+20000,内部使用。
• 15672:HTTP API和管理工具使用的端口。
• 61613, 61614:STOMP协议使用。
• 15674:运行于WebSocket之上的STOMP客户端使用。
备注:下文的安装步骤中,【】包围的部分需根据自己的环境来配置
RabbitMQ安装
使用rpm方式安装。
1 安装erlang
rpm -ivh /opt/erlang-22.2.1-1.el7.x86_64.rpm
2 安装RabbitMQ
rpm -ivh /opt/rabbitmq-server-3.8.1-1.el7.noarch.rpm
3 安装rabbitmq管理工具
rabbitmq-plugins enable rabbitmq_management
4 启动
systemctl start rabbitmq-server
5 开机自启
systemctl enable rabbitmq-server
注意:rabbitMQ使用rabbit@机器名来建立数据存放目录和pid文件,修改机器名后重启,会导致启动失败
6 用户管理
本步骤完成后,可以通过http://【IP】:15672,访问管理界面。
6.1 新增管理员用户
rabbitmqctl add_user 【用户名】 【用户密码】
其他相关命令:
- 修改用户密码
rabbitmqctl change_password {username} {newpassword}
- 验证用户密码
rabbitmqctl authenticate_user {username} {password}
- 删除用户
rabbitmqctl delete_user {username}
- 列出所有用户,结果为用户名和用户TAG
rabbitmqctl list_users
6.2 设置用户标签(tag)
rabbitmqctl set_user_tags 【用户名】 【tag...】
tag有如下几种选项:
- none
无任何角色,新建的用户默认值 - management
可以访问WEB管理界面 - policymaker
包含management的所有权限,并且可以管理策略(Policy)和参数(Parameter) - monitoring
包含management的所有权限,并且可以看到所有连接、信道和节点信息。 - administrator
包含monitoring的所有权限,并且可管理虚拟主机、用户、权限、策略、参数等,这是最高权限。
6.3 设置权限
rabbitmqctl set_permissions -p "/" 【用户名】 ".*" ".*" ".*"
命令格式:
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
参数说明:
- conf
正则表达式,用于匹配用户在哪些资源上拥有可配置权限。 - write
正则表达式,用于匹配用户在哪些资源上拥有可写入权限。 - read
正则表达式,用于匹配用户在哪些资源上拥有可读取权限。
7 增加web_stomp插件(可选)
/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.1/sbin/rabbitmq-plugins enable rabbitmq_web_stomp
8 启动应用
rabbitmqctl start_app
集群搭建
当不使用镜像队列时,RabbitMQ集群可以在各个节点冗余存储元数据,但不会冗余存储消息,因此当一个节点宕机时,该节点上未被消费的消息将全部丢失,即整个集群无法做到高可用。
1 配置域名解析
RabbitMQ节点使用短域名或全限定域名(FQDNs)相互寻址。因此,所有集群节点必须具备解析其它集群成员的主机名的能力。
打开hosts文件
vi /etc/hosts
增加
【IP1】 【host-1】
【IP2】 【host-2】
【IP3】 【host-3】
2 同步Erlang Cookie
要保证集群中的不同节点互相通信必须共享相同的Erlang Cookie。Erlang节点会通过交换Erlang Cookie以获得认证。Cookie文件权限要保持一致(400)。
假设将host-1节点的Cookie同步到多台host-n:
2.1 关闭host-n节点上的RabbitMQ服务
rabbitmqctl stop
2.2 备份host-n节点上的现有Cookie
cp /var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie.bak
2.3 将host-1节点的Cookie文件覆盖到其他节点
scp命令,或finalshell工具。
2.4 并修改每个节点的cookie权限为400
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie
2.5 重启Erlang虚拟机及RabbitMQ服务
rabbitmq-server -detached
3 构建集群
假设将多台host-n加入到host-1节点上的RabbitMQ服务:
3.1 关闭host-n上的RabbitMQ服务
rabbitmqctl stop_app
3.2 在host-n上执行加入集群的命令
rabbitmqctl join_cluster rabbit@【集群中某个节点的主机名】
3.3 重启host-n上的rabbitMQ服务
rabbitmqctl start_app
4 在host-1(或任一节点)上设置策略,实现镜像队列
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
命令格式:
rabbitmqctl set_policy [-p vhost] [–priority priority] [–apply- to
apply- to] {name} {pattern} {definition}
这一行命令是在默认vhost(/)上创建一个策略:策略名称为ha-all;策略表达式为"^",表示所有匹配所有队列名称;ha-mode,指明镜像队列的模式,有效值为 all、exactly、 nodes(默认为all,即在集群中所有的节点上进行镜像;exactly 表示在指定个数的节点上进行镜像,节点个数由 ha-params 指定; nodes 表示在指定节点上进行镜像,节点名称通过 ha-params 指定,节点的名称通常类似于 rabbit@hostname ,可以通过rabbitmqctl cluster_status 命令查看到)。
其他相关命令:
- 查看策略
rabbitmqctl list_policies -p /
- 清除策略
rabbitmqctl clear_policy -p / ha-all
重要文件存储位置
- 日志
/var/log/rabbitmq/rabbit@hostname.log
- 配置文件
/etc/rabbitmq/rabbitmq.config:rabbitmq
- 消息持久化文件
/var/lib/rabbitmq/mnesia/rabbit@hostname