CAP理论在分布式存储系统的开发中应该如何理解和实践?

mopishv0 - 高级开发工程师@美团

赞同来自: 银河系管理员 编程小梦

   这个问题比较大,我只能谈谈我个人的一点理解:  
  1. 分布式系统的CAP理论
    分布式存储一般离不开这个理论。首先把分布式系统中的三个特性进行了如下归纳:     Consistency(一致性), 数据一致更新,所有数据变动都是同步的。     Availability(可用性), 好的响应性能。     Partition tolerance(分区容错性) 可靠性。     但其实际意义并不是说只能三选其二,其意义在于你可以根据需求适当降低其中一者的性能。        2 一致性     一致性分为以下三种     强一致性:系统中的某个数据被成功更新后,后续任何对该数据的读取操作都将得到更新后的值;     弱一致性:系统中的某个数据被更新后,后续对该数据的读取操作可能得到更新后的值,也可能是更改前的值。但经过“不一致时间窗口”这段时间后,后续对该数据的读取都是更新后的值;     最终一致性:是弱一致性的特殊形式,存储系统保证在没有新的更新的条件下,最终所有的访问都是最后更新的值。     以上来自搜狗搜索结果:),读、写和容灾是选择一致性需求的考量点。尤其在有节点挂掉时,对数据一致性的要求有可能会影响可用性。     弱一致性一般适合写操作频繁的服务。写数据单备份成功即返回,后端线程完成多备。读数据也可比较随意。节点挂掉时最近的数据容易丢失。节点复活情况复杂时对于一个key可能存在不同值。     最终一致性在写入时在半数以上拷贝写成功时即返回请求。读写数据时都有特定提供服务的备份。备份挂掉半数以下时不会发生数据丢失,挂掉半数上一般集群会选择进入安全模式。容灾时,需要各备份间互补数据,以防止不一致性,这个流程会花费一定时间,可根据需求决定此间是否继续提供服务,容灾结束后保证数据一致。     强一致性;对一致性要求较高的解决方案是写备份+读备份>总备份数(举例说明,一份数据有5备份,写2份返回请求的话要求读取时至少读取4份)以保证每次读数据能读取到版本最新的数据。一般在容灾时,挂掉的备份会被立即补上,不能补上或影响读取时则进入安全模式。     当然,需要说明的是上述解决方案并没有明显的界定,方案由需求决定,而不是为了一致性而一致性。     一致性对于单机也有较大要求,一般的os向硬盘写入数据时,只要数据加入写硬盘缓冲api即会返回执行成功。写入硬盘前会经历os缓冲、读写卡缓冲、硬盘缓冲。期间如果发生断电则会丢失数据。这种情况的解决方案一方面在于使用带电池的读写卡。另一方面对于重要数据使用sync io api。但由于os的模型一次sync数据到硬盘会额外要求其他数据也需要写入硬盘,因此响应时间一般较长。 3 可用性     可用性要求读写能够终止,性能上取决于其他两个的考量,一致性主要对多备的完成率有要求,分区容忍对数据分布有要求,这些都会降低读写性能。但好的分区容忍性,在节点挂掉时却能保证数据能响应请求。 4 分区容忍性(容灾)     由于分布式环境中服务都是镜像的,基本只有运行时数据或持久化数据不同。所以此点比较容易保证,相关基础理论也比较多。     分区容忍性通常由多备份保证,多备时一般会考虑备份位置,安全级别上来说,不同硬盘<不同机器<不同机架<不同机房。备份间的地理位置间隔越远,数据越安全,但数据写入延迟也会过高,容灾、均衡和多备性能会下降,代价会提高。     另一方面就是丢失备份时,是否需要及时补备份。一般思路是超过时间窗口自动补备份,需要考虑的问题是窗口过短,在发生网络震荡时,会有无谓的数据迁移容易雪崩,窗口过长又容易导致数据丢失。一般来说需要根据需求决定具体的时间窗口,但是一定要在标记删除变为物理删除前补备份,并将老数据删掉。     降低可用性或一致性可以提高分区容忍性,即备份丢失时可以继续提供服务,但丢失数据无法读取,对于数据更新频繁的服务,这是一个好选择。 5 写入均衡     写入均衡实现有三种:     1),类似memcached,用一致性哈希决定数据位置。优点是写入快,缺点是牺牲了分区容忍性,因为除了客户端没有其他节点知道数据位置信息。     2),类似hdfs客户端每次请求由namenode分配文件块位置,然后客户端将请求发到datanode。优点是,提高了一致性和datanode的分区容错性(一个块写入失败重新获取新位置即可),缺点是namenode成为热点减低了分区容错性。     3),类似tair,将位置信息由cs发布,记录在客户端,客户端一次性获取,失败重新更新对照表。优点是正常情况下比较均衡,缺点是容错时会对cs造成较大压力且过于敏感。 6 旧数据负载均衡     有新机器加入集群时,一般都需要进行负载均衡。一般由两种手段。     1),hdfs的方案,新数据都写入此节点,使其慢慢与其他节点对齐,优点是减少数据迁移,缺点是短期内容易成为热点。     2),tair的方案,bucket迁移,使各节点在预期内达到均衡,优点是均衡效果明显,缺点是短期内数据大量迁移,影响读写性能。 7 逻辑位置与物理位置     大多数的存储逻辑位置与物理位置是一致的,但也有hbase这种分开的解决方案。好处是自己的逻辑挂掉不影响实际数据,加快容灾,但是最大缺点是响应数据操作时会多一次RPC请求。 8 分块存储     内存方面尤为明显,数据块对齐可以减少硬盘寻道、内存寻址次数,但是会产生额外的浪费。  

要回复问题请先登录注册