目录:
-
GFS
-
BigT able(SSTable)
-
Cassandra
-
MapReduce
-
Spark
-
Zookeeper
-
Kafka
-
GFS,
https://pdos.csail.mit.edu/6.824/papers/gfs.pdf
GFS(Google file system): a distributed file system, 用来存储数据,作为BigTable(SortedString Table的底层),
也是HDFS的真身。把文件放在很多个disks上,能够满足大量读写需求。
GFS的目的: -
Fault-tolerance: 假设有1000个机器,每个机器每年会坏一次,那么每天就有大概3个机器会挂。如何确保数据安
全? -
Performance: 大量的同时读写,如何处理I/O
-
Consistency:如果有多个人同时读写,如何确保最后读到的是最新的数据
-
Efficiency:如何最优使用网络bandwidth来传输数据
在GFS之前的文件系统: -
每个文件分成blocks (4096byte),每个文件有自己的Metadata,记录文件名/时间/size/和blocks的diskoffset
-
Master-slave 系统:数据都存放在master上,slave是备份,master挂了,找一个slave顶上去
-
缺点:随机访问速度慢,多进程读写需要锁进程,数据存放在一个master严重依赖badnwidth
GFS的结构: -
client,比如SSTable,read/writefile to GFS
-
Master,这里的master跟一般文件系统的不一样,不存放数据,memory中存放
-
Chunk servers,存放数据的metadata和一个hashtable[filename][chunk_index] = chunk_server
-
chunks,和一般的4096 block不同, GFS的数据每一块比较大,default用的是64M,这样metadata就比较小了。
建立在小数据碎片很小的基础上。 -
Megadata, 64Byte 每个chunk
-
Replica: 每个数据存3次,在不同的chunkserver上,以防止chunk server 挂了
Read:读数据: -
Client 发送 filename 到master
-
在master 找到这个file的metadata, 然后找到相应的chunk list,最后在hashmap里找相应的chunk serverlist,返
回给client,这些数据会在client的cache里 -
Client读chunk server list, 对于每个chunk,对应最多3个server,根据IP地址选择最近的server来读取数据
*4. 实际上会有一个 version的信息,在每个数据里和chunk server list,如果在server数据里的version和chunk server
不同就重新连接master
*5. Client 会吧server list 放进cache里,这样就不需要每次都问master了
Write: 写数据:(这里的写指的是modify) -
Client发 filename到master
-
master恢复chunk server list,这里跟读一样,但是chunkservers分成两种,一个叫primaryreplica,一种叫
secondary replica -
把数据写到三个replica的cache里(!!不是硬盘,是LRU cache)
-
Client 发写请求给primary replica,primary把最新的文件写到硬盘
-
Primary 把写请求 forward给两个secondary, secondary 写data
-
写完之后secondary告诉primary写好了
-
primary 回复client, 如果出错就重复3-7
*和传统方法不一样的是,GFS写数据提供recordappend方法,用来保证多client同时写
系统优化: -
一般不需要第二个master, 如果挂了去重启就行,但是master会存一个log到硬盘,重启之后从log恢复state
-
如何判断chunk server是不是挂了:heartbeat message
-
如何判断一个chunk server上某个block挂了: Achunk is broken up into 64 KB blocks. Each has a
corresponding 32 bit checksum.