怎么设计?我们需要从一个用户的角度去看问题,什么叫用户的角度,说白了就是一个key-value对象时如何存储到数据库中,然后如何从一个数据库中读取出来,最后这个数据库要实现一定的容灾能力。
整个流程就是按照一个key-value从客户端发送过来。第一,这个key-value对象的逻辑数据结构是怎么设计的,这就用到了龙珠one:key-value的逻辑数据结构设计,个人觉得列族模型相对灵活。第二,该对象是如何找到对应的服务节点的,用到了龙珠two:分发策略设计,主要是一致性哈希。第三,数据到了服务节点后在数据库内部是如何存储的并且当要查询某个key对应的value值时是如何快速实现的,这个用到了龙珠tree:存储和查找key-value设计,哈希函数的应用是关键。第四,这份数据是怎样落地到磁盘的,这就用到了龙珠four:持久化策略设计,绕不开的是重做日志。第五,由于整个集群是去中心化的,保持节点信息和生产数据的一致性就成为个难题,这就用到了龙珠five:节点间一致性设计,核心就是Gossip协议实现最终的一致性。第六,是不管是不是分布式数据库都配置的那就是备份和容灾策略,用到了龙珠six:备份和负载均衡设计,相对于多份副本都在一个集群上,我更倾向于通过主从集群进行备份。
龙珠one:key-value的逻辑数据结构设计(列族模型)
大家都知道分布式数据库的基本的逻辑数据结构都是key-value键值对设计,区别只在于value值的数据结构不同,我们看看三个标本数据库是怎么设计的。
Cassandra是列族模型,简单来说就是在key下面还存在另一层维度,那就是列,一个key下面有多个列(而且数量可以不固定),每个列对应一个value值,所以你可以吧多个列和这些列对应的value值作为一个整体当做是这个key对应的value值。
Redis呢?redis的value值的数据结构是可变的,可以直接是个string,也可以是个容器比如list,set等,当value是个容器时,跟cassandra的列族的概念差不多,都是key对应有多条记录,每条记录还有自己的唯一标识。
Hbase跟cassandra很类似,都是列族模型。就不再细说了。
个人觉得从实际情况来看列族模型更灵活。
龙珠two:分发策略设计(一致性哈希算法或者它的变种)
所谓分布式,那就是以为着数据要分散存储在不同主机不同节点上,所以任何分布式数据库首先要解决的就是如何把客户端发送过来的