开发进阶:如何提高云中应用程序的可靠性

阅读更多
摘要: 本文主要探究如何通过采用一个负载均衡器和永久性磁盘使您的应用程序更为健壮。您将使用多个服务器并了解如何安全地备份您的数据。 ...

本系列的 开发教程:如何将Linux应用程序迁移到Amazon云 介绍了如何将一个物理服务器迁移到一个物理云服务器中。尽管所有的工作都已完成,但是,应用程序并没有明显的改善,这主要是因为引入了更多的单点故障。

甚至在单个物理服务器上,您都有冗余电源、错误纠正 RAM、冗余磁盘和丰富的故障前诊断指示器监控。在一个云服务器上,您不知道您已经获取了什么 — 或者更确切地说,您不知道您访问了什么。云服务器通常是可靠的,但是采取预防措施是很明智的,特别是自从 Amazon 提供额外服务来提高可靠性之后。

当部署到一个云计算环境之后,最好做好有可能会丢失一个虚拟实例的准备。这不是说云服务是不可靠的,而是说您可能遇到的故障类型不像您在物理环境中所遇到的。因此您应该将智能性引入您的应用程序,处理通信损耗并在多个服务器之间实现伸缩性。不管您要构建什么类型的环境,这种思想将有助于您构建一个更好的应用程序。

在本文中,您将了解如何使用 Amazon Elastic Block Store (EBS) 改进数据库的短暂存储,您可以通过建立备份进一步提高数据保护功能。跨越多个实例进行负载均衡可防止应用程序服务器丢失,并允许您从各种故障中恢复。

图 1 展示了您上次中断的应用程序的架构。


图 1. 当前架构
开发进阶:如何提高云中应用程序的可靠性_第1张图片 

所有对象都在一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例上。前端 Web 服务器、nginx 、请求多个混合实例的代理或服务器静态文件本身。混合应用程序服务器在同一个主机上访问一个 PostgreSQL 数据库。

配置永久性磁盘

实例存储是 Amazon EC2 与 VMware 和 Xen 等虚拟化技术之间最大的不同。我们知道,一个 Amazon EC2 实例提供一个 10GB 的固定根分区和一个实例磁盘,后者的大小取决于启动的实例的类型。根分区是在启动时从 Amazon Machine Image (AMI) 克隆的,实例存储为空。当您关闭您的服务器时,您的实例存储丢失。

Amazon 的初始位置告诉人们应该频繁地备份他们的服务器到 Amazon Simple Storage Service (Amazon S3)。如果您的服务器崩溃,那么您应该有其他的服务器承受负载,或者您可以从 Amazon S3 获取数据。最终,Amazon 推出了 EBS,这是一个提供永久性磁盘的服务 。如果您的服务器崩溃,您可以将 EBS 卷附加到另一个服务器上。Amazon 甚至构建一个快照来简化备份。

SmallPayroll 应用程序中数据库服务器的主要问题是一个单点故障。有两个常见的方法可以对其进行校正。一个是构建两个能够彼此接管的数据库;另一个是减少潜在停机时间让一切更为合理。第一种方法有最少的停机时间但是较为复杂,第二种方法在这种情况下更为实用。如果数据库服务器崩溃,将启动一个新的实例 替换它。EBS 考虑了数据安全性。从错误发现到启动一个新数据库服务器并重新指向客户机总共用时应该低于 10 分钟。作为一点优势是,EBS 存储比起实例存储有一个较高的 I/O 容量。

EBS 可靠吗?

尽管 EBS 卷连接的实例关闭时该卷仍然存在,但也不能说它是 100% 可靠的解决方案。一个 EBS 卷在一个可用性区域(见 首次建立 EBS)进行复制来防止发生故障,但没有进一步复制。此外,故障可能而且确实会发生。

Amazon 声明 EBS 故障比率取决于卷的大小以及更改的频率。一般来说,对于 Amazon,EBS 卷的可靠性是物理磁盘的 10 倍,这大致上同 RAID 1 镜像的可靠性一样。

幸运的是,EBS 应用程序编程接口(API)提供一种机制,可以将数据快照移动到 Amazon S3。这一功能使您可以对您的卷进行快速的备份并将其存储在 Amazon S3 中,其中数据至少可以跨越 3 个设备进行复制。

要使用 EBS,应该执行以下步骤:

  1. 用 ec2-create-volume 命令创建卷。
  2. 使用 ec2-attach-volume 命令将卷附加到一个正在运行的实例中。
  3. 在卷上创建一个文件系统。
  4. 将文件系统挂载到目录。

首次建立 EBS

建立 EBS 的第一步是通知 Amazon 您想要创建一个卷。您需要知道两件事:您的镜像的大小(千兆字节为单位)和您想要在其中使用镜像的可用性区域。可用性区域 的概念是 Amazon 提出的,用来描述服务器的位置。以 us-east 开始的区域是在北维吉尼亚州,统称为地区。此时,在 us-east 地区有 3 个这样的区域:us-east-1a、us-east-1b 和us-east-1c。每一个可用性区域设计的目的是隔离其他可用性区域中的故障。同一地区的区域彼此仍然很接近,因此它们是低延迟的。

EBS 的一个限制是卷只能挂载到创建它所在的可用性区域中。有办法可以移动它们,但是您必须在同一可用性区域中创建您的卷作为服务器。

运行命令:

ec2-create-volume -s 20 -z us-east-1a

在 us-east-1a 区域创建一个 20GB 的卷。如果您不知道您的服务器在哪,ec2-describe-instances 命令将会告诉您。您可以对 ec2-run-instance 使用 -z 参数来指定您的服务器启动的位置。清单 1 显示了这个命令以及输出。


清单 1. 创建 EBS 卷
				
$ ec2-create-volume -s 20 -z us-east-1a
VOLUME  vol-c8791ca1    20              us-east-1a      creating     
2010-07-01T02:52:52+0000

清单 1 的输出显示了创建的卷以及卷的 ID 为 vol-c8791ca1。了解这一点,您就可以将卷附加到一个正在运行的 Amazon EC2 实例中,前提是您要知道服务器的实例标识符以及将卷作为服务器的设备。运行命令:

ec2-attach-volume vol-c8701ca1 -i i-fd15e097 -d /dev/sdj

将这个最新创建的卷附加到服务器实例 i-fd15e097。记住,您可以通过 ec2-describe-instances 命令找到您的实例标识符,并可使用 ec2-describe-volumes 查看卷列表。

现在,您的虚拟服务器有了一个名为 /dev/sdj 的磁盘,像查看普通磁盘那样查看它。对于任何一个磁盘,您需要在原始磁盘上创建一个文件系统。根据需要,您可以有不同的选择:

  • 创建一个标准第三方可扩展(ext3)文件系统。
  • 创建一个 XFS 文件系统。这样您就可以冻结文件系统来为备份创建一个快照。
  • 在磁盘和文件系统之间建立 Logical Volume Manager (LVM) 层,这样以后您将可以扩展 EBS 卷。
  • 使用 Linux® 软件 RAID 来条带化多个 EBS 卷,将 XFS 或 ext3 放在 RAID 集合的顶部。这将提供更高的磁盘性能。

即使 RAID 和 LVM 提供了有趣的特性,对于一个相对较小的 EBS 卷来说 XFS 也是最简单的选择。您将可以使用 XFS 的冻结特性以及 EBS 快照来进行一致的备份。清单 2 列出了如何创建一个 XFS 文件系统并将其挂载到主机上。


清单 2. 创建和挂载 XFS 文件系统
				
# mkfs.xfs /dev/sdj
meta-data=/dev/sdj               isize=256    agcount=8, agsize=32768 blks
         =                       sectsz=512   attr=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096
log      =internal log           bsize=4096   blocks=2560, version=1
         =                       sectsz=512   sunit=0 blks, lazy-count=0
realtime =none                   extsz=4096   blocks=0, rtextents=0
# mkdir /ebsvol
# mount /dev/sdj /ebsvol

清单 2 运行 mkfs.xfs 命令来格式化 /dev/sdj。(如果没有 mkfs.xfs,命令运行 gem install -y xfsprogs。)该命令的输出描述了文件系统的参数。只要输出中没有错误,这些参数可以忽略。清单 2 中最后两个命令创建一个名为 /ebsvol 的挂载点,然后在挂载点挂载文件系统。

文件系统现在是可用的。即使服务器出现故障,/ebsvol 之下的任何文件都将持续保留。

你可能感兴趣的:(开发进阶:如何提高云中应用程序的可靠性)