OpenStack搭建高可用RabbitMQ集群

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

OpenStack有非常良好的结构设计,各模块之间相互独立,通过API和消息队列来传递信息,这种结构能够很方便的实现规模和功能的扩展,这是云计算平台功能设计的基本出发点。

消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。

为什么需要RabbitMQ集群?

对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。

Ceilometer架构图

在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。

由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有50台左右的物理服务器,日常活跃虚拟机约为500台,共享一个10个节点的GlusterFS集群。

每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。

搭建过程

由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。

1. 安装准备

RabbitMQ节点 IP地址 工作模式 操作系统
rabbitmq-1 192.168.64.87 RAM Ubuntu-12.04-x86_64
rabbitmq-2 192.168.64.88 RAM Ubuntu-12.04-x86_64
rabbitmq-3 192.168.64.89 DISK Ubuntu-12.04-x86_64

集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。

2. 安装RabbitMQ

为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用apt-get进行安装,为了安装最新的RabbitMQ-3.3.0版本,需要修改apt-get的源。首先在每一台机器都执行以下步骤:

# 2.1 在/etc/apt/sources.list中添加
deb http://www.rabbitmq.com/debian/ testing main

# 2.2 添加RabbitMQ public key
wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc# 2.3 更新并安装RabbitMQ
apt-get updateapt-get install rabbitmq-server

经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。

3. 配置RabbitMQ集群

安装完毕之后, 需要在每台执行 :

# 3.1 停止服务service rabbitmq-server stop# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。echo 'MYRABBITMQCLUSTERABC' > /var/lib/rabbitmq/.erlang.cookie#修改文件的用户和用户组chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie#设置文件访问权限chmod 400 /var/lib/rabbitmq/.erlang.cookie# 3.3 启动服务service rabbitmq-server start# 3.4 设置RabbitMQ管理插件/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management# 3.5 关闭app/usr/sbin/rabbitmqctl stop_app# 3.6 重设/usr/sbin/rabbitmqctl reset# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。# RAM/usr/sbin/rabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}# DISK/usr/sbin/rabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}# 3.8 开启app/usr/sbin/rabbitmqctl start_app# 3.9 重启服务service rabbitmq-server restart

4. 添加用户

执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :

# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用# guest账户,所以最好根据应用需要建立自己的账户。因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin']/usr/sbin/rabbitmqctl add_user username userpwd# 4.2 设置用户tags# 前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用rabbitmqctl list_users查看/usr/sbin/rabbitmqctl set_user_tags username usertag# 4.3 设置用户权限# 下面命令的意义是对mgmt_admin用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)/usr/sbin/rabbitmqctl set_permissions -p / mgmt_admin ".*" ".*" ".*"

5. 设置高可用策略

为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。

# 5.1 设置高可用策略/usr/sbin/rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.64.87:15672,用户名web_admin,密码xxxx进行访问。接下来是设置HAProxy。

6. HAProxy安装配置

将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。

# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy

设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:

globallog 127.0.0.1 local0log 127.0.0.1 local1 notice
maxconn 4096user haproxy
group haproxy
daemon

defaultslog global#使用tcp监听模式mode tcp
option tcplog
option dontlognull
retries 3option redispatch
maxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat#haproxy的web管理端口 8888,自行设置bind 0.0.0.0:8888mode http
stats refresh 30s#haproxy web管理url,自行设置stats uri /haproxy_stats
stats realm Haproxy\ Statistics#haproxy web管理用户名密码,自行设置stats auth admin:admin
stats hide-versionlisten rabbitmq 0.0.0.0:5670#监听5670端口,并转发给三个节点的5672端口,采用轮询策略mode tcp
balance roundrobin
server rabbitmq-1 192.168.64.87:5672 check inter 2000 rise 2 fall 3server rabbitmq-2 192.168.64.88:5672 check inter 2000 rise 2 fall 3server rabbitmq-3 192.168.64.89:5672 check inter 2000 rise 2 fall 3
# 6.2 启动haproxy服务/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D

至此,HAProxy设置完毕,可以通过http://192.168.64.87:8888/haproxy_stats, admin:admin访问haproxy的web管理端。还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5672请指明。




本文转自 OpenStack2015 51CTO博客,原文链接:http://blog.51cto.com/andyliu/1900996,如需转载请自行联系原作者
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
3月前
|
消息中间件 存储 算法
一文详解 RocketMQ 如何利用 Raft 进行高可用保障
本文介绍 RocketMQ 如何利用 Raft(一种简单有效的分布式一致性算法)进行高可用的保障,总结了 RocketMQ 与 Raft 的前世今生。可以说 Raft 的设计给 RocketMQ 的高可用注入了非常多的养分,RocketMQ 的共识算法与高可用设计在 2023 年也得到了学术界的认可,被 CCF-A 类学术会议 ASE 23' 录用。
405 10
|
3月前
|
消息中间件 存储 负载均衡
|
3月前
|
消息中间件 存储 负载均衡
"RabbitMQ集群大揭秘!让你的消息传递系统秒变超级英雄,轻松应对亿级并发挑战!"
【8月更文挑战第24天】RabbitMQ是一款基于AMQP的开源消息中间件,以其高可靠性、扩展性和易用性闻名。面对高并发和大数据挑战时,可通过构建集群提升性能。本文深入探讨RabbitMQ集群配置、工作原理,并提供示例代码。集群由多个通过网络连接的节点组成,共享消息队列,确保高可用性和负载均衡。搭建集群需准备多台服务器,安装Erlang和RabbitMQ,并确保节点间通信顺畅。核心步骤包括配置.erlang.cookie文件、使用rabbitmqctl命令加入集群。消息发布至任一节点时,通过集群机制同步至其他节点;消费者可从任一节点获取消息。
43 2
|
3月前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
75 0
|
4月前
|
消息中间件 Prometheus 监控
消息队列 MQ使用问题之如何将旧集群的store目录迁移到新集群
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 API 数据安全/隐私保护
就软件研发问题之RocketMQ ACL 2.0加强集群组件间访问控制的问题如何解决
就软件研发问题之RocketMQ ACL 2.0加强集群组件间访问控制的问题如何解决
|
4月前
|
消息中间件 存储 Java
消息队列 MQ使用问题之如何将RocketMQ中某个集群的topic迁移到另一个集群
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 安全 fastjson
消息队列 MQ使用问题之NameServer集群是什么结构
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
消息中间件 Linux
centos7 yum快速安装rabbitmq服务
centos7 yum快速安装rabbitmq服务
220 0
|
消息中间件 中间件 微服务
RabbitMQ 入门简介及安装
RabbitMQ 入门简介及安装
120 0