本文根据InfoQ中文站跟陈皓(@左耳朵耗子)在2014年3月的一次聊天内容整理而成。在沟通中,陈皓分享了自己对云计算的理解,包括云计算为什么会分三层,实现一个云平台的难点在什么地方,运维之于云计算的重要性,电商云为什么有价值等。
嘉宾简介
陈皓(@左耳朵耗子),CoolShell.cn博主。15年软件开发相关工作经验,8年以上项目和团队管理经验。擅长底层技术架构,团队建设,软件工程,软件研发咨询,以及全球软件团队协作管理。对高性能,高可用性,分布式,高并发,以及大规模数据处理系统有一些经验和心得。喜欢关注底层技术平台和互联网行业应用。技术擅长C/C++/Java和Unix/Linux/Windows。曾于Amazon中国任研发经理,负责电子商务全球化业务(全球开店)和全球库存预测系统的研发。曾在阿里巴巴北京研发中心、商家业务部曾任资深专家一职,负责电商云平台、开放平台,云监控和电商多媒体平台。现在阿里巴巴核心系统专家组从事阿里核心系统和阿里云ECS相关的虚拟化平台的开发工作。
对云计算的定义
云计算其实跟PC机有一样的概念,有CPU、硬盘、操作系统、应用软件。云计算的计算节点(虚拟机)就是PC中的CPU,数据缓存服务就是PC的内存,存储节点就是PC的硬盘,提供数据服务,让数据不丢、高可用,PC中的控制器就是云计算的控制系统。PC机的硬件上面要有操作系统。操作系统很大一块是给开发人员提供系统的API接口,提供系统监控以看运行情况,并且还要有系统管理——如用户账号的权限管理、备份恢复等等。操作系统上面要有应用软件,这样才能服务于最终用户,应用软件就是真正落地的业务,这样才会有用户;有了用户,整个体系就运转起来了。
这就是工程师说的stack,也就是我们听到的IaaS、PaaS、SaaS三个层。IaaS层就像PC机的基础硬件加驱动程序,PaaS层就像PC机上的操作系统——把基础硬件抽象、包起来并屏蔽硬件和硬件驱动细节、调度基础硬件,而SaaS层就是PC机里的应用软件。另外,我们还得给开发人员提供各种开发框架、类库和开发环境,这就是为什么AWS还做通知、消息、工作流,这是用于粘合操作系统和业务层的,比如可以让你方便地做水平扩展和分布式。云计算自然也会像PC机一样,三个层上都会有用于控制和管理的系统。这就是为什么云计算会做成这个样子,其实计算机的发展就在这个圈子里绕。
其实,最终用户基本并不关心你CPU用的啥,存储用的是啥,你用什么框架开发,他们关心更多的是可以解决什么问题,有什么样的用户体验。像以前Windows用户体验之所以比Linux好,就是因为应用层用的舒服;而Linux对开发者的用户体验比Windows好,就是因为其开放和可以让开发人员更灵活、更自由。我们可以看到SaaS层上有的像SalesForce、Dropbox、Evernote、Netflix这样的给最终用户的服务,他们更倾向于最终用户和业务。
说到底,云计算的IaaS、PaaS、SaaS最后那个S都是Service。就是说,无论你云计算长成什么样,都得要向用户提供“服务”而不仅仅是软硬件和各种资源。
云计算的技术难点
到今天,云计算的工业实现已经不太难了。现在有开源软件KVM和Xen,这两个东西基本把虚拟化搞定;而OpenStack则把管理、控制系统搞定,也很成熟。PaaS也有相应的开源,比如OpenShift,而Java里也有N多的中间件框架和技术。另外分布式文件系统GFS/TFS,分布式计算系统Hadoop/Hbase等等,分布式的东西都不神秘了。技术的实现在以前可能是问题,现在不是了。
对于云计算工程方面,现在最难的是运维。管100台、1万台还是100万台机器,那是完全不同的。机器少你可以用人管理,机器多是不可能靠人的。运维系统不属于功能性的东西,用户看不见,所以这是被大家严重低估的东西。只要你做大了,就必然要在运维系统上做文章。数据中心/云计算拼的就是运维能力。
为什么我说运维比较复杂,原因有这么几个。
一方面,云计算要用廉价设备取代那些昂贵的解决方案。所谓互联网的文化就是屌丝文化,屌丝就是便宜,互联网就是要用便宜的东西搭建出高质量的东西,硬件和资源一定不会走高端路线——比如EMC、IBM小型机、SGI超级计算机等等,你如果用它去搭建云计算,成本太贵。用廉价的解决方案代替昂贵的解决方案是整个计算机发展史中到今天唯一不变的事情。所以如果你要让夏利车跑出奔驰车的感觉,你需要自己动手做很多事,搭建一个智能的系统。用廉价的东西做出高质量的东西,运维好廉价的设备其实是云计算工程里最大的挑战。
另一方面,因为你机器多了,然后你用的又不是昂贵的硬件,所以故障就变成了常态,硬盘、主板、网络天天坏。所以,没什么好想的,运维就必须要跟上。云计算的目标是在故障成为常态的情况下保证高可用——也就是我们所说的,你服务的可用性是3个9、4个9还是5个9。
最后,这一大堆机器和设备都放在一起,你的安全就是一个挑战,一方面是Security,另一方面是Safety,保证数十台数百台的设备的安全还好说,但是对于数万数十万台的设计,就没有那么简单了。
所以,面对这样的难题,人是无法搞得定的,你只能依靠技术来管理和运维整个平台。比如必须有监控系统。这跟操作系统一样,对资源的管理,对网络流量、CPU利用率、进程、内存等等的状态肯定要全部收集的。收集整个集群各种节点的状态,是必然每个云计算都有的,都是大同小异的。
然后,你还要找到可用性更好的节点,这需要有一些故障自检的功能。比如阿里云就遇到过磁盘用到一定时候就会莫名其妙的不稳定,有些磁盘的I/O会变慢。变慢的原因有可是硬盘不行了,于是硬盘控制器可能因为CRC校验出错需要要多读几次,这就好比TCP的包传过来,数据出错了,需要重新传。在这种硬盘处理半死不活的状态时,你肯定是需要一个自动检测或自动发现的程序去监控这种事情,当这个磁盘可能不行了,标记成坏磁盘,别用它,到别的磁盘上读复本去。我们要有故障自动检测、预测的措施,才能驱动故障,而不是被动响应故障,用户体验才会好。换句话说,我们需要自动化的、主动的运维。
为了数据的高可用性,你只能使用数据冗余,写多份到不同的节点——工业界标准写三份是安全。然而,你做了冗余,又有数据一致性问题。为了解决冗余带来的一致性问题,才有了paxos的投票玩法,大家投票这个能不能改,于是你就需要一个强大的控制系统来控制这些东西。
另外,公有云人来人往,里面的资源和服务今天用明天不用,有分配有释放,有冻结,你还要搞一个资源管理系统来管理这些资源的生命状态。还有权限管理,就像AWS的IAM一样,如果没有像AWS的IAM权限管理系统,AWS可能会不会像今天这样有很多大的公司来用。企业级的云平台,你需要有企业级的运维和管理能力。