近些日子帮了不少用户移植应用到了Windows Azure上,在这个过程中,我发现了用户对于Azure不太好的使用习惯,其原因一是对Azure技术不太了解,二是对Azure所推崇的理念不熟悉。对于公有云或者Azure的新用户来说,学习肯定是有一个过程的,这不是大问题。但是,有些问题必须在真正部署之前搞明白,否则不经意间导致数据丢失、系统停机就得不偿失了
在Azure里面,用户需要区分账号和订阅。账号(live ID)是用来登陆门户的,对应一个自然人。而订阅对应配额、账单和付款信息。这就好比一个人有一个身份证(账号),但可以有多个手机号(每个手机号独立核算)。同一个Azure账号可以拥有多个订阅,每次部署Azure虚拟机或其他服务时,要选择一个订阅。每个订阅有一个主管理员,管理员可以添加其他用户成为该订阅的用户。这些添加的用户就可以共享该订阅资源,适合项目团队开发的场景。订阅的所有用户拥有相同的权限,唯一的区别是只有主管理员可以查阅账务信息。
在门户上,用户也可以过滤掉无关的订阅
由于每个订阅各不相同,因此部署之前弄清这些订阅信息是很必要的:
其中,搞清楚有效期是最重要的。如果订阅过期了,可能会造成所有数据被清空。订阅的具体情况可以在门户上点击链接查看,也可直接访问https://account.windowsazure.com/Subscriptions
点击后,就可以看到订阅的概要信息,包括余额和费用
点击右侧还可以下载详单
Azure上的虚拟机上有两种磁盘,一种是存储在Blob存储上的,一种是存储在虚拟机所在物理机磁盘上的。前一种由于使用了Blob存储,其数据会按照Blob的存储策略在本地存3份,并在异地保持一份镜像,其数据的可用性和可靠性都很高,虚拟机通过网络访问这些Blob存储,不依赖于特定一台物理机。后一种依赖于物理机,如果物理机故障或进行维护,这个存储可能会被清空。显然,如果我们使用虚拟机的时候不分清楚磁盘类型,就会导致数据丢失
Azure不同类型的虚拟机的磁盘类型如下:
千万不要把数据库表文件等重要数据放在临时盘上!
这些临时盘往往空间比较大,完全不用的话有些可惜。另外,临时盘在本地,存取数据要比Blob快。因此,临时盘适合存放一些临时数据,比如裸日志、中间结果、上传下载的缓存等等
那么,如果程序要存储文件到本地,本地系统盘空间又不够,怎么办?
Azure为网站、云服务和虚拟机都提供了免费的负载均衡能力。关于负载均衡我们需要注意的一点就是它对Session的处理。一般来说,传统的负载均衡器有一种叫session粘滞(sticky)的机制,也就是会根据用户的session信息将用户请求转发到固定的一台机器上,这样,如果应用程序在服务器端存储session信息,那么用户与服务器交互就会顺畅,否则,就会发生用户session丢失和应用逻辑异常
在Azure上,云服务和虚拟机的负载均衡器都是纯网络层面的,其均衡机制是轮流将请求发给后端的服务器,不支持session粘滞. 这就要求后台服务器是无状态的,也就是无论将客户请求发给任何一个服务器,都可以得到正确的处理。如果现有的应用是有状态的,那么有两种解决办法:
尽管Azure的架构设计考虑了充分的冗余,但是仍然有可能会停机,这是任何服务都避免不了的。就算是5个9的可用性也会有一个停机的窗口。停机的原因有可能是非人为因素,比如断网、断电、硬件故障等等,也可能是人为计划性的停机维护。因此,作为用户,在部署应用到云平台时,需提前了解可能出现的风险和应对方案。Azure作为一个平台,或者云操作系统,会尽量做到不停机,但这只是平台层面的。从应用角度,用户也要考虑Azure提供的可用性是否能满足业务需求,如果不满足,如何进行设计从而提升应用整体的可用性。在大多数时候,更高的可用性都意为着更高的成本,因此,追求0宕机是不现实的,而Azure也无法实现这一点。开发者必须提前做好准备。
关于Azure的可用性,开发者和运维人员需要提前了解的是:
可见,对于单实例虚拟机,Azure不提供服务承诺。用户如果要部署数据库在虚拟机上,比如Mysql,需要自行配置HA,并把两个VM设定为同一个可用性组,这样Azure会将这两个VM放置到不同的故障域中(例如:不同机架)
另外,用户部署服务时,可以按照使用到的Azure服务画一个逻辑拓扑,如下图。然后逐一分析不同服务的停机对业务可能的影响,接着分析如何应对某个服务的停机或者故障。
此外,通过启用监控报警可以让我们在应用异常时及时得到通知(邮件):http://blog.csdn.net/shaunfang/article/details/9197235#t3
如果要了解云计算架构下高可用性设计的最佳实践,可以参考下文:
防故障:弹性云体系结构的指南
http://msdn.microsoft.com/zh-cn/library/jj853352
Azure高可用和容灾设计
http://msdn.microsoft.com/en-us/library/dn251004.aspx
数据备份是老生常谈了,是运维工作的一个核心。尽管Windows Azure提供了完善的数据存储存储方案,比如一份数据在本地存三份,支持异地数据镜像等,但这只解决了数据物理损坏的问题,而没解决逻辑损坏的问题。比如,维护人员不小心删除了Blob上的文件、程序Bug删除或者修改了数据内容等等。此外,备份的另一个作用是支持容灾。容灾有两个基本概念,分别是RTO和RPO。Azure存储提供的异地镜像能力可以实现30分钟的RPO,但Azure并没有承诺RTO,也就是说,如果Azure的某个站点的存储服务发生故障,其恢复时间可能会比较长,在这段时间内,尽管数据没有丢失,但是我们并没有办法访问数据,包括镜像数据。
下表是Azure中各种数据服务的备份和容灾能力说明:
服务名称 |
本地数据冗余方式 |
本地备份 |
异地数据镜像 |
存储服务 | 3份,Active-Active | 无 | 异步复制到异地,RPO=30分钟,无RTO |
SQL数据库 | 3份,一主两备 | 无(新功能开发中) | 无 |
IaaS虚拟机系统盘和挂接的磁盘 | 仅保留数据,同存储服务 | 无 | 仅保留数据,同存储服务 |
IaaS虚拟机临时盘 | 无 | 无 | 无 |
PaaS云服务、移动服务、网站 | 仅保留发布的软件包、代码 | 无 | 无 |
因此,对云中的数据进行备份还是很有必要的。具体来说,每种数据的备份方式不尽相同。
以上各种数据的备份都是定期进行的,建议编写程序或者脚本,专门找一台虚拟机运行
有一些公司开发了一些运维工具,比如:
cerebrata提供的Azure Management Cmdlets. 该工具提供了命令行工具,可以进行Blob、Table的备份,SQL数据库备份,详见http://www.cerebrata.com/products/azure-management-cmdlets/introduction