Distributed DB bigtable
这是设计NoSql key value DB,这里用big table(google)的作为代表,hbase是雅虎的,跟hdfs配套,dynamoDB是亚麻的,Cassandra是FB的(但这个是p2p的)
durability > avaiability > performance
read heavy => B+ tree
write heavy => LSM tree
通常那个replica group会有基数个node,这样那些paxos voting容易点有结果。然后写的时候,假设有3个点,master + 2 slaves。我们写master,master发写到write ahead log,然后slaves写,当其中一个写好以后,master就会报告说写好了。因为majority的node已经得到新数据。选leader的时候也是,要majority的node觉得新leader是leader才会成功。
用heart beat来keep check of the nodes still alive
Senario:
数据库就是正删改查(CRUD)也就是读和写,因为设计的是key-value的noSql DB所以不用考虑复杂的查询,都是通过key查一个value出来。
Service:
也是很简单,就是提供读和写
增:直接append到最后
删:直接append到最后,把值设成null
改:直接append到最后,把新的值设给key
查:二分查找(详细请看storage)
Storage:
我们首先从单机出发,把“key:value”一条一条地写,在硬盘上分块存储,每一块之间没有order,但每一块内部会有序,方便查找。
我们选择直接append到最后提高写的速度。
首先我们写到内存+Write Ahead Log里,这里是怕断电,我们多写一份WAL。内存直接append
然后如果内存够了一块,我们就把这一块排序,然后写到硬盘上。这样就产生那些有序块了。
因为优化了写,所以读的时候会慢,我们选择每一块内部建index来提速二分,然后还用bloom filter去快速排出不在块内的key。
每一块有一个自己的bloom filter和index,每次从内存开始找,找不到就去硬盘从后往前一块一块读,每块先用bloom filter快速排出一下,如果排不掉,就用index快速找一找。
这种直接append的方法时间长了会有很多重复的东西,所以可以进行定期的K路归并整理瘦身。
相关概念:外排,外二分查找,350 Intersection of Two Arrays
Scale:
其实呢,在存内存的那个表的时候,为了能快速append还能快速排序,狗用了一种叫skip list的数据结构。具体得自己拓展阅读。
index和bloom filter在写硬盘时排序顺便建立。
同样,我们通常选择按key水平sharding
狗用的是Master + Slave架构
master能管理slaves的health,heart beat,还能把consistent hashing放那里做。
过了一段时间,发现本地硬盘不够存了怎么办?其实,我们后面应该存在GFS里,本地硬盘只作为cache用,因为GFS要过网络,所以会比较慢。好处是,无限大,有replica,还有high availability
最后还有一个问题没解决,就是读写加锁的问题。因为读写同一个key时会有race condition。分布式锁可以用zookeeper或者chubby
读和写之前要先去lock server拿个锁,拿到了才可以写/读。然后后面的操作就跟之前的一样。
因为lock server本来就要存metadata,这里我们可以把consistent hashing功能也放到lock server上,master这时候就只用管理slaves的health
WAL也可以写到GFS上
Last updated