分布式系统
集群的到来
你为什么要使用集群? 如果一个问题可以在单机上解决,那就使用单机的方法,在使用分布式解决问题前,要充分尝试别的思路,因为分布式系统会让问题解决变得复杂
并行、容错、通信、安全/孤立
难以解决的局部错误
人们设计分布式系统的根本原因是为了获得更高的性能,你的集群到底发挥了多大的能力?1000台发挥了1000倍的能力吗?
如果一个系统,只需要提高几倍的机器的数量,就可以提高几倍的性能或者吞吐量,这就是一个巨大的胜利,因为不需要花高价雇程序员
并行
比方有一个web服务器,一夜之间火了,上亿的人来访问,就需要更多的web服务器,可是当你的web服务器的数量增大以后,数据库又成为了瓶颈,限制了性能,你可以尝试更多的数据库,但是这又会问到其他问题。
容错
假设每台计算机一年只坏一次,那么1000台计算机的集群,每天坏3台,计算机崩溃成为了常见的错误,各种问题,网络,交换机,计算机过热,错误总会发生,
可用性
某个系统经过精心设计,在某些错误下,系统可以正常运行,提供完整的服务,就想没有发生错误一样,比如多个备份,即使一个备份出错,但是另一个备份是正常的
我们的可用性是在一定的条件下的,并非所有的错误都不怕
修复
系统在修复前无法继续工作,当恢复后会正常工作,这一点非常重要,这就是最重要的指标,
非易失性储存
他们更新起来昂贵,构建高性能容错系统非常繁琐,聪明的办法是避免写入非易失性储存
使用复制
管理复制来实现容错,这也很复杂,你需要保证一致性,
强一致性
get得到的值一定是最新的put的值
弱一致性
某人put,你可能看到的是旧值,但一段时间以后他会变成新值,我们不保证时间。我们要避免通信,所以我们更加倾向于弱一致性,强一致性太麻烦了,代价太高
把所有备份放到一个机房,放到一个机架上,这非常糟糕,要是有人不小心绊倒了电源线,就糟糕了,位了让副本更好的容错,人们希望将不同的副本尽可能的分开远放,例如放在不同的城市,
副本在几千英里以外,想抱着强一致性特别困难,你要去等待多个服务器来给你反馈,等个20-30毫秒,这难忍受,并浪费了资源。
MapReduce
要在TB数量的数据中分析,需要大量的并行计算,我们会把输入分成多份,对每一份进行map,他会生成一堆keyvalue,然后是数据移动,按照key合并,并交给reduce处理,不同的reduce输出不同的结果
MapReduce最大的瓶颈是网络,我们要尽量避免数据的传输,
shuffle
map之后的数据,传给reduce,往往意味着由行储存变为列储存,