林昊 电子工业出版社
第六章 构建高可用的系统
这一章作者提供了解决系统构建各个问题可以用到的知识,但作者没有把具体的解决方案提出来,都是点到为止。
1.避免系统中出现单点 如何均衡的访问到提供业务功能的机器
如何保证机器出现问题时,用户不会访问到这台机器
2.负载均衡的方式 随机选择,这种方法实现很简单,性能高。
HASH选择
典型的应用场景是静态图片的加载。对请求的url串做hash,这样保证每次请求的是用一台机器,命中缓存,提升性能。要读取网络协议的第七层信息,要做hash,会消耗一定的cpu。
地址选择(Round-Robin)
比随机多了一个同步操作,实际使用较多
权重
实际负载量
按连接数
1.这种方法避免重启一台机器,增加了连接数对可用地址列表做排序的负担。
2.按cookie信息绑定访问机器的方式。
3.响应返回方式
1.通过负载均衡机器返回。
这种方法通过NAT实现。
2.直接返回请求方
4.数据库
1.可以分开部署读写操作
2.Gossip是一个去中心化传播时间的模型,这就是1传2,2传4,类似的功能,可以很快完成数据同步
3.Facebook开源的Cassandra 是一个居于Gossip实现的无中心的Nosql,去掉中心点后性能提升很快
4.还有机房的一些事情,这段时间不关注
5.提高自身可用性
1.互联网是一个无限放大故障的地方,任何很小,绝对不可能发生的问题,都可能会在互联网上发生,导致故障。
2.一方面深入理解所使用的java类库和框架,帮助你清楚了解程序运行状况
3.另一方面是经验,自身学习和经历,学习获得时一定要了解产生原因。否则很难成为自己的经验。
4.明确使用场景
设计很多不必要的功能,没必要的系统扩展,系统功能,将系统复杂化,这些都容易出故障,因此,保持系统的简单,对复杂的系统功能,应分解多个阶段来完成,保持每个阶段的简单。
6.设计容错的系统
1.FailFast原则
当主流程的任何一部出现问题,应快速结束整个流程,而表示等后续来处理。通常对传入参数判断是否符合要求,不符合直接抛错
2.强制使用明确对象,(可以去了解Effective java 提到的设计原则,第1,3,15条)
7.设计具有自我保护的系统
1.最佳设计方法是对所有的第三方依赖的地方持怀疑态度,这些地方要有保护措施
2.超数量用户连接数据库,直接抛异常,不等待
3.限制使用资源(文件,线程,网路,内存)
8.日志,及时处理故障。
1.功能降级,全局资源调整,降低资源使用。
9.访问量不断上涨应对策略。
1.像ebay,拆分数据库按业务,对数据大的按规则拆分,分离读写操作。