正式定档!QCon 北京站改期为2024年4月11-13日,地点:北京·国测国际会议会展中心 >>> 了解详情
写点什么

分布式健康检查:实现 OpenStack 计算节点高可用

  • 2015-12-28
  • 本文字数:3728 字

    阅读完需:约 12 分钟

一、问题的背景

所谓计算节点高可用,是指在计算节点发生硬件故障,如磁盘损坏、CPU 温度过高导致宕机、物理网络故障时,自动将该节点关闭,并让其上的虚拟机在剩下的健康节点上重启,如果可能,最好执行动态迁移。本文是在今年OpenStack 东京峰会上分享的计算节点高可用话题的整理。

OpenStack 最初定位面向公有云,没有考虑计算节点的高可用问题。理想情况下,在公有云上运行的应用有自己的集群和负载均衡,能在一定程度上容忍计算节点宕机带来的不可用,并能自动迁移负载。随着 OpenStack 的成熟,越来越多的企业客户开始在自己的私有云里采用 OpenStack,将企业部署在虚拟化平台上的应用迁移到私有云中,计算节点高可用的特性需求越发迫切。但社区只提供了一些配合外部监控服务一起工作的机制,并没有提供完整的解决方案。因此厂家都可以根据自己的客户特点设计和部署自己的高可用方案。

在中国的虚拟化市场上,主流虚拟化平台都提供计算节点的高可用功能,以保证计算节点不可用时,虚拟机能迁移到其他计算节点。很多企业应用因此十分依赖于计算节点的高可用,缺乏计算节点高可用已经成为企业实施 OpenStack 的一个障碍。

二、社区的状态

OpenStack 社区也意识到了这个问题,但是计算节点高可用的具体机制和策略与客户的 IT 基础设施环境、需求高度相关,所以社区并没有在 OpenStack 本身提供计算节点高可用。按照社区的构想,计算节点高可用由一个外部的系统实现,可以是 Pacemaker 或者 Zookeeper。在 Liberty 中,OpenStack 实现、改进了 Nova 的 API,以便更好的配合外部高可用系统实现对 Nova 服务状态的改变和对虚拟机的漂移。

我们考察了 Pacemaker 和 Zookeeper,这两个项目都是成熟的集群编排软件。其中红帽的 RDO 提供了基于 Pacemaker-remote 实现的高可用方案。社区里也有基于 Zookeeper 实现的 Nova-compute 的服务状态监控。但通过研究我们认为这两个项目都不适用于计算节点高可用的实现。

我们先来看一个典型的 OpenStack 部署架构。

在上面的 OpenStack 集群中,包含 3 个控制节点,3 个计算节点,同时还部署了 Ceph 分布式存储作为 Cinder 的后端存储。控制节点和计算节点之间使用管理网互联,虚拟机全部从 Cinder Volume 启动,运行在 Ceph 存储上。虚拟机访问 Ceph 存储时,使用存储网。虚拟机之间通信,使用租户网。虚拟机和外网通信,先使用租户网连接到控制节点,控制节点再 NAT 到外网。

首先无论是 Pacemaker-remote 还是 Zookeeper,监控计算节点状态时,使用的是服务器和计算节点之间互传心跳的方式。而默认的心跳网只有一个,通常部署在管理网上。这会导致两个问题,首先管理网断网会影响到 Nova 的控制面。用户无法再在有问题的节点上开启、关闭虚拟机,但虚拟机的存储、业务网依然完好。但 Pacemaker 在节点心跳网失效的默认动作是远程关闭物理机电源,这反而会导致虚拟机的业务中断。再者,如果心跳只运行在管理网上,那么存储网或者租户网故障时,通常检查不到,会错失迁移的良机。虽然可以在 Pacemaker 里配制多个心跳网络,但是多个心跳网络的状态并不能暴露给上层的监控服务使用。在 Zookeeper 里虽然可以通过变通的方式加多个心跳网,但是 Zookeeper 并没有内置对计算节点其他业务的检测和监控的支持,需要用户自己实现。对于这两个项目,也都存在一些扩展性问题。一般 Pacemaker 和 Zookeeper 的服务器的数量是 3~5 个,但是 OpenStack 集群中计算节点的数量可能是非常多的,计算节点的心跳会汇聚在少数几台服务器上。

三、分布式健康检查

我们基于 Consul 提出了一套分布式的健康检查的方案。Consul 是一个在容器和微服务技术圈子里比较有名的项目,主要的功能是提供服务注册和发现、配制变更。但是 Consul 不仅可以做这些,它还提供了一个分布式的键值存储服务,支持分布式锁和领导节点的选举,并提供了事件的触发和订阅功能。Consul 比较有趣的是其管理的集群规模可达数千个节点。Consul 的集群拓扑结构如下图。

通常一个 Consul 集群会部署 3~5 个服务节点,其上的 Consul Agent 使用服务器模式运行,被管节点上的 Consul Agent 以普通模式运行。Consul 的服务节点之间,使用 Raft 协议,实现一个强一致的集群,并实现了一个键值数据库。在一个 Consul 服务节点上成功存储的数据,马上可以从其他的 Consul 节点上读出来。在节点间维护状态强一致的成本比较高,因此 Consul 的服务节点数不会很多。

Consul 的普通 Agent 在每台计算节点上运行,可以在每个 Agent 上添加一些健康检查的动作,Agent 会周期性的运行这些动作。用户可以添加脚本或者请求一个 URL 链接。一旦有健康检查报告失败,Agent 就把这个事件上报给服务器节点。用户可以在服务器节点上订阅健康检查事件,并处理这些报错消息。

在所有的 Consul Agent 之间(包括服务器模式和普通模式)运行着 Gossip 协议。服务器节点和普通 Agent 都会加入这个 Gossip 集群,收发 Gossip 消息。每隔一段时间,每个节点都会随机选择几个节点发送 Gossip 消息,其他节点会再次随机选择其他几个节点接力发送消息。这样一段时间过后,整个集群都能收到这条消息。示意图如下。

乍看上去觉得这种发送方式的效率很低,但在数学上已有论文论证过其可行性,并且 Gossip 协议已经是 P2P 网络中比较成熟的协议了。大家可以查看 Gossip 的介绍,里面有一个模拟器,可以告诉你消息在集群里传播需要的时间和带宽。Gossip 协议的最大的好处是,即使集群节点的数量增加,每个节点的负载也不会增加很多,几乎是恒定的。这就允许 Consul 管理的集群规模能横向扩展到数千个节点。

Consul 的每个 Agent 会利用 Gossip 协议互相检查在线状态,本质上是节点之间互 Ping,分担了服务器节点的心跳压力。如果有节点掉线,不用服务器节点检查,其他普通节点会发现,然后用 Gossip 广播给整个集群。具体的机制可以参考这里

四、监控服务

利用Consul 的这些特性,我们设计的分布式健康检查的架构如下图。

我们分别在管理、存储、租户网络上运行三个独立的Consul 集群。所有的节点都运行三个Consul Agent,分别接入管理、存储、租户网的集群。控制节点的Consul Agent 运行于服务器模式,计算节点的Consul Agent 运行于普通模式。

由于分布式Ping 机制的存在,Consul 服务器节点上几乎没有什么负载,但是我们可以随时从任何一台服务器节点上的三个Consul Agent 上分别取出每个计算节点在每个服务网络上的在线信息,并汇总。

我们在所有控制节点上都运行着一个监控服务,三个监控服务的实例使用Consul 提供的分布式锁机制选举出一个领导。被选举成领导的监控服务实例实际执行高可用事件的处理,其他的监控服务实例热备待机。这样我们保证任意一台控制节点宕机,不会影响监控服务的运行。同时,我们的监控服务还监视本控制节点在每个业务网上的在线状态。假如某个控制节点的存储网掉线,从这个控制节点的存储网Agent 得到的信息将是所有其他节点在存储网掉线,集群成员只剩自己。这个结果显然是不可信的。在这种情况下,监控服务会主动释放出集群锁,让领导角色漂移到其他节点上。

对检测到的每个计算节点的在线状态和健康检查指标,我们的监控服务会检查一个矩阵,矩阵综合考虑了各个指标综合作用下,异常情况的处理办法。示例矩阵如下图。

根据示例矩阵的第一行,如果某计算节点只有管理网掉线,只需要向管理员发送邮件,不应该对虚拟机做操作,否则会影响用户的应用。

矩阵的第二行的意思是,如果某计算节点存储网掉线,即使其他网络状态健康,我们运行在Ceph 之上的虚拟机可能已经崩溃,并且该计算节点也不可能再成功运行新的虚拟机。这时我们应该做的是把计算节点隔离出集群、关机,并将其上的虚拟机“驱散”到其他健康的计算节点上。

对于不同的OpenStack 部署模式和用户的需求,这个矩阵的内容可以是不同的,我们需要针对每个具体的OpenStack 环境配置这个矩阵。

五、对Nova 的改进

在Nova 方面,Liberty 版本引入一个新的API “os-services/force-down”。Nova 默认的服务监控状态只监控管理网,并且监控的周期比较长。引入这个API 后,外部监控服务通过其他的方式(譬如分布式Ping)监控到计算节点异常后,可以直接调用这个API,将计算节点的服务状态标记为“forced_down: true”。这样的好处是,不用等Nova 发现自己的计算节点服务掉线,就可以直接“驱散”虚拟机。

另外,Liberty 之前,调用Evacuate API 时需要指定一个目的主机,作为“驱散”虚拟机的目的计算节点。对于外部的监控服务来说,指定一个目的主机很不方便,无从得知所有计算节点的资源使用情况,而且也可能违反Nova 的调度策略。因此在Liberty 中,对Nova 的这个API 进行了改进,可以不指定目的主机,而是由Nova 的调度器自行决定应该将虚拟机“驱散”到哪些计算节点上。

关于作者

周征晟,任职于北京海云捷迅科技有限公司,负责自动化部署方面的开发和支持。

联系邮箱:zhengsheng@awcloud.com


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-28 17:025955

评论

发布
暂无评论
发现更多内容

天下谁人不识君:当IPv6+成为千行百业的朋友

脑极体

未来计算图鉴:十年后的计算长什么模样?

脑极体

Go 语言入门很简单:Go 计时器

宇宙之一粟

Go 语言 计时器 4月月更

[版本更新] PolarDB-X on OSS 提供冷热数据分离存储

阿里云数据库开源

数据库 阿里云 开源 PolarDB-X

企评家|为什么说我们需要企业成长性评价

企评家

一份送给IT工程师们的礼物,观测云2022正式发布!

观测云

Flink快速入门

星期35

架构设计之「入口统一」原则

凌晞

架构 软件设计原则

国内做得好的进销存软件有哪些啊?

优秀

进销存管理系统

模块四:作业

本人法海

「架构实战营」

Java工程师面试题汇总,全会月薪至少3W

Java架构追梦

Java 程序员 后端开发

太卷了! 八股文、算法张口就来?2022版Java面试手册帮你轻松拿下

Java架构追梦

Java 程序员 后端开发

[Day30]-[二叉树]第二小的值

方勇(gopher)

LeetCode 数据结构和算法

基于边缘计算 Client-Edge-Server 业务模型实践

火山引擎边缘云

边缘计算 实时音视频 端边云协同架构

企评家|上海海欣集团股份有限公司成长性报告简述

企评家

分布式系统学习资料汇总

木鸟杂记

分布式 分布式系统 资料 资料整理 公开课

渗透实战之内网渗透流程

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

OpenHarmony硬件资源池化架构介绍

科技汇

千万级学生系统考试试卷存储架构设计

Trent

架构训练营 存储架构

元宇宙里开豪车

CECBC

Java面试通关秘籍:笔记导图+面试文档+视频讲解

Java架构追梦

Java 程序员 后端开发

一文带你看懂ATM的应用权限访问控制能力

科技汇

庚戌篇 集識創世紀《「內元宇宙」聯載》

因田木

五識 神通

PerfDog赋能手机芯片行业,提升游戏性能用户体验

WeTest

聚焦分布式云+FinOps,腾讯云发布多款容器新品助推企业降本增效

科技热闻

企评家|宁波富达股份有限公司成长性报告简述

企评家

元宇宙的本质特征是五大融合

CECBC

模块四作业(试卷存储方案)

Dean.Zhang

架构实战营 第 6 期 模块四课后作业

火钳刘明

#架构实战营 「架构实战营」

5G+实时云渲染,让元宇宙应用触手可及

3DCAT实时渲染

5G 虚拟仿真 元宇宙 实时渲染 实时云渲染

对话九阳股份信息总监刘大勇:企业数智化转型关键要素

大咖说

阿里云 智篆商业 九阳 数智化转型

分布式健康检查:实现OpenStack计算节点高可用_社区_周征晟_InfoQ精选文章