本文做者:HelloDeveloperphp
在 2010 年 12 月 18 日第 9 期的百度技术沙龙活动中,咱们请到了百度基础平台部高级软件工程肖伟和新浪SAE 经理丛磊,分别分享了百度和新浪的 App Engine 技术及其应用话题。如今对他们的的分享简单总结以下,并提供相关音视频等资料的下载。前端
百度应用开发引擎linux
在肖伟的演讲中,主要介绍了百度App Engine 的项目内容应用以及和其余公司 App Engine 的不一样之处:算法
通过半年多的推广,百度 App Engine 已经初见成效,虽然项目名字是 Baidu App Engine(BAE),可是和google的GAE内容是彻底不同的,在不少功能上都作了优化,它的定位也是面向企业的云平台服务。它的定义有如下几个方面:数据库
面向开发者的单机环境编程
面向程序执行的分布式环境缓存
面向运维的自动化工具链安全
面向分布式的多语言编程框架服务器
统一管理百度全部分布式资源网络
所以对于 BAE,你们的理解应该是面向网络的操做系统,而不是一个开发平台。肖伟为了说明这个问题拿了 Windows 程序来与百度互联网服务比较,从功能、表明产品、开发工具、开发技巧以及运行环境等方面来进行的阐述,为何把 Baidu App Engine 称做是一个网络操做系统。经过比较,你们也大概了解了,BAE 只是在名字上相似,其实彻底是不同的,百度的产品是解决公司企业问题的云服务。接下来肖伟又开始给你们介绍 BAE 的使用模式和特色:
统一集群、多产品使用 ;每一个产品帐号拥有独立的资源 :CPU、带宽、内存容量、存储容量 等,所以资源能够根据服务热度,动态调整 ;支持传统服务的移植 :直接移植 ;少许修改移植;
在这以后内,肖伟把 BAE 和业界其余云服务平台进行了对比,让你们对其优缺点一目了然:在进行了对比以后,肖伟宏观的陈述了 BAE 的架构:
全部云服务资源化,支持多帐号限额访问
提供管理这些资源的平台
提供用户使用这些资源的程序运行环境
其它辅助工具
以上就是 BAE 的一个简单的架构,用户请求传至 7 层负载以后,就会扔给计算结点,计算结点接到请求就会循序渐进的进行处理。若是机器发生变化,好比发生死机或者你进行扩容,咱们会有一个定位服务器,服务发生变动就会通知到这里,定位服务器再反馈到 7 层负载,而后传给计算结点,你就能找到合适的资源进行处理。
对于定位服务器的定义和功能,肖伟是这样解释的:
管理程序启动的进程组,这些进程有可能在本机,有可能在其余机器上;
管理进程组下每一个进程的状态和配置;
动态监控进程组下进程的变化;
能将进程变化信息实时推送给监听者;
计划提供 DNS 服务。
对计算结点,肖伟也进行了说明:
计算结点是用户进程执行的环境 ;
提供多语言支持 :对于 c 语言就是虚拟机 ,对于 php 就是 php 解释器 ;
提供分布式化支持 :对虚拟机进程和镜像的调度 ,对 php 解释器进程(fastcgi)和 php 代码的调度 。
最后肖伟举例进行说明,首先演示了 PhP 的架构,解释如何伸缩资源和更新代码的细节问题,以及对进程调度粒度还有如何进行不一样服务的进程隔离都作了详细的描述。同时也介绍了分布式数据库、分布式 KV 存储以及消息队列等等其余功能性服务。目前百度的中小型 PhP 网站都是用这个 PhP 框架来作的,而且之前的网站也都挪过来了。但仅是 PhP 框架仍是远远不够的,做为一个搜索引擎公司,怎么把数据分析、大规模计算以及不少不少的 C 语言、Java 等服务统一运维来,天生的分布式化呢,咱们目前展开了如下工做,第一就是支持 linux 老服务迁移 ,第二开发 C 语言分布式开发框架 。
在讲完 PhP 以后,肖伟开始向你们介绍他们是如何对 C 语言进行支持的:
不只是 C 语言框架,就是对纯 C 语言也是支持的。C 服务于 PhP 框架有什么区别呢?就是虚拟机进程取代 fastcgi 进程,即载体取代载体,fastcgi 进程上有 PhP 编译器来运行 PhP,那么虚拟机取代之后也能够运行任何语言。
随后肖伟又列出了两者之间比较的框架并像开始那样对虚拟机框架也进行了演示。并着重解释了虚拟机内的进程通信及其优化。
在最后,肖伟现场回答了你们在新浪微博上以及现场的提问:
BAE 的 PhP 能够写本地目录吗?
咱们的全部文件均可以写本地目录,并且它能够作分布式化,这涉及到运维的策略,有两个方案,第一个是我提供分布式文件系统,经过 VFS 虚拟文件接口把远程磁盘挂载进来,全部人共享这个磁盘的话,PhP 写一个磁盘是能够的,并且也不会由于服务流量的增长而出现瓶颈问题,由于咱们的云存储能够多作副本,而后在前面加分布式缓存就能解决;第二就是一些很是大的数据咱们经过脚本运维的方式解决,不过要是快的话,咱们建议修改之前操做本地数据的 API 改为个人 API,数据咱们帮你导过去。由于写本地的数据很是小,能达到一个 T 就不错了。因此咱们容许写本地目录,并有办法把它同步到其余服务器上去。
Fastcgi 如何解决 PhP 依赖文件调度
是 require once 吗?这个得说清楚,若是是的话,根本不存在依赖的问题,由于咱们的代码是存在云端的,若是发现本地缓存没有这段代码的话,会去发请示网络请求所要代码,并加载到本地。若是有的话就能够直接读,跟实际中的用法没有区别。
BAE 用的是什么虚拟机?
你们若是仔细看的话,虚拟机只是个幌子,它能够是物理机,之因此我说虚拟机,这是有历史缘由的,由于以前提到,并非全部的服务均可以不用修改的迁移过来,只能利用虚拟机把它的资源利用率提升,其实这个方案不只是虚拟机能作的,物理机也能够。
Java 应用是如何分布式化的?
若是是进程的话,能够用我刚才的这套方案,可是要配合 Java 的编程框架;另一个是这样的,好比说 JSP,虽然如今尚未作,可是要是作出来的话,仍是和 fastcgi 同样。咱们如今仍是只作 PhP 和 C 的。PhP 已经完成,C 语言项目正在开展中。
BAE 对开发者开放有没有计划表?
以前的介绍中你们已经看到,BAE 跟其余产品比较有两点不好,一个是安全性,一个是存储度,如今仍是不能推荐给你们用,由于我不相信互联网用户不会搞破坏,只要有人找一个漏洞,个人精力就不能放到继续完善中来,二是不停的解决安全性问题,这对产品的发展没有太大的好处。咱们还准备研发一种技术,可以对机器的进程进行监控,并把监控的进程汇报给定位服务器,若是咱们作了这个技术之后,Java 进程仍是能够作的,可是如今尚未考虑。
深刻SAE云计算架构
新浪的 SAE 技术经理丛磊给咱们分享了的是 SAE 云计算架构的话题。
在以前的一些活动和文章中,已经作过关于新浪 SAE 相关内容的陈述,此次话题在之前一些表面架构介绍的基础上,又有所深刻,进入云服务里面,进行一些更细节具体的介绍。SAE 是新浪在 2009 年 11 月开始研发的国内公有云计算平台,目的是打造一个 Web 服务的运行和运营的平台,一直到如今,SAE 的发展趋势已经达到预期的目标。
今天 SAE 话题的主要内容有 4 个部分:SAE 上的云服务(Cloud Sevice)、RDC( Relational Database Cluster:分布式数据库集群)、MemcacheX(新版分布式缓存)、TaskQueue(异步离线任务队列服务)。
SAE 上的云服务(Cloud Sevice):
SAE 和虚拟主机最大的区别就是它提供了特别多的分布式服务供开发者使用,而虚拟主机是没有的。目前新浪要的服务如下内容:PhP、Stor、MemcacheX、Datebase、RDC、TaskQueue、Cron(分布式定时服务,新浪目前采用了一种比 paxos 级别还要高的算法,目前正在为这种算法申请专利)、DeferredJobs、fetchurl、tmpfs、appconfig、smail、 image、xhprofc 等十几项内容。
接下来丛磊一样给咱们绘出了 SAE 的架构图并介绍了用户代码运行的环境:
首先是一个反向代理(Level7 Reverse Proxy)接应外部请求,经过逻辑上的 Service Router 转发到相应的 Web Service Pools(阿帕奇的进程池)上,而后往外延伸至四个主要服务分类:同步计算云、异步计算云、可持久化存储、非可持久化存储。这四个服务分类最后会统一贯统计中心和日志汇报。
用户代码运行环境 App Sandbox 组成由内到外分别为:User App、PhP Zend、SAE Zend Sandbox、Apache with SAE Appconfig、Http Sever Sandbox、POSIX Environment。
而后接下来在话题分享中,丛磊把 RDC( Relational Database Cluster:分布式数据库集群)、MemcacheX(新版分布式缓存)、TaskQueue(异步离线任务队列服务)这三个重点给你们作了详细的介绍。
RDC( Relational Database Cluster):
是一种面向公有云计算服务的数据集群,它的主要目标或者功能以下:
1.监控百万数量级的 DB,包括心跳检查、主从同步检查、节点负载;
2.管理百万数量级的 DB,包括启动、中止、迁移、重启、切换;
3.被动复制模式的 HA;
4.支持 MySQL5 通信协议,代理层彻底透明,代理损耗低;
5.无状态依赖,自身支持水平扩展;
6.提供用户的 DB 的隔离性,保证总体集群的安全性。
以后,丛磊又向你们介绍了 RDC 与 SQL 在实现上的不一样,并特别指出:
1.RDC 不负责用户数据库的水平扩展,因此水平扩展须要用户本身作分表;
2.RDC 自身提供一主多从的 DB 结构,上层支持读写分离;
3.为了整个数据库平台的安全和可靠,RDC 会根据自身的预判算法预先屏蔽某些 SQL 语句,目前这个预判算法新浪也正在准备申请专利;
4.RDC 强烈建议用户使用正确的 MySQL 调用习惯,对每一个 MySQL 函数判断返回值。
介绍这些以后,丛磊又跟你们分享了 RDC 的结构、用法以及其运行环境要求等。而后进入第二个重点话题介绍—MemcacheX(新版分布式缓存):
MemcacheX 就是新版的分布式缓存。在以往的分布式缓存中,若是用户须要 Memcache 服务,咱们就给开启一个 Memcache 实例,若是发现宕掉以后,就会立刻作一个迁移,这个迁移是没有数据迁移的,直接再从新起来一个,把原来的映射关系转过去。咱们仍然须要把用户的继承放在这里,这就形成了一种资源的浪费。MemcacheX 就考虑到了这一点并作了优化,即 low overhead;
第二个就是 HA 的问题:以前包括新浪内部也有过几回大的运维事故,所以以为 HA 对于开发者来讲更加的重要。在之前的 Memcache 中存在这样的问题:宕掉以后再从新起一个是有问题的,由于从新起的 Memcache 是空的,用户须要时间预热。MemcacheX 中就不存在这样的问题,即时有一两台机器宕掉,但 Memcache 对用户的服务是正常的。
还有一点就是 Connection Protector:这也是根据咱们内部的需求来的,咱们发现并发很是大的时候,因对于 PB 人员的水平不一样的缘由,极有可能会有服务器 Socket 不能及时被关闭。MemcacheX 就增长了主动关闭服务器 Socket 的功能;
最后就是 MemcacheX 增长了 Date dump 的功能,加快用户数据预热时间。
接下来,对 MemcacheX 的结构和用法作了详细说明后,丛磊开始了最后一个分享的重点:就是 TaskQueue(异步离线任务队列服务)。
TaskQueue 就是一个简单的任务离线处理队列,好比说,一个 Web 开发者要给 100 我的或者 1000 我的发微博,你确定不能写一个循环去赋 100 次或者 1000 次发微博。因此把任务放到离线处理的队列里去,让队列离线去处理,能保证页面时正常。它与 Deferredjob 不一样,后者是一个重量级离线任务处理队列。TaskQueue 只是回一个 URL,真正执行的仍是用户的 PhP 代码;Deferredjob 是系统在执行,是一种 C 语言级的代码。
最后,在介绍完 TaskQueue 的结构和用法以后,丛磊向你们透露了下一步 SAE 的计划:
第一个是新的代码部署文件系统:为了更好的提供服务,须要设计具备更高可靠性和一致性的代码部署文件系统。
第二就是无缝迁移:这是一个重点项目,争取把全部用户的 PhP 代码不作任何修改转化直接转换迁移到 SAE 上来。第三个我就很少说了,就是 Key-Value 数据库,也是下一步工做计划之一。
分享结束后丛磊现场回答了参会者经过微博或者直接提出的几个问题:
如何进行代码重构和数据结构的变换?
首先是代码重构,咱们 SAE 已经有版本切换,作代码重构的时候能够切换到一个测试版本,本身去作去,作完以后在合到默认版本里,如今 SAE 都支持。而后说数据结构的更改,我以为可能说的是表的修改,若是是这样,你执行大量数据,好比说 Auto Table,绝对会被拦截掉,可是能够用咱们的 DeferredJobs 来实现。
GD 库中的函数比较耗 cpu,但 SAE 也有 cpu 方面的计费机制,请问 SAE 能支持 PhP 中的 GD 库吗?
如今 SAE 自己在前端并无把 GD 模块编译进去,而是提供了 Image 服务,这是跟咱们的理念同样的,就是说咱们但愿吧 cpu 逆行的服务单独放到一个计算池里去。若是支持 GD 的话可能就会打破这个设计,可是请提问的人放心,咱们立刻就能支持无缝迁移 GD 代码。若是能够的话,这个服务代码明年一月份就能完成。
在两位精彩的分享以后,就是咱们百度技术沙龙的 OpenSpace 环节,在这个环节里你们自由分组积极的参与了相关话题的讨论,并由话题提出人对各自话题小组的讨论进行了分享。
会后,来自凤凰网的资深架构师孙立在他的我的博客里发表了我的对本期百度技术沙龙的总结并分享了本身所在 OpenSpace 话题小组的内容和见解。