节点设备太多、设备利用率太低、 应用设备间迁移太困难、存储需求增长得太快……应用的发展,推动了IT基础架构的发展,特别是承载着云计算与大数据应用的规模化数据中心的发展,需要面临的挑战实在太多了。于是虚拟化技术重新回到大众视野中。
图:软件定义的计算演进
在计算机发展的早期(20世纪60年代),虚拟化技术其实就已经出现了,当时是为了能够充分利用昂贵的大型主机的计算资源。数十年后,虚拟化技术再一次变成人们重点关注的对象,依然跟提高资源的利用效率有密不可分的关系。而且这次虚拟化技术不仅在计算节点上被广泛应用,相同的概念被很好地复制到了存储、网络、安全等与计算相关的方方面面。
虚拟化的本质是将一种资源或能力,以软件的形式从具体的设备中抽象出来,并作为服务提供给用户。当这种思想应用到计算节点(计算资源),资源被以软件的形式(各种虚拟机从物理机器中抽象出来),按需分配给用户使用。虚拟化思想应用于存储时,数据的保存和读写是一种资源,而对数据的备份、迁移、优化等控制功能是另一种资源,这些资源被各种软件抽象出来,通过编程接口(API)或用户界面提供给用户使用。网络的虚拟化同样是这样,数据传输的能力作为一种资源,被网络虚拟化软件划分成互相隔离的虚拟网络,提供诸如OpenFlow这样的通用接口给用户使用。
当服务器被软件虚拟化(需要澄清一点:虚拟化有软件与硬件两大类,但是硬件的复杂度过高、灵活度太差,虽然性能更优,但是随着通用硬件的遵循摩尔定律说观察和预言的那样持续快速发展,市场毫不犹豫地选择了软件虚拟化。另外,硬件虚拟化究其本质是对软件虚拟化功能的固化!)之后,计算能力就可以真正做到“按需分配”,而不是必须给每种服务“按业务分配”物理的机器。
过去的IT管理员当然也希望能够做到“按需”而不是“按业务”分配,但是没有虚拟化隔离技术(见图3-18),没有人会愿意冒风险把可能互相影响的系统放在同一台服务器上。而在软件虚拟化实现的场景下,虚拟机可以把在同一台物理设备上部署的多个应用、服务甚至异构的操作系统进行很好的isolation(分隔、隔离,容器计算技术在隔离上仍旧没有VM技术成熟,但是解决这一问题只是个时间问题)。
值得一提的是,存储也通过软件被虚拟化了。用户不用再去关心买了什么磁盘阵列,每个阵列到底能够承载多少业务,因为他们看到的将是一个统一管理的资源池,资源池中的存储按照容量、响应时间、吞吐能力、可靠性等指标被分成了若干个等级。系统管理员可以“按需”从各个资源池中分配和回收资源。虚拟的网络可以“按需”增减和配置,而不需要动手去配置网络设备和连线。能做到这一步,就能够解决以下问题:
·资源的利用效率低下,不能充分利用硬件的能力;
· 资源的分配缺乏弹性,不能根据运行情况调整部署;
·在提供基础设施服务时,必须考虑不同硬件的性能;
· 需要改变配置时,不得不重新连线和做硬件配置的调整。
需要特别注意的是,在虚拟化这一概念中,利用软件来抽象可用的资源这一点尤为重要,因为这样才能实现资源与具体的硬件分离(Decouple)。这也是软件定义的一切(Software Defined Everything)—软件定义的数据中心(SDDC)、软件定义的网络(SDN)、软件定义的存储(SDS)这些技术与实践的由来。
当主要的资源都已经虚拟化了,只是实现了“软件定义”的第一步。这是因为虚拟化在解决大量现有问题的同时,也带来一些新的挑战。
虚拟化使得资源管理的对象发生了变化,变得更为复杂(Added Complexity)。传统的数据中心资源管理以硬件为核心,所有的系统和流程根据硬件使用的生命周期来制定。当资源虚拟化之后,系统管理员不仅需要管理原有的硬件环境,而且新增加了虚拟对象的管理。虚拟对象的管理兼有软件和硬件管理的特性(也就是说系统的复杂性从一层变为二层)。从用户的使用体验来说,虚拟对象更像硬件设备,例如服务器、磁盘、网络等;而从具体的实现形式、计费、收费来说,虚拟对象却是在软件的范畴里。为了适应这种改变,资源管理要能够将虚拟对象与硬件环境,甚至更上层的业务结合起来,统一管理。
虚拟化使得资源的划分更细致(Finer Granularity),不仅带来了管理方式上的挑战,被管理对象的数量也上升了至少一个数量级。原本一台服务器作为单独一个管理单位,现在虚拟机变成了计算的基本管理单位。随着多核技术的发展,如今非常普通的一台物理服务器可以有2~4颗CPU,每颗CPU上有8个物理计算核心(Core),每个计算核心借助超线程技术可以运行2个线程,因而也可以被认为是2个vCPU。因此,一台物理服务器之上,往往可以轻松运行15~30个虚拟机实例。
存储的例子更加明显,传统的存储设备为物理机器提供服务,假设每台机器分配2个LUN作为块存储设备,如今在虚拟化了之后需要分配的LUN也需要变成原来的几十倍。不仅如此,因为存储虚拟化带来的资源集中管理,释放了许多原来不能满足的存储需求,因此跨设备的存储资源分配也变成了现实。这使得存储资源的管理对象数量更加庞大。
网络因为软件虚拟化而生成的数量呢?恐怕不用赘述了。想想看为什么大家不能满足于VLAN,而要转向VxLAN吧。一个很重要的因素是VLAN tag对虚拟网络有数量的限制,4,096个网络都已经不够了。要管理数量巨大的虚拟对象,仅仅依靠一两张电子表格是完全应付不了的。连传统的管理软件也无法满足要求。例如,某知名IT管理软件在浏览器页面导航栏中有一项功能,以列表的方式列出所有服务器的摘要信息。在被用于虚拟化环境时,由于虚拟服务器数量过多导致浏览器无法及时响应。
虚拟环境带来的另一个新挑战是安全(Security Challenge)。这里既有新瓶装老酒的经典问题,也有虚拟化特有的安全挑战。应用运行在虚拟机上和运行在物理服务器上都会面临同样的攻击,操作系统和应用程序的漏洞依然需要用传统的方式来解决。好在应用如果在虚拟机上崩溃了,不会影响物理服务器上其他应用继续工作。从这点来看,虚拟化确实提高了应用的安全性。虚拟化的一个重要特点是多用户、多租户都可以共享资源(Multi-Tenancy,多租户),无论是计算、存储、网络,共享带来的好处显而易见,也带来了可能互相影响的安全隐患。例如,在同一台物理服务器上的虚拟机真的完全不会互相影响吗?AWS公有云服务商就出现过某些用户运行计算量非常大的应用,而导致同一台物理机器上的其他虚拟机用户响应缓慢的情况。容器计算则因为潜在的安全、隔离隐患而让很多企业顿足不前。存储的安全性就更关键了,如果你在一个虚拟存储卷上存放了公司的财务报表(有些条目可能会让你吃官司),即使你已经想尽办法删除了数据,你还是会担心如果这个卷被分配给一个有能力恢复被删除数据的人。
由此可见,仅仅将资源虚拟化,只是解决问题的第一步。对虚拟对象的管理是迫切需要完成的任务。新的资源管理和安全并不只是着眼于物理设备,而是把重点放在管理虚拟对象(虚拟对象与物理实体对象之间的关系可以灵活定义,既可能是一台物理设备上面拆分出的多个虚拟设备或服务,也可能是多个物理设备合并构成一个虚拟的组件,Google Spanner中的全球数据中心就是由几个Universe来构成的),使虚拟环境能够真正被系统管理员和用户所接受。
当虚拟资源各就各位了,管理员动动鼠标就能够安全分配、访问、回收任何计算、存储、网络资源的时候,数据中心已经可以算得上是完全被软件接管了。可是这并不意味着软件定义的基础架构,如,数据中心已经能够发挥最大的作用了。因为资源虽然已经虚拟化了,纳入统一管理的资源池了,可以随需调用了,但是什么时候需要什么样的资源还是要依靠人来判断,部署一项业务到底需要哪些资源还是停留在参考、比对技术文档的层面。数据中心的资源确实已经有软件来定义如何发挥作用了,但是数据中心的运行流程还是没有根本的改变。以部署MySQL数据库为例,假如你需要2个计算节点,3个LUN(存储卷)和1个虚拟网络,知道了这些还远远不够,在一个安全有保证的虚拟化环境中,管理员要部署这样一个数据库实例需要完成下图所示的5步流程。
图:数据库部署流程示意图
在这整个过程中,如果需要部署的流程并不需要特殊的参数,而是可以用预设值工作,甚至可以做到真正的“一键部署”,那么做到了这一步,软件定义的架构已经可以显示出强大的优势了。不仅仅资源的利用可以做到按需分配,分配之后如何配置成用户熟悉的服务也能够自动完成了。
如果你需要的是几台虚拟机,现在已经能够轻松做到了;如果你需要的是同时分配虚拟机、存储和网络,现在也能够做到了;如果你还需要把这些资源包装成一个数据库服务,现在也只需要动动手指就能完成了。程序员们应该已经非常满足了,管理员也完全有理由沾沾自喜一下子。毕竟,之前要汗流浃背重复劳动几天的工作,现在弹指间就全部搞定了。可是对于那些要使用成熟应用(SaaS)的终端用户来说,这和以前没有什么区别。例如,等着CRM(Customer Relation Management)系统上线的客户,并不真正在意如何分配了资源(IaaS),如何建立了数据库(PaaS),唯一能让他们感到满意的是能够登录进入CRM系统(SaaS),可以开始使用这个系统管理客户关系。
要解决这个问题,让应用真正能面对客户,可以有几种方法。在这个阶段,数据中心的资源已经不是单纯跟资源管理者有关系了,而是与用户的应用程序产生了交集。建立应用程序的运行环境,必须视应用本身的特性而定,方法有三,见下表:
· 第一种方法是借鉴了自动部署数据库的流程,将其扩展到部署用户的应用,同样还是利用自动化的流程控制来配置用户程序。
· 第二种方法是部署一套PaaS的框架(平台即服务),将用户程序继承并运行在PaaS之上。
·第三种方法是让用户自己设计自动部署的方法,是否集成到数据中心的管理环境中则视情况而定。
每种方法都有其适用的场景,不能一概而论。但应用的自动化部署这一步是数据中心的基础架构面向用户的不可或缺的一步。如果说之前的虚拟化、资源管理、安全设置、自动化流程控制都还是数据中心的管理员关心的话题,那部署应用这一步才是真正贴近用户,直接满足用户的业务需求。在成功部署了应用之后,软件定义的架构(数据中心)才算是真正自下向上完整地建立起来了。
如下图所示,软件定义的数据中心是一个从硬件到应用的完整框架,用户的需求永远是技术发展的原动力。软件定义的数据中心也不例外。软件定义的计算(或称计算虚拟化)作为一种既成熟又新颖的技术,成为解决困局的突破口。随之而来的是软件定义的存储和网络技术。在资源的虚拟化已经完成之后,在虚拟环境中的安全与管理需求变成了第二波创新的主题。在这之后,数据中心的自动化流程控制进一步释放了软件定义技术所蕴含的潜在威力,让管理员能够不踏足机房就能调配成千上万的虚拟机配置成数据库、文件服务、活动目录等服务,甚至可以更进一步,自动部署成熟的用户程序,提供给用户使用。
软件定义的数据中心是应用户需求而发展的,但是并不是一蹴而就地满足了用户初始的需求—“非不为也,实不能也”。软件定义的数据中心是一项庞大的系统工程,基础如果不稳固,仓促提供服务会带来严重的后果。云计算服务就是个很好的例子。云计算服务的后端无疑需要强大的软件定义的数据中心做支撑。国内有多家“学习”AWS的企业,本着“一手抓学习,一手抓运营”的精神,在技术并不成熟的情况下,过度强调运营的重要性仓促上马云计算服务,但是计算的稳定性、存储的可靠性、网络的可用性都暴露出了许多问题,用户体验实在无法让人满意。
当然,并不是任何一个软件定义的数据中心都需要完全如上文所述,搭建从硬件到用户的完整框架,而且也不是所有可以称为软件定义数据中心的计算环境都具备上文所述的所有功能。一切还是应用说了算。例如,用户仅仅需要虚拟桌面服务,可能并不需要复杂的虚拟网络,但是安全和自动控制流程要特别加强;用户需要大规模可扩展的存储做数据分析,那软件定义存储将扮演更重要的角色,计算虚拟化就可以弱化一些。一切以满足用户需求为前提,这是软件定义一切的发展的动力和目标。
·END·