随着云平台的不断发展,利用云的服务来支持利用变成常态
在AWS上设计容错架构的APP需要掌握5个设计模式
AWS还有另外的7大架构设计原则(针对利用设计),可以参考张侠的7大设计原则 参考文章:【总结】初创公司用AWS搭建高扩大性架构 实用性会更强1些,触及服务会更多
可用性
不可用
目标
扩大性
高可用能力
灾备
全球散布式的基础设施
天然高可用和容错的服务
可通过适当的架构设计实现高可用
架构设计:Router53→EIP→EC2→RDS
如果EC2实例#1出现问题,那末可以启动另外一个EC2实例#2,并将实例#1 的IP绑定给实例#2
架构设计:Router53→EIP→EC2(+EBS)→RDS
如果EC2实例#1出现问题,那末可以启动另外一个EC2实例#2,并将实例#1 的EBS卷绑定给实例#2
架构设计:Router53→ELB→EC2(more then 1)→RDS
ELB后端有N个EC2实例,不管任何实例出现问题,那末ELB的流量将会停止分发流量到其他健康实例
如果配置了弹性组,那末当实例宕机,那末“弹性组”会自动补齐EC2实例的总数量
为了不全部机房都宕掉,AWS设计了可用区AZ
架构设计(高可用设计):
- Router53→ELB→AZ(A)【EC2实例#1→RDS#master(multi-AZ架构)】
- Router53→ELB→AZ(B)【EC2实例#2→RDS#master→RDS#slave】
ELB后端有N个EC2实例,分别部署在AZ(A)和AZ(B),同时RDS采取了multi-AZ部署架构(master和slave也分别部署在AZ(A)和AZ(B)),这类情况下不管任何实例、RDS数据库、还是数据中心AZ(A)或AZ(B)单独出现问题,那末服务也将可以访问
架构设计(弹性设计):
- Router53→ELB→弹性组→AZ(A)【EC2实例#1→RDS#master(multi-AZ架构)】
- Router53→ELB→弹性组→ AZ(B)【EC2实例#2→RDS#master→RDS#slave】
相比于“高可用设计”例子,在这里ELB后端采取了弹性组(Auto Scaling Group —支持跨AZ扩大),这样实例数量增加就能够自动化【这里说的就是自动扩大设计】,且如果有实例出现问题,ASG也会自动补齐【这里说的就是自我修复设计】。
同时到达低谷期时也会自动缩减EC2实例的数量
耦合度与灵活性相反
- 举例:动车载客的设计,如果有1000人,怎样设计车箱?A和B两种设计
- A:把车做的足够大,1000人都在里面,耦合大(坏掉1个都不可用了),管理不灵活
- B:每节车箱100人,要做10个车箱。耦合小(坏掉1个还有其余可用),但是足够灵活
媒体数据处理的场景:
架构设计#1(数据处理):Router53→ELB→弹性组【数据接收的EC2实例】→视频数据存入S3 AND 元数据存入DynamoDB→弹性组【转码的EC2实例】
架构设计#2(消息通知):数据接收伏务(SQS)→转码服务(SQS)→发布&通知
架构设计#3(弹性设计):
- 未来在增加用户访问量的情况下,弹性组会增加EC2实例的数量,来处理数据接收
- 未来在SQS中处理的消息愈来愈多的时候(说明转码数量增加),弹性组也会增加EC2实例数量,来处理转码工作
- 如果某台EC2实例宕机,那末弹性组也会补齐数量
容错利用的设计原则
- 假定失效的设计
- 多可用区设计
- 自动扩大设计
- 自我修复设计
- 松耦合设计
更多参考资料
- AWS参考架构:http://aws.amazon.com/architecture/
- AWS白皮书:http://aws.amzon.com/whitepapers/
用工具测试1下高可用&容错架构
使用开源的工具CHAOS Money
它会随机将服务中的某个环节宕机,从而测试利用是不是能够保证硬朗性