应用云平台的可用性——从新浪SAE看云平台设计
云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。
该内容已经被标记书签!
标记书签错误,请重试!

作者 李光磊 发布于 2009年7月9日
软件开发过程中常常需要搭建各种环境:开发环境、测试环境,集成构建环境等等。一个不可复制的环境是低效的根源,它引起的常见问题比如:
这些问题的原因以及解决方案,在最新出版《The Productive Programmer》(卓有成效的程序员)中,Neal Ford给出了详细的介绍。我们列举几种细化的方案,作为书中提到的“间接”、“规范性”等原则的实践。
试图解决的问题:环境的各个部分散落在不同角落,不是少了这个就是少了那个,或不同机器上版本不一样;环境配置依赖全局环境变量或属性,硬编码的绝对路径等。
目标:机器环境虽然各有各的不同,但依然有可能创建一个“环境无关的环境”。
关键是如何获得当前路径,如何确定根路径,如何确保目录结构。
%cd%和$PWD%~dp0%获得脚本所在路径pwd”,即获得pwd命令的输出this_dir = $(shell pwd)%cd%和%~dp0%的区别:
%cd%是脚本运行时的当前工作路径,与脚本所在位置无关%~dp0%则相反,是脚本所在路径,与运行时的工作路径无关举例来说,有如下内容的D:\project\run.bat:
echo %cd% echo %~dp0%
如果在D:\盘根目录下运行project\run.bat,则输出如下
D:\>project\run.bat D:\ D:\project\
一般来说%~dp0%比%cd%更常用
下面是一个环境无关的makefile的例子(只列出了变量定义部分):
PROJ_ROOT=$(shell pwd) INCLUDE += $(PROJ_ROOT)/include LIB += $(PROJ_ROOT)/lib
当然也可以根本不定义变量表示当前路径,而直接以相对路径的形式引用子目录,和通过“..”来引用父目录及兄弟目录,然而显式的变量定义提供了一层间接,你可以通过多种方式覆盖它的缺省值,从而适应不同的环境。参见后面的“缺省值 + 用户自定义属性”。
如果总是需要引用某个根路径的话,则可以使用环境变量来定义根路径(参见后面的环境变量)。其实相对路径配合固定的目录结构,大大削减了对显式定义根路径的需求。
前面makefile的例子可以改写如下:
ifeq "$(origin PROJ_ROOT)" "undefined"
PROJ_ROOT = You_should_firstly_specify_$${PROJ_ROOT}_in_your_environment_or_by_command_line
endif
INCLUDE += $(PROJ_ROOT)/include
LIB += $(PROJ_ROOT)/lib
保证目录结构的固定,自然是使用配置管理系统。
这是一个“规范性”或者“标准化”的问题。配置管理系统不只是放源代码的,只要有配置管理需求或配置管理能带来好处,或需要有唯一的官方来源,都可以使用配置管理系统来管理;环境的配置文件,环境本身,都可以置入配置管理之下。有些公司的版本控制系统只放源代码,连测试代码都分开另放,耗费很多精力来维护源代码之外的文档。
这里有几个常见的问题:
/etc目录下:这个文件还是可以放在配置管理下的目录中,而在/etc下创建符号链接来指向它;并提供脚本来干这件事。必要时使用环境变量来引用环境。全局的环境变量可用作缺省值,在脚本中覆盖它(基本上,这是“用户自定义属性”的一个实例)。
这是创建“环境无关的环境”的核心机制。无论如何,环境要在不同机器上部署,总会需要修改某些配置,以适应宿主机器。然而前面我们提到,所有配置都已置入版本控制。如果我们直接修改,则每个环境中都会存在未提交的本地修改。这是我们不希望看到的,因为当我们升级配置并更新到所有部署时,可能会产生冲突。这里其实是两个层面的问题:
先说第一个。
缺省值当然可以直接定义在脚本或配置文件中。而多数常用的脚本和配置系统都提供了用户定义属性覆盖缺省值的机制。比如:
set path=my_extra_path;%path%export PATH=my_extra_path:$PATH<property file="user.properties"/> <!-- user.properties 中可定义任何后面引用到的属性,以覆盖其缺省值--><property name="src.dir" path="${basedir}" /> <!-- 定义"src.dir"的缺省值--><property name="src.dir" value="." /> <!-- 定义"src.dir"的缺省值--><property file="user.properties"/> <!-- user.properties 中可定义任何后面引用到的属性,以覆盖其缺省值-->PROJ_ROOT:make PROJ_ROOT=/home/mike/project再说第二个。
有一个很简单的解决办法,就是把用户自定义属性置入单独的文件,并且不要把它提交到版本控制系统中(一个理由是这一部分相对整个组织来说,不存在也不需要唯一的官方来源)
前面例子中的user.properties就是一个用户自定义属性文件,只存在每个用户自己的机器上,不在配置库中。在Windows和Bash脚本中也可以类似处理:
Windows: call user_env.batBash: source ./user_env.sh或 . ./user_env.sh随之而来的一个问题是,这个用户相关的文件应该放在何处。这里其实约定好就可以了,比如当前路径,根路径,甚至user的home路径都可以。
李光磊,软件工程师,同时还是一位敏捷教练,就职于ThoughtWorks。他还是活跃的blog作者,了解他最新的想法,请访问http://blog.csdn.net/chelsea。
[ ThoughtWorks实践集锦(1)] 我和敏捷团队的五个约定。
[ ThoughtWorks实践集锦(2)] 如何在敏捷开发中做好数据迁移。
[ ThoughtWorks实践集锦(3)] RichClient/RIA原则与实践(上)、(下)。
[ ThoughtWorks实践集锦(4)] 为什么我们要放弃Subversion。
[ ThoughtWorks实践集锦(5)] “持续集成”也需要重构。
[ ThoughtWorks实践集锦(6)] Mock不是测试的银弹。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。
云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。
淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011。
2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。
12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011。
篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011。
本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。
随着JDK 7的发布,字节码指令集终于迎来了第一位新成员——invokedynamic指令。这条新增加的指令是JDK 7实现“动态类型语言(Dynamically Typed Language)”支持而进行的改进之一,也是为JDK 8可以顺利实现Lambda表达式做技术准备。在这篇文章中,我们将去了解JDK 7这项新特性的出现前因后果和它的意义。
随着互联网应用的发展,Java分布式远程服务技术受到越来越多的关注,本文将对各种相关实现以示例的形式逐一介绍,并总结其中的优缺点,使读者能够在技术选型时有所准备。这是文章的下篇。
4 条回复
关注此讨论 回复