RabbitMQ 是流行的开源消息队列系统,本身已经具备了较强的并发处理速度及运行稳定性,然而在大规模的实际应用中,往往还需要使用集群配置来保证系统中消息通信部分的高可用性,并发处理性能及异常恢复能力。这里将介绍一种实用的消息集群架构,以及一种能够快速、高效、可靠地部署并配置消息集群的方式,通过这种方法,我们可以在系统部署时仅需短短几分钟就能完成规模化的消息集群架设,极大地提高了工作效率和部署成功率。
回页首
RabbitMQ 已经支持与 Erlang 集成的 active/active cluster 方案,但是为了实现集群的高可用及自动化管理,我们还需要一个集群管理工具,来负责监控各节点消息服务的运行状态,以及在发现异常时自动执行一些预订的恢复动作,从而增强集群的容错恢复能力和持续服务能力。我们这里选择的是 Pacemaker 加 RabbitMQ 的集成方式。
集群结构如下图所示,RabbitMQ clustering 部分提供消息集群内部心跳检查及数据管理和同步功能,Pacemaker 则负责监控 RabbitMQ 各节点的服务状态及异常恢复,保证集群正常运行。
图 1.RabbitMQ 集群结构
回页首
准备工作主要分为如下几个步骤:
RabbitMQ Cookbook 下载
Pacemaker Cookbook 下载
Erlang Cookbook 下载
如果你的软件源里已经包含了 Erlang 相关 package,可以不用下载 Erlang Cookbook,只需修改 RabbitMQ 里的 Erlang 安装方式为本地安装就可以,本文采用本地安装方式,需要修改 RabbitMQ Cookbook 中以下文件:
#depends 'erlang'
#include_recipe 'erlang' package 'erlang'
如果系统启用了 iptables,还需要下载使用 iptables Cookbook 来开放相应端口。
i ptables Cookbook 下载 。
回页首
为实现本文使用的消息集群结构,需要在所有消息节点上分别搭建 RabbitMQ 的集群与 Pacemaker 的集群,设计完成的自动脚本安装配置过程如下:
注意:上述 1 、 2 、 3 步骤需要在所有节点执行,4 、 5 步只需在任一台 cluster 节点上执行一次就可以对整个集群生效。
回页首
将所有下载的 Cookbook 放至相同目录下,按以下步骤创建并修改新的 rabbitmq-ha cookbook,实现自动安装流程:
knife cookbook create rabbitmq-ha
depends iptables depends rabbitmq depends pacemaker
-A FWR -p tcp --dports 5672 -j ACCEPT -A FWR -p tcp --dports 4369 -j ACCEPT -A FWR -p tcp --dports 25672 -j ACCEPT -A FWR -p udp --dports 5405 -j ACCEPT -A FWR -p udp --sports 5405 -j ACCEPT
# 注册端口 iptables_rule 'port' # 添加 ip hostname 映射 execute 'add qpd hostnames to /etc/hosts' do command <<-EOF echo "# Hosts of rabbitmq nodes" >> /etc/hosts echo "192.168.1.10 rab001" >> /etc/hosts echo "192.168.1.11 rab002" >> /etc/hosts EOF end # 安装 rabbitmq include_recipe 'rabbitmq' # 安装 pacemaker include_recipe 'pacemaker'
# 创建 rabbitmq 用户 rabbitmq_user 'rabbituser' do password 'password' action :add end # 设置权限 rabbitmq_user 'rabbituser' do vhost '/' permissions '.* .* .*' action :set_permissions end # 创建 clone 资源 pacemaker_clone 'rabbitmq' do name "RABBITMQ" agent "ocf:rabbitmq:rabbitmq-server" params { "nodename" => "rabbit@`hostname -s`", "config_file" => "/etc/rabbitmq/rabbitmq" } op {'monitor' => { 'interval' => '10s', 'timeout' => '30s' } } action :create end
{ "name": "rabbit-ha-env", "json_class": "Chef::Environment", "chef_type": "environment", "override_attributes": { "rabbitmq": { "cluster": true, "cluster_disk_nodes": ["rabbit@rab001", "rabbit@rab002"] } } }
回页首
安装步骤如下:
进入存放所有 Cookbook 的目录,上传所有 Cookbook 至 Chef Server
knife cookbook upload -a -o .
也可以分别单独上传。
knife cookbook upload rabbitmq-ha -o .
knife environment from file rabbit-ha-env.json
knife bootstrap 192.168.1.10 -x root -P ×××××× -r "recipe[rabbitmq-ha::ha-install]" -E rabbit-ha-env knife bootstrap 192.168.1.11 -x root -P ×××××× -r "recipe[rabbitmq-ha::ha-install], recipe[rabbitmq-ha::ha-setup]" -E rabbit-ha-env
回页首
安装成功后,SSH 登录任意一个 RabbitMQ 节点检查安装状态
rabbitmqctl cluster_status
pcs status
回页首
配置完成后 Pacemaker 集群会自动对各节点 RabbitMQ 的服务运行状态进行监控管理,RabbitMQ 集群负责对外提供消息服务。以下是集群常用管理命令:
crm_standby -U rab001 -v on
crm_standby -U rab001 -v off
service pacemaker restart
rabbitmqctl list_users
rabbitmqctl list_user_permissions rabbituser
rabbitmqctl list_policies
回页首
在大规模的企业应用系统中,负责消息收发的模块往往承担着非常重要的中间角色和非常庞大的处理压力,所以在系统的设计阶段就必须对可能出现的业务瓶颈作出合理的预判,并采取相应的架构设计来适当应对。在所有系统的实际使用阶段,拥有快速可靠地部署稳定、可用、不间断服务的能力,以及适当的自我恢复,无疑是可以影响产品成功与否的关键性因素,所以必须审慎对待。