Dynamo的三点备份模型
第二个问题是数据可靠性,因为我们使用的是廉价的pc机,硬盘损毁或者是其他原因导致的主机不可用是很经常的事情。
做这样一个估算,假设一台pc机平均三年就会有一次失效,不可用。那么当一个一千台机器的集群,基本上每天都有机器坏掉,所以某主机不可用是常态,系统必须可以在这样的情况下继续提供服务(哦 虽然你的网站现在刚刚只需要4台主机,可是别忘了,它要成长成为google的)。
当然,廉价pc的好处就是便宜。所以我们可以增加系统中数据的备份来使得系统在某台机器挂掉的时候仍旧可用。大家最先想到的方案可能就是对每个节点,建立一个备份节点,如果主节点坏掉了,备份节点可以立刻顶上去(双机热备)。
但是仔细想一下,这个方案是让人不放心的。因为当一主一备中的某一台机器坏掉,另外一台就成了一个单点运行的节点。这个时候另外一个节点一旦发生错误,服务就变得不可用,数据也有可能丢失。在一个要求高可靠性的系统上,这是不可忍受的。
我们刚刚估算了一个大的集群每天都有机器挂掉。而这种错误,一定要人工介入才能解决。想想系统管理员每天在机房里更换主机的情景以及其他不可预料情况(系统管理员休假或者新买的主机没按时到货等),再想想系统每天都有节点在单点运行,真的是很可怕的事情。
事实上,一般工业界认为比较安全的备份数应该是3份。好,那么我们看看做这个备份的时候需要注意的问题。首先,如何选择备份节点。我们可以简单的选择顺序上的后两个节点为备份节点,比如存在节点A的数据,备份到节点B和C。但是当我们前面引入了虚节点的概念的时候就要注意了,有可能C节点和A节点在同一台物理机器上,这个时候就不能选择C做为A的备份了。
下一个问题,当一个节点离开系统的时候,比如宕机,这个节点上存储的信息需要继续备份到其它节点上。虽然节点离开了系统,但是因为备份的存在,我们通过其他节点可以恢复出本节点的所有信息,因为该节点的离开,这部分信息的备份数会比要求的备份数少一,所以需要把这部分数据做再备份。
同样,当一个节点加入系统,从其他节点偷了数据后,其他节点也需要相应减少备份数。而一个节点如果只是暂时性的不可达,也就是失效一个很短的时间(这种情况是最常发生的),那么需要其他节点暂时接管这个节点的工作,在其可用的时候,把数据增量传送回该节点。