AICon全球人工智能与机器学习技术大会周四开幕,点击查看完整日程>> 了解详情
写点什么

有关云架构建设和选型的思考

  • 2014 年 8 月 19 日
  • 本文字数:5210 字

    阅读完需:约 17 分钟

最近在负责公司内部私有云的建设,一直在思考怎么搞云计算,怎么才能够把云架构设计得好一些。本文尽量全面的列出了云架构建设和选型的考量因素。

我们主要从五个层面逐步评估云架构的建设和选型,分别是:

  1. 行业生态
  2. 企业需求
  3. 云计算的能力
  4. 潜在的挑战
  5. 如何建设

一、行业生态

计算机云经过多年的发展,由一开始的概念,慢慢发展成熟并能够推向市场,提供多种多样的服务,市场空间非常之大。

在云的发展过程中,亚马逊经过多年的深耕积累,发展成为了云行业的标杆企业,甚至可以说是建立了云解决方案的标准。之后,Google、IBM、思科、Oracle、HP、Intel、华为等 IT 巨头先后参与进来,在软件和硬件方面提供专门的面向企业的解决方案,纷纷打着云计算、大数据、智能等概念来吸引客户,拓展市场。

另外一方面,基于大数据、存储、云服务等,市场上也先后出现一些创新企业,如 Dropbox、Rackspace,国内的七牛、青云、UnitedStack 等。

当前的 IT 世界有一个常见的现象,就是只要某一个领域有一套成熟的商业软件,就同时也会有一套开源的解决方案,如 Windows 之于 Linux,Google 的 MapReduce、GFS、大表之于 Hadoop 等。在云领域也存在相应的开源解决方案,目前最为著名的有 Openstack 和 Cloudstack。开源行业的领导者 RedHat 此前

在企业操作系统的市场已经做的很好,RHEL 的各个版本在企业级系统市场有相当高的市场份额。现在的 RedHat 特别重视云的发展,并将云操作系统作为未来 10 年的发展战略重点,在最近两年先后收购了 Gluster 以及 Ceph 等存储企业,以壮大自己在云领域的影响力。

随着云领域的发展,市场上也逐渐形成了面向企业提供硬件和软件产品的提供商、面向企业提供服务的提供商、面向市场初创企业提供基础服务的提供商、面向个人提供业务服务的提供商等一系列行业生态。

二、企业需求

需求是什么,也就是 what people need 这个问题。我们所说的 people,即人或者公司实体,该对象的划分并不单纯,可粗浅的从三个角度来进行分类:

从企业角度看:

1)小型企业

小型企业的技术储备不多,人员缺乏,没有独立的 IT 部门,但是在构建自己的 IT 系统过程中需要购置各种产品和服务,包括服务器、网络、CDN 等等,而要完成这样的工作,需要投入大量的人力和财力。通过购买云服务可以更加方便快捷,简单的完成系统的搭建。

2)中型企业

中型企业有一定的规模,需要在信息化、管理方面有所注重,一般内部都设立 IT 部门,但是和小型企业一样,IT 部门大多数都是为了解决自身需求,很难能够有一个完整的解决方案。这样在服务器、网络、CDN、企业管理软件等等的需求还是比较大的。

3)大型企业

大型企业人数规模在万人以上,特别是高新企业,都有一个实力不错的 IT 支撑部门,通过部门就可以完善对企业内部信息化建设。

从企业性质范围来看:

1)传统行业企业

传统行业大多数是以服务业、制造业、生产性企业为主,在 IT 信息化方面相对比较落后,属于重资产行业。

2)互联网企业

互联网行业是基于 IT 作为解决方案的

3)IT 服务企业

以销售软件、硬件、以及技术咨询服务为主的企业。

针对市场中存在的企业、个体等的需求特点,市场上一般对软件服务进行如下分类:

  1. 提供软件的服务,解决企业内部信息化问题,如 ERP 系统、进销存管理系统、人力资源管理系统、行政系统、财务系统等等。(SaaS)
  2. 提供平台服务,解决行业共性问题,将 SaaS 迁移到云端,提供平台类的服务。如淘宝的开放平台、Facebook 的开放平台、基于 Salesforce 的销售系统、云笔记、云盘等。(PaaS)
  3. 提供基础设施服务。基础设施包括软件和硬件方面的,包括存储、虚拟机、网络、防火墙、缓存、负载均衡、数据库等等。(IaaS)

从企业内部人员角色来看:

企业内部,尤其是互联网企业内部,一般将角色分为如下几类:

  1. 开发
  2. 测试
  3. 运维
  4. DBA
  5. 产品
  6. 项目管理人员
  7. 客服
  8. 业务人员(销售、市场、BD、人力资源、行政等等)

不同的角色对于软件服务的需求也是不同的,下图大致描绘了互联网行业各个角色对云平台的需求:

三、云计算的能力

云计算能够解决什么,也就是 what cloud offer 这个问题。目前的云计算在应用中主要提供了以下八个能力:

  1. 封装:将计算能力和软件放在云端,可以减少重复建设,将通用的服务封装起来,达到重用,减少资源的浪费,提高生产效率,并提供成熟的解决方案。在云端,云提供商可以建立软件的标准,提供发布包的方式,用户可以通过软件包的方式进行购买使用,譬如目前开源领域的 Docker。
  2. 安全:云计算将数据和存储,软件逻辑都集中于云端,更能方便的统一构建安全体系,通过 Iptables 实现网络过滤,并在服务端做安全组件实现安全策略,并能够通过海量集群应对 DDOS 攻击等。
  3. 灵活:云计算提供灵活的软件和服务端架构,用户不再需要自己构建应用运行环境,对资源的使用能够按需购买,并能够升级,并自由组合。举例来说:用户可以选用不同的存储方式(mysql、oracle,文件系统,kv 等等)
  4. 性能:通过集群的能力和云端的集成能够提高集群的性能处理,通过专业的云解决提供商,在云端的性能扩展更加方便,技术上更加专业。譬如服务端可以在用户毫不察觉的情况下完成添加机器、存储扩容等操作。
  5. 伸缩能力:在存储和计算能力方面提供弹性的资源管理,能够按需使用,在使用过程中,可以通过动态的添加和减少物理资源,来提高响应能力或节约成本。
  6. 运维:云计算在 IaaS 角度来看,重要的是运维,能够将运维更加集中化管理,并完全智能化,大大降低人力成本
  7. 充分利用物理资源:通过云建设,能够将物理资源进行虚拟化处理,屏蔽物理硬件底层,并能够完成物理资源软化进行逻辑管理和分配调度
  8. 大数据:大数据保存于云端,能够提供数据分析和智能处理

当然,云计算还有很多很多好处,给我们带来很多想像空间和 IT 技术的革命。

公有云与私有云

行业内将云分为“公有云”和“私有云”。在我们之前的需求分析过程中,大致了解了云的需求,“公有云”和“私有云”的差别最大的是需求的差异,因为需求的差异,导致了技术方案和产品决策的差异。

公有云需求上由于用户多种多样,导致需求存在不一样,特别需要更多的定制化,譬如:

  1. 存储个性化 云存储方面大概分为块存储和对象存储,块存储适合于 vm 运行环境,对象存储提供了 KV 的访问方式提供了海量扩展存储文件的能力,用户可以根据自己的需求选择不同的存储方式,选用不同的容量。在存储物理介质方面来说,因为存在不同的物理介质,对性能和安全的要求,可以采用传统的 SATA 硬盘,或者 SSD 存储等。
  2. 内存使用 内存方面,需要提供动态扩展内存的方式,用户能够自由扩展
  3. 网络的定制化 公有云用户需要能够构建自己的内部网络,并能够自动组网
  4. 数据库使用 公有云的用户分属不同的公司团体,各自的技术差异存在,因而有不同的数据库类型,譬如 mysql,sqlserver,oracle 等等。并能够定义存储大小,内存运行大小等等。并提供数据备份、恢复、高可用服务等
  5. 缓存使用 公有云的用户可以选择不同的缓存方式,譬如增加 CDN,采用不同的 KV 缓存方式并选择容量。
  6. 安全问题 公有云对于云的安全和私有云差别较大,私有云大多数在安全问题上不需要公有云那么严格,大多数是内部系统之间的交互

以上仅限于 IaaS 层面的考虑,当然对于公有云来说还有很多细化的个性化需求,例如:数据分析,业务对接服务等等。

四、潜在的挑战

计算机自从诞生以来,一直按照冯. 诺伊曼的体系发展在硬件的基础上的操作系统,也分为网络协议体系的实现、内存管理、文件管理体系等等。大致的抽象图如下:

要建设云,有几个重要的问题需要解决:

  1. 管理问题 云计算的实施首先要解决运维的问题,在云环境下后端是大规模数量的物理节点的集群,对于同时维护数以千计算的计算节点,以及部署结构的复杂,需求的变化,光靠增加人力也难以解决复杂的问题。从而需要构建高效的计算资源管理系统,能够灵活简单的管理运系统,并能够及时的发现问题。
  2. 计费问题 (公有云) 对于公有云而言,因为是面向公众的,必然产生费用的问题,常用的收费方式多种多样,也因为产品的不同而计费方式不同,譬如:网络、存储、cpu、数据库容量等等
  3. 资源隔离问题 云计算运行在云端,是通过虚拟化体系建立的,虚拟化是建立在硬件之上,多个虚拟化资源同时运行于同一节点(host)中,存在着资源的共享争用问题,

这样就存在着资源使用的公平性问题,导致同一 Host 上的资源使用相互影响。为了使得彼此资源使用相互独立,我们要建立相应的隔离机制。资源的隔离包括:存储、内存、cpu、数据库、网络等,其中网络是最难控制的。
4. 安全问题 在云端的应用和基于客户端的安全,面临的环境不一样,客户端方面大多数是病毒问题引起的,而在云端,也存在一些服务器攻击的问题,以及数据相互独立相互影响的问题,以及一些服务端编程的安全问题等。
5. 性能问题 对于云来说,需要保证云端的性能问题,包括 CPU 处理性能,IO 处理能力,资源的就近访问,资源数据同步的速度,还需要解决系统底层的性能问题,包括文件处理 Cache,存储介质的优化,采用 SSD 等,或者采用 SATA+SSD 的混合方式节约资源和降低成本。
6. 存储问题 对于云来说,由于云端是将客户端的数据和运算转移到云端,必须要有足够的存储能力以及足够稳定的存储系统,保证用户数据的安全,对于存储来说,有提供 VM 虚拟机运行环境的 block device(块存储),以及提供 KV 方式的对象访问存储,这些都需要保证数据复制、数据读写访问的性能和数据永久可用的能力
7. 网络问题 对于公有云以及私有云的一些应用场景,需要能够提供网络的逻辑隔离(SDN)或物理隔离,以及对网络的访问灵活问题。构建虚拟化网络,由于物理条件的限制,我们不得不从 L2-L4 层进行处理,我们常用的方式是:bridge,vlan,gre,sdn(openflow,opendaylight),以及一些厂家的产品等等。
8. 高可用问题 高可用问题是在分布式系统中必须要处理的问题,正因为集群的问题,我们必须要从多方面考虑解决的问题,包括保证云管理系统的高可用性,存储介质的高可用性,网络的高可用性,虚拟机高可用问题等等。
9. 提高资源利用率问题 对于物理资源的虚拟化,我们有很多种解决方法,KVM、Vmware、xen、Hyperv、LXC 等等,在 HVM 的方式下,对于 VM 本身的启动需要占用大量的内存、cpu 和存储资源,导致系统内存和 cpu 使用有一定的浪费,基于 LXC 的解决方案因为是机基于 Host OS 进程,通过 namespace 的方式进行隔离的,是一种轻量级的实现,能够在资源初始化,资源利用率方面能够最大化,对于各个应用场景来说,我们可以选用合适的解决方案。

五、如何建设

58 同城经过多年的发展,探索了一条适合自身发展的技术架构体系。随着业务和技术的发展,团队规模不断壮大,在技术和管理上面临越来越多的挑战。在项目需求管理,开发效率、代码管理和质量建设,测试,线上发布,运维管理等方面需要有一套完整的解决方案,来提升公司的协作能力和整体能效。

58 同城目前所有的应用在线上都是跑在物理机器上,采用物理机的方式,一方面会导致服务器资源得不到充分和合理的使用,譬如:有些物理机器 cpu 使用长期在 10% 以下,有些内存使用剩余很多;另外一方面,由于互联网的特点,存在着时段内的访问高峰问题,需要解决资源使用的伸缩问题;基于以上问题,架构部对现有的技术体系进行梳理和分析,采用资源虚拟化的方式进行私有云的建设,并在这基础上,完善公司整体技术体系,包括:开发、测试、上线、运维等一系列自动化和智能化方面的建设。

私有云的目标

  1. 提高物理资源的利用率
  2. 一套云管理系统,降低运维的复杂度,提高运维工作效率
  3. 构建灵活的开发、测试集成环境
  4. 提供海量的存储体系
  5. 建立完善的监控体系
  6. 建立基础应用环境、方便测试
  7. 统一架构
  8. 智能资源调度

实施方案:OpenStack

对于云计算来说,也存在着多种解决方案,如 CloudStack 和 OpenStack 等。在两种方案的比较之后,我们最终选择了 OpenStack 的解决方案。主要是出于以下几点原因:

  1. OpenStack 的社区成熟度:OpenStack 经过几年的发展,社区已经越来越成熟,很多大公司都参与进来帮助完善,红帽公司未来十年也将 OpenStack 作为发展的战略重点。
  2. 架构设计的选择:OpenStack 采用了 Python 语言编写,并且设计上采用组件化的方式,各个组件独立发展,并相互解耦
  3. OpenStack 提供了更加完整成熟的方案,能够满足多样的需求,同时已经有不少公司采用,已经经过生产上的验证
  4. 文档问题:OpenStack 文档化做的不错,网上能够找到多种多样的问题处理办法
  5. 人员招聘问题,经过多年的发展和市场的培育,了解 OpenStack 的人越来越多,对于开发维护的人才建设和招聘相对成熟一些。
  6. 发展比较迅速

下图是我们大致的架构规划

文章观点仅一家之言,欢迎大家一起交流探讨。我计划在下一篇文章《58 同城私有云建设实践》中详细介绍我们私有云建设的思路和过程,中间遇到的问题,希望跟大家一起探讨。


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 8 月 19 日 22:487241

评论

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

ARTS 第 51 周

马克图布

ARTS 打卡计划

语雀性感,印象迟暮。

彭宏豪95

学习 工具 在线办公

高内聚与低耦合

落英亭郎

面向对象 高内聚 低耦合

Golang testing: “no test files”

北纬32°

Go

写给产品经理的信(1):产品经理的经济基础逻辑思维能力

punkboy

产品经理 产品设计 职业规划 逻辑思维 工作

数据产品经理实战-开篇

第519区

产品经理

实战!我用 Wireshark 让你 “看得见“ TCP

小林coding

Linux TCP 计算机网络

科学理论的反思

美多丽可

学习

python 实现·十大排序算法之选择排序(Selection Sort)

南风以南

Python 排序算法

Python 如何随机打乱列表(List)排序

BigYoung

Python List random 随机

分布式数据库

Leiy

Review week1: Amazon的领导力法则

猫吃小怪兽

学习 高效工作 程序员 个人成长

图文并茂讲述如何正确的使用缓存

后端学长

缓存 后端 缓存穿透 缓存击穿 缓存雪崩

怎么用"设计思维"思考产品?

Yanel 说敏捷产品

产品 设计 产品设计 产品开发

传统岗位新挑战:信息安全之路

nexpose

安全架构师 安全 安全管理

程序员的晚餐 | 5 月 21 日 四季豆炒腊肠

清远

美食

你没必要活的那么累

小天同学

深度思考 个人成长 生活 成长 感悟

[从零学习Spring Cloud]Nacos配置中心

玏佾

Spring Cloud nacos

我的事务为什么会失效

JFound

spring

两边夹的应用三

孙苏勇

算法 两边夹

码农理财(二)

北漂码农有话说

Spring注入的对象到底是什么类型

JFound

spring

小岑的架构学习笔记-架构是什么?

程序员小岑

小岑的架构学习笔记-架构设计的历史背景

程序员小岑

要弄清楚if/switch的本质区别,以及优化方式

张驰

Java

乙己说:NUMA是个啥?

再见小飞侠

jdk G1 ZGC 内存

乙己说:LRU实现思路整理

再见小飞侠

Go 缓存 LeetCode

深入浅出SpringMVC系列~

程序员的时光

spring springmvc

Android | Tangram动态页面之路(六)数据分离

哈利迪

android

【迁移】CQRS很难吗?(译文:底部有原文地址)

罗琦

领域驱动设计 DDD

极客时间的三种身份:碎片整合的大师、成长焦虑的救星、工作技能的提升站

大橘栗

数据cool谈(第2期)寻找下一代企业级数据库

数据cool谈(第2期)寻找下一代企业级数据库

有关云架构建设和选型的思考-InfoQ