分布式系统的挑战——数据密集型应用系统设计读书笔记(4)

假设:所有可能出错的事情一定会出错(不考虑拜占庭故障)。
单节点程序
以确定性方式运行,即要么工作,要么出错。
不存在模棱两可的情况,相同的操作总会出现相同的结果(无硬件问题时的确定性)。
由于硬件问题导致的系统性故障,如内核崩溃、蓝屏死机、启动失败等。
体现出单点计算机的设计:相比于返回错误的结果,不如使程序全部崩溃。
多节点程序:存在“部分失效”。问题的难点在于这种部分失效是不确定——无法判断是主机失效还是网络失效。
大规模计算系统:分为高性能计算和云计算,传统企业数据中心介于二者之间。
应对错误的方式:
高性能计算:类似单节点系统,出故障时会将局部失效升级为整体失效。具体流程为定期对任务状态进行快照,并将其保存在持久存储上,当某节点出现故障时,停止整个集群的工作,待节点修复后,按最近的快照重启任务。
云计算
许多互联网服务都是在线的,需要高可用性,无法长时间暂停服务。
高性能计算硬件昂贵,故障率低,通信通过共享内存或远程内存直接访问(RDMA)等技术。而云计算单节点成本低而集群聚合后性能较好,单节点故障率高。
云计算基于IP和以太网,采用Clos拓扑结构提供等分带宽。高性能计算采用如多维网格和toruses等特定的网络拓扑结构,性能更好。
云计算系统越大,局部失效的概率越大,因而将花费大量时间在错误恢复上。
云计算能够容忍某些失效的节点,实现滚动升级等功能。
云计算经由广域网,速度慢且不可靠,高性能计算经由局域网,速度快且靠谱。
分布式系统的本质:在不可靠的组件上构建可靠的系统。
经典语句:在分布式系统中,怀疑,悲观和偏执狂才能生存。
分布式无共享系统:网络是跨节点通信的唯一途径,每台机器有自己的内存和硬盘,一台机器不能直接访问另一台机器的内存或磁盘除非通过网络向对方发出请求。
基于不可靠组件构建可靠系统的实例:纠错码、TCP/IP。
超时:网络或节点故障检测唯一可行的方法?
超时值:多少合适?没有标准答案。设置过长意味着资源的浪费,过短意味着可能出现误判。
节点失效的后果:失效节点的职责会转移到其他节点,这会造成其他节点和网络的额外负担,甚至可能导致失效扩散。
数据包时延变化的原因:排队。网络交换机中的排队,目标机器中的排队,虚拟化切换导致的排队,TCP流量控制导致的排队。


版权声明:本文为weixin_43129599原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。