一、Consistency
1、CAP theorem---Consistency、Availability、Partition Tolerance
(English)How to beat the CAP theorem
2、Optimistic Locking乐观锁、Timestamps时间戳、向量时钟Vector Clock
乐观锁(Optimistic Locking)与悲观锁(Pessimistic Locking)
向量时钟两篇好文: 向量时钟Vector Clock in Riak Vector Clock理解
二、Partition
当大规模数据系统的数据超过单个计算机的容量,并且还要保证数据副本的可靠性、系统的可扩展性(负载平衡措施),这时推荐数据切分的方法,将数据存储于不同数据库节点上。有不同的方法实现数据库读取的负载平衡: memory cache: 如MangoDB、 Clustering、数据的读写分开、数据切分sharding(如MongoDB采取横向切分的方法)。
其中,数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。
技术: 1、sharding过程中使用 一致性哈希算法 分布式缓存的一致性hash算法原理
Consistent Hashing最大限度地抑制了hash键的重新分布。另外要取得比较好的负载均衡的效果,往往在服务器数量比较少的时候需要增加虚拟节点来保证服务器能均匀的分布在圆环上。因为使用一般的hash方法,服务器的映射地点的分布非常不均匀。使用虚拟节点的思想,为每个物理节点(服务器)在圆上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。用户数据映射在虚拟节点上,就表示用户数据真正存储位置是在该虚拟节点代表的实际物理服务器上。
2、副本策略——减少读取访问的次数,负载平衡,如cassandra副本策略:
并且还讨论了分布式数据库某节点的加入及宕机情况下,如何保证某数据片段依然能够在其他数据结点上访问到。
三、数据存储(决定了物理存储以何种方式被访问)
1、行式存储 Row-based storage
2、列式存储 Columar storage
另外。几张图看懂列式存储 一文包括字典表压缩数据。
3、列族存储 Columnar Storage Layout with Locality Groups(如Google BigTable)
4、日志结构的合并树 Log Structured Merge Trees
前三个存储方式没有涉及到序列化的逻辑数据结构,他们都涉及的是如何高效利用内存和磁盘存储空间进行读写(效率、性能和安全)。