ZStack--可拓展性的秘密武器1:异步架构

ZStack云计算架构探秘(三): 超强灵活性和可扩展性 在前面探秘一和探秘二中,我们已经分享了ZStack的拓扑结构和如何实现超高可伸缩性的能力。还记得我们在Why ZStack中说的,稳定性和灵活性是IaaS需要解决的两大问题。今天我们就来揭开ZStack超强灵活性的奥秘。 今天的内容非常的丰富,我们先来看一下什么是灵活性。所谓灵活性无非是三个方面:当需要添加新功能的时候简单方便,不拖泥带水;系统升级轻巧无障碍;IaaS云配置想改就改,无需重头搭建 阅读详情

ZStack的架构使得其中99%的任务能被异步执行。基于这点,ZStack中单一的管理节点可以管理几千台物理服务器,上万台虚拟机,处理成千上万个并发任务。

动机

对于管理大量硬件和虚拟机的公有云而言,可拓展性是一个IaaS软件必须解决的关键问题之一。对于一个大概拥有5万台物理服务器的中型数据中心,预计可能有150万台虚拟机,1万名用户。虽然用户开关虚拟机的频率不会像刷朋友圈一样频繁,但是在某一时刻,IaaS系统可能有成千上万个任务要处理,这些任务可能来自API也可能来自内部组件。在糟糕的情况下,用户为了创建一台新的虚拟机可能需要等待一个小时,因为系统同时被5000个任务阻塞,然而线程池仅有1000条线程。

问题

首先,我们非常不赞同一些文章里面描写的关于“一些基础配套设施,尤其是数据库和消息代理(message brokers)限制了IaaS的可拓展性”的观点。首先,对于数据库而言,IaaS软件的数据量相比facebook和twitter而言只能勉强算中小型,facebook和twitter的数据量是万亿级别,IaaS软件只处于百万级别(对于一些非常大型的数据中心),而facebook和twitter依旧坚强的使用Mysql作为他们主要的数据库。其次,对于消息代理而言,ZStack使用的rabbitmq相对Apache Kafka或ZeroMQ是一个中型的消息代理,但是它依然可以维持平均每秒5万条消息的吞吐量,对于IaaS软件内部通信而言这不就足够了么?我们认为足够了。

限制IaaS可拓展性的主要原因在于:任务执行缓慢。IaaS软件上的任务运行非常缓慢,通常一项任务完成需要花费几秒甚至几分钟。所以当整个系统被缓慢的任务填满的时候,新任务的延迟非常大是很正常的。执行缓慢的任务通常是由一个很长的任务路径组成的,比如,创建一个虚拟机,需要经过身份验证服务à调度器à镜像服务à存储服务à网络服务à虚拟机管理程序,每一个服务可能会花费几秒甚至几分钟去引导外部硬件完成一些操作,这极大的延长了任务执行的时间。

同步和异步

传统的IaaS软件使用同步的方式执行任务,他们通常给每一个任务安排一个线程,这个线程只有在之前的任务执行完毕时才会开始执行下一个任务。因为任务执行缓慢,当达到一个任务并发的高峰时,系统会因为线程池容量不足,运行非常缓慢,新来的任务只能被放在队列中等待被执行。

为了解决这个问题,一个直观的想法是提高线程池容量,但是这个想法在实际中是不可行的,即使现代操作系统允许一个应用程序拥有成千上万条线程,没有操作系统可以非常有效率的调度他们。随后有一个想法是把线程分发出去,让不同的操作系统上相似的软件分布式的处理线程,因为每一个软件都有它自己的线程池,这样最终增加了整个系统的线程容量。然而,分发会带来一定的开销,它增加了管理的复杂度,同时集群软件在软件设计层面依旧是一个挑战。最后,IaaS软件自身变成云的瓶颈,而其他的基础设施包括数据库,消息代理和外部的系统(比如成千台物理服务器)都足够去处理更多的并发任务。

ZStack通过异步架构来解决这个问题,如果我们把目光投向IaaS软件和数据中心的设备之间的关系,我们会发现IaaS软件实际上扮演着一个协调者的角色,它负责协调外部系统但并不做任何真正耗时的操作。举个例子,存储系统可以分配磁盘容量,镜像系统可以下载镜像模板,虚拟机管理程序可以创建虚拟机。IaaS软件所做的工作是做决策然后把子任务分配给不同的外部系统。比如,对于KVM,KVM主机需要执行诸如准备磁盘、准备网络、创建虚拟机等子任务。创建一台虚拟机可能需要花费5s,IaaS软件花费时间为0.5s,剩下的4.5s被KVM主机占用,ZStack的异步架构使IaaS管理软件不用等待4.5s,它只需要花费0.5s的时间选择让哪一台主机处理这个任务,然后把任务分派给那个主机。一旦主机完成了它的任务,它将结果通知给IaaS软件。通过异步架构,一个只有100条线程容量的线程池可以处理上千数的并发任务。

ZStack的异步方法

异步操作在计算机科学中是非常常见的操作,异步I/O,AJAX等都是一些众所周知的例子。然而,把所有的业务逻辑都建立在异步操作的基础上,尤其是对于IaaS这种非常典型的集成软件,是存在很多挑战的。

最大的挑战是必须让所有组件都异步,并不只是一部分组件异步。举个例子,如果你在其他服务都是同步的条件下,建立一个异步的存储服务,整个系统性能并不会提升。因为在异步的调用存储服务时,调用的服务自身如果是同步的,那么调用的服务必须等待存储服务完成,才能进行下一步操作,这会使得整个工作流依旧是处于同步状态。

(一个执行业务流程服务的线程同步调用了存储服务,然而存储服务和外部存储系统是异步通信的,因此它依旧需要等到存储服务返回之后,才能往下执行,这里的异步就等同于同步了。)

ZStack的异步架构包含了三个模块:异步消息,异步方法,异步HTTP调用。

在这里插入图片描述

1. 异步消息

ZStack使用rabbitmq作为一个消息总线连接各类服务,当一个服务调用另一个服务时,源服务发送一条消息给目标服务并注册一个回调函数,然后立即返回。一旦目标服务完成了任务,它返回一条消息触发源服务注册的回调函数。代码如下:

AttachNicToVmOnHypervisorMsg amsg = new AttachNicToVmOnHypervisorMsg();

amsg.setVmUuid(self.getUuid());

amsg.setHostUuid(self.getHostUuid());

amsg.setNics(msg.getNics());

bus.makeTargetServiceIdByResourceUuid(amsg, HostConstant.SERVICE_ID, self.getHostUuid());

bus.send(amsg, new CloudBusCallBack(msg) {

@Override

public void run(MessageReply

reply) {

    AttachNicToVmReply

r = new AttachNicToVmReply();

    if (!reply.isSuccess()) {

        r.setError(errf.instantiateErrorCode(VmErrors.ATTACH_NETWORK_ERROR, r.getError()));

    }

    bus.reply(msg, r);

}

});

一个服务也可以同时发送一列消息给其它服务,然后异步的等待回复。

final
ImageInventory inv = ImageInventory.valueOf(ivo);

final List dmsgs =
CollectionUtils.transformToList(msg.getBackupStorageUuids(), new Function<DownloadImageMsg, String>() {

@Override

public DownloadImageMsg

call(String arg) {

DownloadImageMsg dmsg = new DownloadImageMsg(inv);

    dmsg.setBackupStorageUuid(arg);

    bus.makeTargetServiceIdByResourceUuid(dmsg,

BackupStorageConstant.SERVICE_ID, arg);

    return dmsg;

}

});

bus.send(dmsgs, new CloudBusListCallBack(msg) {

@Override

public void run(List<MessageReply> replies) {

    /* do something */

}

}

更甚,以设定的并行度发送一列消息也是可以实现的。也就是说,含有10条消息的消息列表,可以每次发送2条消息,也就是说第3、4条消息可以在第1、2条消息的回复收到后被发送。

final List msgs = new ArrayList(hostsToLoad.size());for (String uuid : hostsToLoad) { ConnectHostMsg connectMsg = new ConnectHostMsg(uuid); connectMsg.setNewAdd(false); connectMsg.setServiceId(serviceId); connectMsg.setStartPingTaskOnFailure(true); msgs.add(connectMsg);} bus.send(msgs, HostGlobalConfig.HOST_LOAD_PARALLELISM_DEGREE.value(Integer.class), new CloudBusSteppingCallback() { @Override public void run(NeedReplyMessage msg, MessageReply reply) { /* do something */ }});

2.异步的方法

服务在ZStack中是一等公民,他们通过异步消息进行通信。在服务的内部,有非常多的组件、插件使用方法调用的方式来进行交互,这种方式也是异步的。

protected void startVm(final
APIStartVmInstanceMsg msg, final SyncTaskChain taskChain) {

startVm(msg, new Completion(taskChain) {

    @Override

    public void success() {

VmInstanceInventory inv = VmInstanceInventory.valueOf(self);

APIStartVmInstanceEvent evt = new APIStartVmInstanceEvent(msg.getId());

        evt.setInventory(inv);

        bus.publish(evt);

taskChain.next();

    }



    @Override

    public void fail(ErrorCode errorCode) {

APIStartVmInstanceEvent evt = new APIStartVmInstanceEvent(msg.getId());

        evt.setErrorCode(errf.instantiateErrorCode(VmErrors.START_ERROR, errorCode));

        bus.publish(evt);

taskChain.next();

    }

});

}

回调函数也可以有返回值:

public void createApplianceVm(ApplianceVmSpec spec, final ReturnValueCompletion completion) { CreateApplianceVmJob job = new CreateApplianceVmJob(); job.setSpec(spec); if (!spec.isSyncCreate()) { job.run(new ReturnValueCompletion(completion) { @Override public void success(Object returnValue) { completion.success((ApplianceVmInventory) returnValue); } @Override public void fail(ErrorCode errorCode) { completion.fail(errorCode); } }); } else { jobf.execute(spec.getName(), OWNER, job, completion, ApplianceVmInventory.class); }}

3.HTTP异步调用

ZStack使用一组agent去管理外部系统,比如:管理KVM主机的agent,管理控制台代理的agent,管理虚拟路由的agent等,这些agents全部都是搭建在Python CherryPy上的轻量级web服务器。因为如果没有HTML5技术,如websockets技术,是没有办法进行双向通信的,ZStack每个请求的HTTP头部嵌入一个回调的URL,因此,在任务完成后,agents可以发送回复给调用者的URL。

RefreshFirewallCmd cmd = new RefreshFirewallCmd();

List tos = new RuleCombiner().merge();

cmd.setRules(tos);

resf.asyncJsonPost(buildUrl(ApplianceVmConstant.REFRESH_FIREWALL_PATH), cmd, new
JsonAsyncRESTCallback(msg, completion) {

@Override

public void fail(ErrorCode err) {

    /* handle failures */

}



@Override

public void success(RefreshFirewallRsp ret) {

    /* do something */

}



@Override

public Class<RefreshFirewallRsp> getReturnClass() {

    return

RefreshFirewallRsp.class;

}

});

通过以上三种方法,ZStack已经建立了一个可以使所有组件都异步进行操作的全局架构。

总结

为了解决由缓慢且并发的任务引起的IaaS软件可拓展性受限的问题,我们演示了ZStack的异步架构。我们使用模拟器进行测试后发现,一个具有1000条线程的ZStack管理节点可以轻松处理创建100万台虚拟机时产生的10000个并发任务。虽然单一管理节点的拓展性已经可以满足大多数云的负载需要,考虑到系统需要高可用性以及承受巨大的负载量(10万个并发任务),我们需要一组管理节点来满足这些需求,如需了解ZStack的无状态服务,请阅读下一篇“ZStack可拓展性秘密武器2:无状态服务”。

zstack(四)zstack架构简介 本篇简单介绍一下zstack的架构设计。现在的zstack加入了一个新的模块woodpecher,用于自动化测试。由于本人对这块没有研究过,这里先不讲这个。 阅读详情

相关推荐

TI CC2652P无线MCU深度解析:多协议、低功耗与高集成设计实战

无线微控制器(MCU)是物联网设备的核心,其选型直接影响产品的功耗、成本和开发周期。其工作原理在于集成处理器、射频和专用协处理器,通过异构计算和动态电源管理实现性能与功耗的平衡。这种设计的技术价值在于能够以单芯片方案替代传统的多芯片组合,大幅简化硬件设计,降低系统复杂性和物料成本。在智能家居、工业传感和资产追踪等应用场景中,此类高集成度无线MCU支持蓝牙、Zigbee等多协议并发,并凭借超低待机功耗满足长续航需求。本文以TI CC2652P为例,深入探讨其动态多协议管理(DMM)和传感器控制器等核心特性,为

weixin_30897079的博客 312

ZStack技术介绍

近年来随着互联网业务的迅速发展以及新兴业务激增,业务数据呈现几何倍数增加,传统服务器+存储的竖井式架构已无法很好满足业务发展需求,分布式、云化技术应运而生。越来越多企业采用虚拟化与云计算技术来构建IT系统,提升IT系统的资源利用率以及缩短业务上线周期。但在应用过程中,企业面临如下挑战:1)系统庞大,管理复杂,运维费用持续走高。2)安装部署复杂,硬件来自多厂商,规划、部署、调优需要丰富的经验支撑。3)多厂商设备,售后支持界面多,解决问题慢。

顺其自然~专栏 3720

详解ZStack 高性能网络方案以及性能对比测试

云轴科技 ZStack 推出了 SR-IOV 方案和高性能网络方案。

zstack_org的博客 1738

从开源到商业:ZStack如何用全异步架构挑战VMware生态霸权?

本文深入探讨了ZStack如何通过全异步架构技术创新挑战VMware在虚拟化市场的霸主地位。ZStack的无状态服务设计、无锁并发模型和进程内微服务架构,使其在性能上大幅超越传统方案,API吞吐量达12,000 QPS,虚拟机启动时间仅3.2秒。文章还对比了ZStack与VMware、阿里云等主流虚拟化平台的性能指标,并展示了其在金融、电商等场景的应用优势。

eee77的博客 750

IaaS开源新项目-ZStack技术架构总览

ZStack 是一个全新的开源 IaaS 软件,吸取OpenStack等前辈的经验,针对各种云的问题重头设计了整套架构,旨在解决IaaS复杂度、稳定性、可伸缩性和灵活性等问题。ZStack 0.6 已经提供了大部分 IaaS 的基本功能,包括:虚拟机管理,存储卷管理,存储卷快照,各种网络服务(DHCP、DNS、SNAT、EIP、PortForward 以及 Security Group)。

Z-Stack体系架构

介绍zigbee协议体系结构,对程序中main函数等的介绍

zstack的优势和特性

ZStack 凭借其轻量、高效和高度模块化的设计,成为私有云和混合云部署的理想选择。尤其适合资源有限、追求快速部署和易用性的场景。虽然社区生态和第三方插件不如OpenStack丰富,但其简洁的架构和强大的性能足以满足大多数企业需求。ZStack 是一款开源的云计算管理平台,专为私有云和混合云环境设计。其核心目标是为企业提供轻量、高效、易用的云基础设施解决方案。

远方雪的专栏 1187

ZigBee介绍及IEEE 802.15.4标准物理层和数据链路层数据字典

ZigBee介绍、IEEE 802.15.4标准物理层和数据链路层的表结构定义

ZStack--可拓展性秘密武器3:无锁架构

很多IaaS软件中的任务需要按照顺序执行,例如,当一个启动虚拟机的任务正在运行时,关闭同一台虚拟机的任务必须等候前面开启虚拟机的任务完成。另一方面,一些任务应该支持并行完成;例如,20个在同一台主机上创建虚拟机的任务可以同时运行。在一个分布式系统中同时实现串行化和细粒度的并行化并不容易,这通常需要借助分布式调度软件。面对挑战,ZStack提出基于队列的无锁架构,使得任务本身可以简单的控制他们的并行...

zstack_org的博客 554

ZStack技术白皮书

分布式文件系统

脑电数据预处理八:基于 ICA 的伪迹去除

摘要: 脑电图(EEG)数据分析中,伪迹(如眼电、心电、肌电)与脑电信号频谱重叠时,独立成分分析(ICA)成为有效工具。ICA通过盲源分离将混合信号分解为统计独立的成分,识别并移除伪迹后重建干净信号。MNE-Python实现步骤包括:数据预处理(滤波、坏导处理)、ICA分解、人工与自动结合识别伪迹成分、剔除后重建数据。实践建议强调人工检查的重要性,避免过度使用ICA,并保存模型以提高效率。该方法显著提升数据质量,为后续分析奠定基础。

qq_32516809的博客 1660

ZStack—可拓展性秘密武器2:无状态的服务

每一个ZStack服务都是无状态的,简单的开启一个富余的服务实例然后使之负载均衡,就能实现服务的高可用和可横向拓展;此外,ZStack把所有服务封装进一个称为管理节点的进程中,使得部署和管理服务变得尤其简单。 动机 在“ZStack的可拓展性秘密武器1:全异步架构”中,我们论述了异步的架构使得单一的ZStack管理节点足以承担大多数云的负载量;然而当用户想要去创建一个高可用的生产环境或处理非常大的...

zstack_org的博客 406

iverilog+GTKwave使用总结

iverilog是一个开源的硬件描述语言(HDL)仿真工具,用于对硬件描述语言(如Verilog)编写的数字电路进行仿真。它可以将Verilog代码编译为仿真模型,并通过仿真运行来验证设计的正确性。iverilog支持IEEE 1364-2005 Verilog语言标准,并提供了丰富的功能,包括对多种Verilog语言特性的支持、模块化设计、测试平台等。它还可以与其他工具(如GTKWave波形查看器)配合使用,以便进行仿真后的波形查看和分析。

争取早日成为硅农 2万+

ZStack 5分钟 | 核心架构设计特点2:无状态的服务

ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它主要面向未来的智能数据中心,通过提供灵活完善的APIs来管理包括计算、存储和网络在内的数据中心资源。用户可以利用ZStack快速构建自己的智能云数据中心,也可以在稳定的ZStack之上搭建灵活的云应用场景,例如VDI(虚拟桌面基础架构)、PaaS(平台即服务)、SaaS(软件即服务)等。 上期5分钟和大家分享了ZStack的核心架...

zstack_org的博客 629

拆解汽车T-Box:从4G模块到MCU,手把手教你理解车联网的‘黑匣子’

本文深入拆解汽车T-Box,揭示其作为车联网‘黑匣子’的核心架构与工作原理。从4G模块、MCU主控到外设接口,详细解析各组件功能及协同机制,并通过实战案例展示故障诊断与性能优化技巧,帮助读者全面理解T-Box在智能汽车中的关键作用。

weixin_30955617的博客 497

偷懒必备:3种方法快速移植MFC界面资源(含.rc文件打不开解决方案)

本文针对MFC桌面应用开发,详细介绍了三种快速移植界面资源的实战方法:直接编辑.rc文件、利用Visual Studio“添加现有项”进行可视化挂载,以及双实例拖拽应急方案。文章重点剖析了.rc文件无法打开的常见问题,提供了通过修复rc.exe等关键文件来根治此问题的解决方案,帮助开发者高效复用资源,规避ID冲突等陷阱。

weixin_28358083的博客 274

ZStack源码剖析:如何在百万行代码中快速迭代

本文首发于泊浮目的专栏:https://segmentfault.com/blog... 前言 ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它主要面向的是未来的智能数据中心,通过提供的API来管理包括计算、存储和网络在内的数据中心的各种资源。跟OpenStack相比,ZStack具有易用、稳定、灵活、超高性能等特点。...

weixin_33895657的博客 290

RK3588 EVB开发板原理图讲解【六】

该原理图展示了eMMC Flash与主控芯片之间的连接关系,以及相关的电源、信号线路和去耦电容等。

weixin_48721556的博客 1183

2.ZStack的伸缩性秘密武器:无状态服务

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34072159的博客 180

YOLOv8剪枝 稀疏训练+slim剪枝测试精度仅掉1.6个点,速度提高10.3fps!

摘要 本文介绍了YOLOv8剪枝方法Slim(Network Slimming),通过L1正则化作用于BN层的缩放因子(γ),自动识别并剪除冗余通道,实现模型轻量化。核心步骤包括:稀疏训练(引入L1正则化)、通道剪枝(按γ阈值裁剪)、微调恢复精度。实验表明,该方法能有效压缩模型大小、减少计算量,且支持通过调整speed_up等超参数控制剪枝强度。移植代码需修改C2F模块以适配剪枝,并配置稀疏训练参数(如reg、sl_epochs)。最终剪枝模型需移除优化器以减小体积,但不支持多卡训练。

FJN110的博客 862

OpenCV计算机视觉实战(3)——计算机图像处理基础

本文全面介绍了计算机视觉和数字图像处理的基础知识。从最基本的像素概念入手,详细讲解了图像在计算机中的表示方式,包括RGB、CMYK等色彩空间的工作原理及其应用场景。还系统分析了常见图像和视频文件格式的特点,梳理了计算机图像处理技术的发展历程,并重点介绍了OpenCV这一强大的开源计算机视觉库的功能与应用领域。

qq_30167691的博客 1743

ZStack的伸缩性秘密武器(三):无锁架构

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34302561的博客 150

Scrapy爬虫之热门网站数据爬取--------第2关

第2关:小说网站玄幻分类第一页小说爬取 任务描述 本关任务:爬目标网页的3本小说保存到本地MySQL数据库,目标网页为全书网玄幻分类首页。 注:考虑到单机(非分布式)爬虫的爬取时间和测试平台的压力,我们不爬更多页数的小说了,可以作为课下作业自己完善。 xpath匹配:循环获取相同标签下的内容 通过网页分析,我们在获取小说的章节名时,发现他们都在标签<DIV class="clearfix dirconone">下的li的a中: 这时,我们可以先把其中所有的li标签先获取到: titles = r

weixin_44949187的博客 2837

ZStack 的伸缩性秘密(第一部分)异步架构

ZStack 核心架构设计使得 99% 的任务异步执行,因此确保了单个的管理节点能够管理十万级的物理服务器,百万级的虚拟机,数万级的并行任务。 架构的创新动力 对于要管理大量的硬件和虚拟机的公有云,伸缩性是IaaS软件要解决的主要问题之一。一个中等规模的数据中心,可能会有50.000台物理服务器,大约1,500,000的虚拟机,举例来说,同时分属于100...

weixin_33754065的博客 221

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: ZStack--进程内的微服务架构
下一篇: ZStack—可拓展性秘密武器2:无状态的服务
普通网友
博客等级 码龄10年 769粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值