10+用户

l 将单个主机分为多个主机

1. Web应用使用一台主机。

2. 数据库使用一台主机,你可以在上面跑任意数据库,只要负责数据库的管理。

3. 将主机分离成多个主机可以让web应用和数据库各自独立对自己进行扩展,例如在某种情况下可能你需要的数据库比web应用更大的规模。

l 或者你可以不自己搭建数据库转而使用Amazon的数据库服务

1. 你是一个DBA吗?你真的想要担心数据备份的问题吗?担心高可用?担心数据库补丁?担心操作系统?

2. 使用Amazon数据库服务有一大优势,你只要简单一点击即可完成多可用区域的数据库的安装,而且你不必担心这些可用区域之间的数据备份或其他类似的事情,这些数据库具备高可用性高可靠性。

l 正如你所想,Amazon有几种类型的完全托管数据库服务供出售:

1. Amazon RDS(Relational Database Service),可供选择的数据库类型相当多,包括Microsoft SQL Server, Oracle, MySQL, PostgreSQL, MariaDB, Amazon Aurora.

2. Amazon DynamoDB,一个NoSQL数据库。

3. Amazon Redshift,一个PB级的数据仓库系统。

l 更多Amazon 特性

1. 拥有自动扩展存储到64TB的能力,你不再需要限定你的数据存储。

2. 多大15个读副本。

3. 持续增量备份到S3。

4. 多达6路备份到3个可用区域,有助于处理故障。

5. MySQL兼容。

l 用SQL数据库取代NoSQL数据库

1. 建议使用SQL数据库。

2. SQL数据库相关技术完善。

3. 存在大量开源源码、社区、支持团队、书籍和工具。

4. 千万用户级别系统的还不足以拖垮SQL数据库,除非你的数据非常巨大。

5. 具有清晰的扩展模式。

l 什么时候你才需要使用NoSQL数据库

1. 如果你一年需要存储超过5TB的数据,或者你有一个令人难以置信的数据密集任务。

2. 你的应用具有超低延迟需求。

3. 你的应用需要一个非常高的吞吐量,需要在数据的读写I/O上进行优化。

4. 你的应用没有任何关系型数据。

100+用户

l 在web层进行主机分离。

l 使用Amazon RDS存储数据,它把数据库的所有工作都揽下了。

l 上面两点做好即可。

 

1000+用户

l 现在你构建的应用存在可用性问题,你的web应用将会宕掉如果你web服务的主机宕掉了。

l 你需要在另外一个可用区域上搭建另外一个web实例,由于可用区域之间拥有毫秒级别的低延迟,他们看起来就像互相挨着。

l 同样,你需要在另外一个可用区域上搭建一个RDS数据库slave,组成主备数据库,一旦主数据库发生故障你的web应用将会自动切换到slave备数据库。由于你的应用总是使用相同的端,failover不会带给应用任何改变。

l 在两个可用区域中分布着两个web主机实例,使用弹性负载均衡器(ELB)将用户访问分流到两个web主机实例。

l 弹性负载均衡器(ELB)

1. ELB是一个高可用的负载均衡器,它存在于所有的可用区域中,对于你的应用来说它是一个DNS服务,只需要把他放到Route53即可,它就会在你的web主机实例中进行负载分发。

2. ELB有健康检查机制,这个机制保证流量不会分发到宕掉的主机上。

3. 不用采取任何措施即可完成扩展,当它发现额外流量时它将在后台通过横向和纵向扩展,随着你的应用不断扩展,它也会自动不断扩展,而且这些都是系统自动完成的,你不必对ELB做任何管理。

10000到100000用户

l 前面例子中说到ELB后面挂载两个web主机实例,而实际上你可以在ELB后面挂载上千个主机实例,这就叫横向扩展。

l 添加更多的读副本到数据库中,或者添加到RDS中,但需要保持副本的同步。

l 通过转移一些流量到web层服务器减轻web应用的压力,例如从你的web应用中将静态内容抽离出来放到Amazon S3和Amazon CloudFront上,CloudFront是Amazon的CDN,它会将你的静态内容保存在全世界的53个边缘地区,通过这些措施提高性能和效率。

l Amazon S3是一个对象仓库。

1. 它不像EBS,它不是搭载在EC2实例上的存储设备,它是一个对象存储而不是块存储。

2. 对于静态内容如JavaScript、css、图片、视频等存放在Amazon S3上再合适不过,这些内容没必要放到EC2实例上。

3. 高耐用性,11个9的可靠性。

4. 无限制的可扩展,只要你想可以往里面扔尽可能多的数据,用户在S3上存储了PB级别的数据。

5. 支持最大5TB的对象存储。

6. 支持加密,你可以使用Amazon的加密,或者你自己的加密,又或者第三方的加密服务。

l Amazon CloudFront对你的内容提供缓存

1. 它将内容缓存在边缘地区以便供你的用户低延迟访问。

2. 如果没有CDN,将导致你的用户更高延迟地访问你的内容,你的服务器也会因为处理web层的请求而处于更高的负载。

3. 例如有个客户需要应对60Gbps的访问流量,CloudFront将一切都处理了,web层甚至都不知道有这么大的访问流量存在。

l 你还可以通过转移session状态减轻你的web层的负载

1. 将session状态保存到ElastiCache或DynamoDB。

2. 这个方法也让你的系统在未来可以自动扩展。

l 你也可以将数据库的一些数据缓存在ElastiCache减轻应用负载

1. 数据库没有必要处理所有获取数据的请求,缓存服务可以处理这些请求从而让宝贵的数据库资源处理更加重要的操作。

l Amazon DynamoDB——全托管的NoSQL数据库

1. 根据你自己想要的吞吐量,定制你想要的读写性能。

2. 支持高性能。

3. 具备分布式和容错性,它部署在多个可用区域中。

4. 它以kv结构存储,且支持JSON格式。

5. 支持最大400k大的文件。

l Amazon Elasticache ——全托管的Memcached或Redis

1. 维护管理一个memcached集群并不会让你赚更多的钱,所以让Amazon来做。

2. Elasticache集群会自动帮你扩展,它是一个具备自我修复特性的基础设施,如果某些节点宕掉了其它的新节点即会自动启动。

l 你也可以转移动态内容到CloudFront减轻负载

1. 众所周知CloudFront能处理静态内容,例如文件,但除此之外它还还能处理某些动态内容,这个话题不再进行深入的探讨,可以看看这个。

自动扩展

l 对于黑色星期五,假如你不用做任何扩展就足够处理这些峰值流量,那么你是在浪费钱。如果需求和计算能力相匹配自然是最好的,而这由自动扩展帮你实现,它会自动调整计算集群的大小。

l 作为用户,你可以决定集群的最小实例数和最大实例数,通过实例池中设置最小和最大实例数即可。

l 云监控是一种嵌入应用的管理服务

1. 云监控的事件触发扩展。

2. 你准备扩展CPU的数量吗?你准备优化延迟吗?准备扩展带宽吗?

3. 你也可以自定义一些指标到云监控上,如果你想要指定应用针对某些指标自动扩展,只需将这些指标放到云监控上,告诉根据云监控根据这些指标分别扩展哪些资源。

500000+用户

l 前面的配置可以自动扩展群组添加到web层,在两个可用区域里自动扩展群组,也可以在三个可用区域里扩展,在不同可用区域中的多实例模式不经可以确保可扩展性,同时也保证了可用性。

l 论题中的案例每个可用区域只有3个web层实例,其实它可以扩展成上千个实例,而你可以设置实例池中最小实例数为10最大实例数为1000。

l ElastiCache用于承担数据库中热点数据的读负载。

l DynamoDB用于Session数据的负载。

l 你需要增加监控、指标以及日志。

1. 主机级别指标,查看自动扩展的集群中的某一CPU参数,快速定位到问题的位置。

2. 整体级别指标,查看弹性负载均衡的指标判断整个实例集群的整体性能。

3. 日志分析,使用CloudWatch日志查看应用有什么问题,可以使用CloudTrail对这些日志进行分析管理。

4. 外部站点监控,使用第三方服务例如New Relic或Pingdom监控作为终端用户看到了什么情况。

l 你需要知道你的用户的反馈,他们是不是访问延迟很慢,他们在访问你的web应用时是不是出现了错误。

l 从你的系统结构中尽可能多地排出性能指标,这有助于自动扩展的决策,你可不希望你的系统CPU使用率才20%。