What is BigTable? 分布式nosql database
BigTable
HBase
Cassandra
DynamoDB
文件系统:简单读写文件操作
数据库系统: 建立在文件系统,负责主治把一些数据存到文件系统,对外的接口比较方便操作数据。
数据最终都会存到文件里面。
从文件系统的基础上思考。直接在硬盘中对数据进行排序+二分查找。
修改文件内容。1.直接在文件中修改,变大,之后所有内容需要移动。2.读取整个文件,修改好了,将原文件删除,重新写入新文件。耗费时间,每次要读出写入不变的内容。3. ✅不修改,直接append操作追加一条记录在文件最后面。非常快。
bigTable为了写优化,怎么识别哪个是最新的,所有记录后面加时间戳。没有顺序怎么二分 1.每一块都是内部有序2.写到时候只有最后一块是无序的,并且隔一段是按整理成有序。
块越写越多,有很多重复。除了最后一个块其他是有序块,定期k路归并。
最后一个无序块满了怎么变成有序?一开始存在内存里面,内存排序+1次硬盘写入+1次硬盘写log
内存块满256兆,序列化(内存数据变成字符串),写到硬盘
机器挂了,内存没了? write ahead log(WAL) 每次写内存,事先写硬盘。只支持append操作
读出过程。从最后一个内存中的无序块找,从后往前找有序块(硬盘上的二分搜索)。先check bloom filter for each file has this key, use the index to find the value for the key.
建立index:把一些key放入内存作为index(key, address),缩小范围,在范围内二分。实际:b tree index
bloom filter: key算hash,看值是否标红(1),表明是否在块中(标红可能在块中,0表明不可能)
hash值都标红。多个hash函数,提高bloom filter判断率。
精确度:哈希函数个数,位数组长度,加入的字符串数目。
有序块:SSTable = sorted string table
无序块:跳表skip list
Scale
sharding
consistent hash(row key: name) 横着拆表
多台机器 master+slave
master (consistent hash map) [key, server address]
slave 每一个slave存一个小表 tablet server
client to master: 1. read key
master to client: 2. get the row key from key, use the row key to get serverId = 1
client to slave Server1 3. read key
memory: a) check memory skip list b) check bloom filter c) check index disk: a) find the value in SSTable
slave server to client 4. value
client to master: 1. write key
master to client: 2. get the row key from key, use the row key to get serverId
client to slave Server1 3. write key, value
memory: a) 写一次write ahead log b) 直接把数据放到内存里面 disk: a) 如果skipList满了就统一写到硬盘
现在所有的数据都存在slave server local disk里面。每台机器数据越写越多存不下怎么办
把所有数据存在GFS里面。pros: 1. disk size 2. replica 3. failure and recovery
k路归并: k个已经排好序的数组,合并成一个有序数组
外排序:数组大到内存放不下。
8G无序-分四次读到内存->2G内存-数据排好后放回硬盘->4*2G有序数组-利用k路归并,每次将少量数据读到内存的堆中->2G内存-对中选取最小元素写回硬盘->8G有序数组
GFS vs Big Table
读写文件 增删改查
类似文件系统 类似大数据版的excel
使用者 任何文件 GFS
结构化文件 big Table 形成文件类似
B-Tree & B+ Tree
BST
二叉树边多差数,降低树高,在硬盘读取时间降低。比较在内存中进行,可以忽略不计。
磁盘块: key, data, 指针。cons: data占用太多空间,key数量小,叉数小。
B+ Tree
非叶子节点不存data,data放到叶子节点。