本帖最后由 shengnan007 于 2012-10-15 10:24 编辑
0 y7 j6 c0 W- n% M! I
' d7 H5 f& A' }3 @% H/ | 开篇首先说明一下,这篇文章并非纯原创,而是摘抄自SAE的官方文档和丛磊(新浪)的演讲发言,略加修饰而成。目的在于,方便开发者对于SAE的整体架构有一个初步的认识,同时,也是在做技术架构的调研时,要做的一个基本工作。
G; F* p/ w* u& `
3 Q- f0 j/ m6 H/ W0 R5 {SAE简介
" A3 f I, O, n0 ]. W9 q+ X SAE就是简单高效的分布式Web服务开发、运行平台。 支持的语言:PHP,Java,Python。
+ P3 Y9 V* |1 Y$ P, J2 R6 n1 T SAE的功能 开发: ·代码检查,帮助检查不良函数并帮助移植 ·代码部署 ·分布式数据库 ·分布式文件存储 ·分布式缓存 ·各种附属分布式服务,包括图像、定时、任务队列、邮件、计数器等 ·对接多个开放平台,如新浪微博开发平台 ·团队协作,可以邀请好友以不同的权限加入项目 ·代码版本管理(计划支持) 运营: ·应用打包,通过我们的应用向导进行推广 ·日志,包括访问日志、错误日志等 ·资源报表,消耗SAE各项资源的统计 ·服务监控,监控各项服务状态 ·数据迁移,包括数据库导入、数据库导出等 8 q2 V1 v" @7 j/ F
+ F; | ?0 i, i3 x/ ]( T
SAE提供的服务 服务名称 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 提供临时文件存储,文件生命周期在一个会话内,Http请求结束文件自动消失 | |
' }) e! f4 Q! o& L0 ^6 x
| 提供应用配置功能,取代Apache htaccess | | | | | | | | | | | | | | | 在线代码编辑器,编辑的代码保存后入自动入SVN并部署到Web服务器 |
6 O1 m8 e6 d7 W+ j8 o1 f4 J) L
整体架构 SAE从架构上采用分层设计,从上往下分别为反向代理层、路由逻辑层、Web计算服务池。而从Web计算服务层延伸出SAE附属的分布式计算型服务和分布式存储型服务,具体又分成同步计算型服务、异步计算型服务、持久化存储服务、非持久化存储服务,后边会详细讲述。各种服务统一向日志和统计中心汇报,参考下图:* l* C$ g9 m3 a# o" @2 h
4 p* Y- \. f+ R ~+ a9 y0 Z0 ^+ a+ { x# `3 d5 k4 H6 ]
SAE整体架构图 # g- @# u, i! n$ ? t1 ]0 }
/ z$ \* M) e( y. u1 N
7层反向代理层(Reverse Proxy):HTTP反向代理,在最外层,负责响应用户的HTTP请求,分析请求,并转发到后端的Web服务池上,并提供负载均衡、健康检查等功能。 服务路由层(Service Router):逻辑层,负责根据请求的唯一标识,快速的映射(O(1)时间复杂度)到相应的Web服务池,并映射到相应的硬件路径。如果发现映射关系不存在或者错误,则给出相应的错误提示。该层对用户隐藏了很多具体地址信息,使开发者无需关心服务的内部实际分配情况。 Web服务池(WebService Pools):由一些不同特性的Web服务池组成。每个Web服务池实际是由一组Apache Server组成的,这些池按照不同的服务策略提供不同级别的服务。这些Web服务池的服务进程处理用户的HTTP请求,进程运行在HTTP服务沙盒内,同时还内嵌同样运行在SAE沙盒内的解析引擎。用户的代码最终通过接口调用各种服务。 日志和统计中心:统计中心负责对用户所使用的所有服务的配额进行统计和资源计费,这里的配额有两种,一种是分钟配额,用来保证整个平台的稳定;一种是天配额,用户可以给自己设定每天资源消耗的最高上限。日志中心负责将用户所有服务的日志汇总并备份,并提供检索查询服务。 各种分布式服务:SAE提供覆盖Web应用开发主要方面的多种服务,用户可以通过StdLib(可以理解为SAE PHP版的STL)很方便的调用它们。同时因为Web服务的多样性,SAE的标准服务不可能满足所有场景的需求,所以SAE可以对接第三方服务(如分词、全文检索等),SAE的使用者们可以直接使用对接到SAE中的第三方服务。 下图是程辉在讲解SAE的时候所用到的架构图,图中把Reverse Proxy层和Service Router层合并为App Router层,不过这和SAE的官方架构图并不冲突。同时,图中提到了DynamicDNS,SAE的Dynamic DNS,提供了多线路支持和智能解析,使用户访问速度更快。
7 Y% @# {0 ? V W, v; z! v. G6 X
# z% [! P( y! B v2 W6 g, i8 J- s
* Y+ r' h$ t' l' V3 C
SAE架构图-程辉版 / g0 |: d" `( T" T) C# p
7 l; ^& U) ?! k
SAE在解释自己的架构的扩展性的时候,在文档中的说法如下。 静态扩展,用户和资源有强绑定关系。最典型的例子为亚马逊的EC2和Ruby云计算平台Heroku,用户申请的资源和用户有严格的一对一关系,换句话说,A用户申请的虚拟机在A退还资源前,B用户不能使用,哪怕A用户的虚拟机处于闲置状态。 动态扩展,用户和资源没有强绑定关系。最典型的例子为Google App Engine,用户申请的资源和用户没有严格的一对一关系,换句话说,处理A用户请求的进程在处理完之后,可以马上处理B用户的请求。 在SAE平台上,采用了以动态扩展为主,静态扩展为辅的兼而有之的设计。在Web计算池层,是典型的动态扩展,没有一个用户独占Web服务进程,而是所有用户以共享的方式使用Web服务进程,通过Cache,热的用户自然在缓存层占据更多的位置。而在SAE的某些服务中,扩展性又是以静态扩展的方式展现,如RDC(Relational DB Cluster)分布式数据库集群,当用户申请了MySQL服务,SAE就会在RDC后端创建DB给用户,在用户显式的删除该DB前,该DB都不会被别人使用。当然,通过RDC,任何一个用户也无需知道后端DB的实际地址,只需访问RDC统一的host和port即可。 SAE的安全性
+ R& Q6 v* g' ~: p* x" V9 b$ ^8 t
- A8 z; V5 |/ j8 K防火墙和Runtime SandBox 4 ~9 `2 ~! h) C; k
* u! o }0 Q- P0 y. k/ h" ]; }
6 e' P$ [- U* J; ~ ?8 a3 X; c7 S8 B5 [3 }
SAE沙盒结构图
/ h9 G# h7 ?" o3 i! `. B; h/ a! c. |: ^5 T0 e
SAE设计多层沙盒来保证用户应用之间的隔离性。 ; ~! l) ^2 y3 F; v; z Q, n3 u
最内层的就是用户代码,大部分PHP代码不需要做任何修改就可以跑在SAE平台上。小部分代码需要做一些修改以适应SAE的平台特性。比如,SAE因为安全性禁用了本地IO,所以fwrite等函数需要修改为使用TmpFD读写本地临时文件或者直接通过Storage服务读写分布式文件存储。 PHP Zend为标准的PHP官方解释器,目前采用的版本为5.3。 SAE Zend Sandbox为用户的代码运行提供良好的隔离性。这里有两个层面,1,是通过标准的php.ini,SAE设定了一些特殊配置和禁用函数;2,为了达到一些php.ini无法实现的沙盒功能,对Zend解释器核做了一些改进,以便通过用户标识将资源进行隔离。另外还把一些SAE的特定服务也在Zend层做了融合。 Apache为标准的Apache Web Server,目前版本为2.2。不过SAE禁用了htaccess,并提供了自己实现的替换方案AppConfig。 HTTP Server沙盒为Apache的安全可靠运行提供了多种保护功能,比如防止某个用户恶意占用连接数从而导致整个Web服务不正常。 最外层的是标准POSIX环境。 参考资料:
# @' |: s$ D5 r/ N5 J" {+ u2 E/ ]1 ?$ i' l4 P) D! I: p7 d
|