云基础设施扩展策略与亚马逊Web服务命令参考
1. 主动扩展管理
设计良好的主动扩展系统能让你根据应用需求的预期变化来安排容量调整。使用主动扩展时,要了解预期的标准偏差,也就是大致清楚正常流量与预期的偏离程度。例如,预计中午左右网站每小时有1000次页面浏览量,而实际看到1100次,这可能并非意外情况。
任何时间点的容量都应能处理预期容量的上限,并留有一定余量。资源的最有效利用是接近其容量,但这样安排在预期错误时会产生问题,即便结合被动扩展也是如此。理解“余量”构成可能是容量规划中最困难的部分。
2. 被动扩展管理
被动扩展是一把双刃剑,它能让你快速应对意外需求,但如果完全依赖它来管理Web应用而不进行容量规划,可能会陷入困境。
2.1 基于利用率的被动扩展及其问题
最粗糙的被动扩展形式是基于利用率的,即当CPU、RAM或其他资源达到一定利用率时,就向环境中添加更多该资源。这种方式对监控系统来说逻辑简单,但实际中只有部分情况适用,以下是一些可能失败的例子:
-
I/O受限的数据库服务器
:应用服务器处理量增加,但数据库服务器I/O受限,导致数据库服务器负载进一步加重。
-
攻击情况
:攻击者会耗尽你投入的任何资源,导致不断尝试启动新资源,成本飙升。
-
意外的流量高峰
:Web活动意外激增,虽对基础设施造成压力,但对终端用户体验影响较小。监控系统仅因感知到负载就启动新实例,而你知道活动会平息。
2.2 监控系统与限制设置
好的监控系统会提供工具来缓解被动扩展的潜在问题,但目前还没有系统能完美处理最后一种情况,这需要对问题领域和活动模式有深入理解。
无论监控系统如何定义被动扩展规则,都应设置限制器。限制器可限制监控系统自动启动的资源数量,从而控制成本。例如,在基础设施遭受攻击时,达到限制器上限后系统会停止,但不会在云环境中疯狂添加实例而浪费金钱。
2.3 亚马逊S3和AWS API的影响
亚马逊S3和AWS API的可靠性问题会影响主动和被动扩展,对被动扩展的影响更大。如果依赖被动扩展确保资源充足,亚马逊S3出现问题会破坏你的计划,导致系统失败。
3. 推荐方法
不太喜欢过度依赖被动扩展,但它有其用途。更倾向于根据预期需求进行主动扩展,包括预留大约是预期需求与最高预期需求差值一到两倍的额外容量(约为预期需求的三到五个标准偏差)。这样设置后,被动扩展几乎不会启动。
当出现意外需求时,不使用被动扩展来处理,而是利用它为人们争取时间来反应和评估情况。通常将限制器设置为基线配置的150% - 200%。例如,基线配置有两个应用服务器,应用通过添加两个服务器可扩展到基线容量的200%,则将限制器设置为最多添加两个服务器,并在需要添加一个服务器之前提前通知。
这样使用被动扩展,基础设施能在一定程度上自动应对意外需求,同时也有时间检查意外活动,决定是否提高限制器、更改基线配置或忽略该事件。由于不接近容量运行且不依赖被动扩展维持运行,亚马逊S3故障不太可能产生影响。
无论具体数字如何,都应有一个批准的预算,使应用能在峰值容量下运行足够长的时间,以便批准增加预算。如果预算仅针对预期容量,而运行达到限制器上限,财务部门可能会不满。
4. 垂直扩展
之前主要关注水平扩展(通过添加新服务器实现),而垂直扩展是用更强大或更专业的服务器替换现有服务器。所有虚拟化环境,尤其是云环境,在水平扩展方面表现出色,但在垂直扩展方面有优点也有缺点。
4.1 云垂直扩展的优缺点
云在垂直扩展方面的优势在于能轻松尝试较小或不太专业的配置,并让系统证明是否需要更多配置。不过,云(尤其是亚马逊云)在提供专业系统配置方面表现不佳。例如,亚马逊目前仅提供五种不同的系统选择,如果应用组件需要的RAM超过其中一个实例的支持,就无法满足需求。相比之下,GoGrid提供更高程度的定制,包括设计高I/O配置的能力,但都无法与通过戴尔配置器配置非常专业的系统相媲美。
4.2 从小开始扩展
构建应用时,可从亚马逊的中型实例开始,迫使应用证明需要大型或超大型实例。大型实例成本是中型实例的四倍,如果将应用分布在四个中型应用服务器上能获得与一个大型实例相同的性能,那么使用中型实例更好,因为这样既能保证可用性又能保证性能,而大型实例仅能提供性能。
4.3 垂直扩展的有效性
在亚马逊云中,当需要更多RAM时,垂直扩展最为有效。例如,某些基于Valtira平台的应用,大多数系统部署在该平台上不需要大量RAM(1 - 2GB通常就足够),但一些利用特定组件的应用需要更多RAM。由于Valtira会在集群中的所有服务器上复制内存占用,添加更多服务器无济于事,而更换为RAM更多的服务器则能解决问题。
4.4 垂直扩展示例
垂直扩展还能帮助解决其他容量限制问题。以下是一个理论应用对不同扩展方式的响应示例:
| 配置 | 容量 | 成本 |
| ---- | ---- | ---- |
| 八个亚马逊中型实例 | 每分钟8000次页面浏览量 | 每小时0.80美元 |
| 两个亚马逊大型实例 | 每分钟10000次页面浏览量 | 每小时0.80美元 |
| 一个亚马逊超大型实例 | 每分钟10000次页面浏览量 | 每小时0.80美元 |
假设水平扩展是线性的,将基础设施从八个中型实例切换到两个大型实例比添加第九个中型实例更合理。虽然这个例子过于简化,但说明有时垂直扩展在经济上更划算。
4.5 垂直动态扩展步骤
垂直动态扩展比水平扩展更复杂,它是水平扩展的一种特殊情况,需要以下步骤:
1. 向云中添加更强大系统的实例,就像进行水平扩展一样,只是使用更大的机器实例而非现有基础设施实例的副本。
2. 等待新实例开始响应请求。
3. 从系统中移除一个或多个旧的小型实例。
将水平扩展和垂直扩展结合起来,能使基础设施最有效地利用计算资源。
5. 亚马逊Web服务命令参考
5.1 亚马逊Web服务访问方式
亚马逊Web服务主要通过SOAP和REST Web服务访问,在此基础上构建了更高级的命令行和特定语言的API。
5.2 亚马逊EC2命令行参考
亚马逊EC2命令行工具是Web服务API的包装器,命令行、其参数与同名且参数相似的API调用基本一一对应。每个命令的一般形式为:
command [GENERAL OPTIONS] [COMMAND OPTIONS]
例如,启动EC2实例的命令如下:
ec2-run-instances -v ami-123456 -g dmz
其中,
-v
是指定详细输出的通用选项,
ami - 123456
和
-g dmz
是特定于命令的选项。
5.3 通用选项
通用选项如下:
-
-
:从标准输入获取命令参数。
-
-C certificate
:用于向亚马逊验证Web服务请求的证书,此值会覆盖环境变量
EC2_CERT
。
-
--connection-timeout
:指定SOAP连接超时时间(秒)。
-
--debug
:打印调试信息。
-
--headers
:显示列标题。
-
--help
:打印有关命令的帮助信息。
-
-K privatekey
:用于向亚马逊验证Web服务请求的私钥,此值会覆盖环境变量
EC2_PRIVATE_KEY
。
-
--region region
:指定命令应用的区域。
-
--request-timeout
:指定SOAP请求超时时间(秒)。
-
--show-empty-fields
:将命令响应中的空列显示为
(nil)
。
-
-U url
:指定进行API调用的亚马逊Web服务URL,此选项会覆盖
EC2_URL
环境变量。
-
-v
:表示需要详细输出,详细输出会显示SOAP请求和响应。
5.4 部分具体命令
5.4.1 ec2 - add - group
ec2-add-group groupname -d description
向亚马逊EC2环境中添加新的安全组。提供的组名用于在其他命令中标识该组,描述信息是为了帮助你记住组的用途。新组默认不允许外部访问其中的实例,需要调用
ec2 - authorize
才能使流量路由到该组中的实例。
示例:
$ ec2-add-group mydmz -d DMZ
GROUP mydmz DMZ
5.4.2 ec2 - add - keypair
ec2-add-keypair keyname
创建新的RSA 2048位加密密钥对。创建密钥时指定的名称用于在其他命令或EC2 Web服务API中引用该密钥。该命令将公钥存储在亚马逊,并将私钥显示到标准输出,你应安全存储私钥,以便使用该密钥对启动的实例进行访问。
示例:
$ ec2-add-keypair georgekey
KEYPAIR georgekey 2e:82:bb:91:ca:51:22:e1:1a:84:c8:19:db:7c:8b:ad:f9:5e:27:3e
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAkot9/09tIy5FJSh0X5vLGCu3so5Q4qG7cU/MBm45c4EVFtMDpU1VpAQi1vn9
r7hr5kLr+ido1d1eBmCkRkHuyhfviJmH1FTOWm6JBhfOsOgDU0pInyQOP0nRFLx4eyJfYsiK/mUm
hiYC9Q6VnePjMUiHSahOL95C8ndAFBlUAuMDDrXMhLypOGRuWkJo+xtlVdisKjlOT0l33q3VSeT6
NBmZwymWOguGWgKWMpzpDLhV9jhDhZgaZmGUKP0wPQqdV6psA9PuStN1LJkhWVYuQTqH9UUolvJn
ZXx5yE2CSpPW+8zMb4/xUuweBQ6grw8O3IxhKWbFCpGGhkpk5BB+MQIDAQABAoIBAQCIs6U6mA4X
5l7MFdvRIFSpXIbFAutDLlnbjvOlAAeJzt0saHWbKvP7x3v0jElxNRk6OC1HMqIh9plyW46Cl5i4
XvGsvIOvt9izFS+vRmAiOJx5gu8RvSGpOiPXMyU0wFC4ppi6TQNN2oGhthQtsFrMK3tAY8dj8fMD
mehll2b+NPZRWPp9frm3QtwLIOMeWm1ntknCVSjBqj21XRg3UPbE8r8ISlSGryqJBA0KjnOj+cMN
2SBx8iC+BHxD9xSUvXs4hVjUpQofzd+8BAZbsXswj+/ybuq1GlNwzpUKKEfH1rN3TZztywN5Z9Hb
EbkOtgRYi/2htSpbuDq5b/cTaxIRAoGBAOLRgfZhEwnGQvveMOhRLLko1D8kGVHP6KCwlYiNow07
G8FkP6U3wcUrsCTtvOFB/79FeWVT+o7v25D34cYFtGbfnp3Zh9bdTBi18PbIHQHvD4tIAIF+4PcO
XMRsJCrzhChOLY1G/laMi5EKFcx6RU8Pjup92YbEbi/fkybcrmS9AoGBAKVmGI5PV00A10LQkTov
CnLuyfAPL9s8w6eOy+9WMRd8+27tI6H8yGuEdsF9X9bOJQsnTM3+A+RC8ylVXWPgiflbcpbPsZ8a
HVuTg37D/iFpl42RzrMtzhgLCahvNotirNyAYnklBsOlmtsQdJSJ0GPpv4SOloSoPT+jbP4ONUiF
AoGAWU48aZHXOSYDAcB+aTps7YqR5zqDbZ767SoZ9mYuKOt5BjA+jwLhHI0TEbc5g0fFNr5YCfmC
0fzG6tFu59UfLtIlVelsfsErUR9x/PjV0wkZibGT4Wjfkubox738j5zKEESX0uR9B/7WhQj/hD8w
QuzRTKq4l0OITvksq0SAtdECgYAqpr1GVWdp0AGylR4eJutG4BTq9r+chXrexpAIU+2s5OnhnP1H
VGxKbYpCMxZ3ygj7a1L++7X9MtaJnh3LF6f8yXwvL7faE13ms4+BLQFnlFckhqkKw5EV2iLPcH5c
S0HQSrsaClZINXhNbVziwPcgDLL6d9qQsuG4e2gry3YqEQKBgFHqE4UJCOd5WiAG0N0cYDTF/wh6
iujW5tY90F63xAn2B236DGE+8o2wGwU77u59LO7jyx4WyR8TpcorL79zZuzm0Vjn9nslAu7tkS6O
wmdEM0O2LrGnKGydSdRF50NH8Tgb060txh+hWyWtvkP0tSOZyGu1z7S7JS0ZPX42Arm8
-----END RSA PRIVATE KEY-----
5.4.3 ec2 - allocate - address
ec2-allocate-address
分配一个新的亚马逊弹性IP地址并打印出来。分配的地址仅可供你使用,可根据需要分配给实例。亚马逊会对弹性IP地址的未使用情况和过度重新分配收费。
示例:
$ ec2-allocate-address
ADDRESS 67.202.55.255
5.4.4 ec2 - associate - address
ec2-associate-address -i instanceid ipaddress
将通过
ec2 - allocate - address
获取的地址与正在运行的EC2实例关联。该命令还会解除该IP地址的现有关联,因此除非有意重新分配,否则不要意外使用此方法。
示例:
$ ec2-associate-address -i i-12b3ff6a 67.202.55.255
ADDRESS 67.202.55.255 i-12b3ff6a
5.4.5 ec2 - attach - volume
ec2-attach-volume volumeid -i instanceid -d device
将现有的弹性块存储卷附加到正在运行的EC2实例,并将其作为指定设备暴露给实例。正确的设备名称因平台而异,Linux系统期望
/dev/sdh
等名称,Windows系统期望
xvdh
等名称。附加块存储卷后,可使用特定于操作系统的磁盘管理实用程序从实例中挂载和格式化它。
示例:
$ ec2-attach-volume vol-81aeb37f -i i-12b3ff6a -d /dev/sdf
ATTACHMENT vol-81aeb37f i-12b3ff6a /dev/sdf attaching 2008-12-17T22:36:00+0000
5.4.6 ec2 - authorize
ec2-authorize groupname -P protocol (-p portrange | -t icmptypecode) [-u sourceuser ...] [-o sourcegroup ...] [-s sourceaddress]
授权网络流量访问使用指定组名启动的EC2实例。可根据多种标准授权传入流量:
- 流量来源的子网。
- 流量来源的EC2实例的组 membership(如果来自EC2实例)。
- 流量的协议(TCP、UDP、ICMP)。
- 流量的目标端口。
默认情况下,组不允许流量通过,但成员可能属于多个组,其他组的成员资格可能允许流量通过。要使流量流动,必须明确授权。除了允许流量从一个EC2组流向另一个组的情况外,可将流量控制到协议和端口级别。如果允许流量在组之间流动,则是全有或全无的情况。
示例:
# Grant port 80 access to all traffic regardless of source
$ ec2-authorize mydmz -P tcp -p 80 -s 0.0.0.0/0
GROUP mydmz
PERMISSION mydmz ALLOWS tcp 80 80 FROM CIDR 0.0.0.0/0
# Grant access to the app server group from the DMZ group
$ ec2-authorize myapp -u 999999999999 -o mydmz
GROUP myapp
PERMISSION myapp ALLOWS all FROM USER 999999999999 GRPNAME mydmz
# Grant access to a range of ports from a specific IP address
$ ec2-authorize mydmz -P udp -p 3000-4000 -s 67.202.55.255/32
GROUP mydmz
PERMISSION mydmz ALLOWS udp 3000 4000 FROM CIDR 67.202.55.255/32
5.4.7 ec2 - bundle - instance
ec2-bundle-instance instanceid -b s3bucket -p prefix -o accesskey (-c policy | -w secretkey)
仅适用于Windows实例。将Windows实例打包并存储在亚马逊S3中,以便使用
ec2 - register
进行注册。
示例:
$ ec2-bundle-instance i-12b3ff6a -b mybucket -p myami -o 999999999999 -w lY1zp/1iKzSAg9B04lQ0T3gMxje7IfnXtN5asrM/dy==
BUNDLE bun-abd5209d8 i-12b3ff6a mybucket myami pending 2008-12-18T13:08:18+0000 2008-12-18T13:08:18+0000
5.4.8 ec2 - cancel - bundle - task
ec2-cancel-bundle-task bundleid
仅适用于Windows实例。取消正在进行的打包过程。
示例:
$ ec2-cancel-bundle-task bun-abd5209d8
BUNDLE bun-abd5209d8 i-12b3ff6a mybucket myami canceling 2008-12-18T13:13:29+0000 2008-23-18T13:13:29+0000
5.4.9 ec2 - confirm - product - instance
ec2-confirm-product-instance productcode -i instanceid
使AMI所有者能够检查指定实例是否附加了指定的产品代码。
示例:
$ ec2-confirm-product-instance zt1 -i i-12b3ff6a
ztl i-12b3ff6a false
5.4.10 ec2 - create - snapshot
ec2-create-snapshot volumeid
创建指定卷ID的差异快照并存储在亚马逊S3中。为避免数据完整性问题,最好对“冻结”的文件系统进行快照。命令成功返回后可继续向卷写入数据。
示例:
$ ec2-create-snapshot vol-12345678
SNAPSHOT snap-a5d8ef77 vol-12345678 pending 2008-12-20T20:47:23+0000
5.4.11 ec2 - create - volume
ec2-create-volume (-s size | --snapshot snapshotid) -z zone
在指定的可用区创建新卷,可指定卷大小或基于指定快照创建。必须指定可用区和大小或快照,大小参数以GB为单位。
示例:
# Create a new volume of 10 GB
$ ec2-create-volume -s 10 -z eu-west-1a
VOLUME vol-12345678 10 eu-west-1a creating 2008-12-20T20:47:23+0000
# Create a volume based on a stored snapshot
$ ec2-create-volume --snapshot snap-a5d8ef77 -z eu-west-1a
VOLUME vol-12345678 10 eu-west-1a creating 2008-12-20T20:47:23+0000
综上所述,在云基础设施扩展中,主动扩展和被动扩展各有优劣,应结合使用并合理设置限制。垂直扩展在特定情况下能发挥重要作用,与水平扩展结合可提高资源利用率。同时,熟悉亚马逊Web服务的命令行工具能帮助我们更好地管理云环境。
6. 命令使用场景与注意事项
6.1 安全组与密钥对管理
在使用
ec2 - add - group
和
ec2 - add - keypair
命令时,需要注意安全问题。安全组是控制实例网络访问的重要手段,创建时要明确其用途和规则。例如,创建 DMZ 安全组时,后续要通过
ec2 - authorize
命令精确配置允许的流量,避免开放不必要的端口和协议,防止潜在的安全漏洞。
密钥对是访问实例的重要凭证,使用
ec2 - add - keypair
生成的私钥要妥善保管,建议将其存储在安全的位置,如使用加密文件系统或密钥管理工具。同时,避免在公共环境中暴露私钥,防止被他人获取后非法访问实例。
6.2 IP 地址与存储卷管理
ec2 - allocate - address
和
ec2 - associate - address
用于管理弹性 IP 地址。由于亚马逊会对未使用的弹性 IP 地址和过度重新分配收费,所以在分配和关联 IP 地址时要谨慎规划。例如,在实例启动和停止时,合理安排 IP 地址的分配和释放,避免不必要的费用。
ec2 - attach - volume
和
ec2 - create - volume
用于管理存储卷。在附加存储卷时,要确保设备名称与实例的操作系统兼容。例如,Linux 系统使用
/dev/sdh
等名称,Windows 系统使用
xvdh
等名称。同时,在创建存储卷时,要根据实际需求选择合适的大小和快照,避免资源浪费。
6.3 实例打包与快照管理
ec2 - bundle - instance
和
ec2 - cancel - bundle - task
仅适用于 Windows 实例。在打包实例时,要确保 S3 存储桶有足够的空间和权限。如果打包过程中出现问题需要取消,使用
ec2 - cancel - bundle - task
可以及时停止操作,避免不必要的资源消耗。
ec2 - create - snapshot
用于创建存储卷的快照。为了保证数据的完整性,最好在文件系统处于“冻结”状态时进行快照操作。例如,可以先停止相关服务,确保数据写入完成后再进行快照。快照完成后,可以根据需要进行存储和管理,以便在需要时恢复数据。
7. 扩展策略的综合应用
7.1 不同业务场景下的扩展选择
对于流量相对稳定、有明显规律的业务,如电商网站的日常运营,可以主要采用主动扩展策略。根据历史数据和业务预测,提前规划好不同时间段的资源容量,预留一定的余量。例如,在促销活动期间,根据预计的流量增长,提前增加服务器数量或升级服务器配置。
对于流量波动较大、难以预测的业务,如新闻网站的突发新闻事件,被动扩展可以作为补充手段。但要注意设置合理的限制器,避免过度扩展导致成本过高。同时,结合主动扩展预留的额外容量,尽量减少被动扩展的触发频率。
7.2 水平扩展与垂直扩展的结合
在实际应用中,水平扩展和垂直扩展可以相互配合,以达到最佳的资源利用效果。例如,对于一个大型的电商平台,在业务初期可以采用水平扩展,通过添加多个中型实例来满足用户增长的需求。随着业务的发展,当某些关键组件(如数据库服务器)出现性能瓶颈时,可以采用垂直扩展,升级服务器的配置,如增加 RAM 或 CPU 核心数。
以下是一个水平扩展和垂直扩展结合的流程图:
graph LR
A[业务启动] --> B[水平扩展:添加中型实例]
B --> C{是否出现性能瓶颈}
C -- 是 --> D[垂直扩展:升级关键组件服务器]
C -- 否 --> E[继续水平扩展]
D --> F{性能是否改善}
F -- 是 --> E
F -- 否 --> G[重新评估扩展策略]
G --> B
7.3 扩展策略的监控与调整
无论是主动扩展还是被动扩展,都需要建立有效的监控机制。通过监控系统实时收集服务器的性能指标,如 CPU 使用率、内存使用率、网络流量等。根据监控数据,及时调整扩展策略。例如,如果发现某个时间段的流量持续超过预期,可以适当增加主动扩展的余量;如果被动扩展频繁触发,说明限制器设置可能不合理,需要进行调整。
8. 总结
云基础设施的扩展是一个复杂的过程,需要综合考虑多种因素。主动扩展和被动扩展各有优缺点,应根据业务需求和特点合理选择和结合使用。垂直扩展在特定情况下能有效解决性能瓶颈问题,与水平扩展结合可以提高资源利用率。
同时,熟悉亚马逊 Web 服务的命令行工具是管理云环境的重要基础。在使用这些工具时,要注意安全问题和资源的合理利用,避免不必要的成本和风险。通过建立有效的监控机制,及时调整扩展策略,可以确保云基础设施在不同业务场景下都能稳定、高效地运行。
希望以上内容能帮助你更好地理解云基础设施的扩展策略和亚马逊 Web 服务的使用,在实际应用中根据具体情况灵活运用,实现业务的稳定发展和资源的优化配置。
超级会员免费看
2087

被折叠的 条评论
为什么被折叠?



