分布式数据库需要考虑的(BigTable VS Dynamo)
在设计,评价分布式数据库的时候需要考虑一些最基本的特性,我想这些特性可能包括:
1. 存储系统:一种是类似BigTable将存储交给GFS去做,GFS会保证写入数据的完整;另外一种是类似Dynamo的系统,每个Node独自管理自己的存储磁盘。前者直到一定的数据写入磁盘才将数据保存为N份,所以如果slave node提供只读的话,可能会比active的partition晚不少(当然每次write都强制sync到slave也不是不可以,但是比较复杂);而后者每次write必须复制到多台机器,其slave node自然能够提供读。
2. 存储格式:一种是类似BigTable存储本结构化数据,比如表里面有列等信息;一种是类似Dynamo等只存储K-V,value可以是任意格式,app负责解析。
3. 存储体系:一种是类似BigTable的分布式B-tree,一种是类似Dynamo的分布式Hash。分布式B实现起来比较复杂,但是功能丰富,容易做负载均衡;而分布式Hash实现起来比较简单,但是不能支持诸如RangeQuery等操作,做负载均衡也不是很容易。
4. 一致性级别:一种是类似BigTable提供的强一致性,所有写入的数据都保证是一致的(Read Commit);一种是Dynamo提供的可调节的一致性,根据N,R,W的关系和业务的具体场景来调节。显然,这一点上后者比前者灵活一些,比如Dynamo可以优化写,保证只要集群内还有一台机器可用client就可以写入,但是BigTable保证不了。
5. Scalability问题:主要就是随着数据的增加如何扩容,BigTable随着数据的增加会开始split,split的时候要扫描数据(这是可以优化的),然后就可以自由扩展了;而Dynamo在分裂的时候由于采用了consistent hash也很方便,避免了全部数据的扫描。
6. 支持Map/Reduce:很多业务分析都是基于Map/Reduce做的,但是online和offline的一个很大不同是online以随机访问为主,偏向qps;而offline以顺序访问为主,偏向throughput,所以要同时支持的好也不同意,这点倒是需要权衡的,只在不行就优化一个方向,否则两个都做,两个都搞不好反而不好。