系统设计5:Google三剑客
补充材料:
三剑客:
http://blog.csdn.net/koder2009/article/details/3964878
http://blog.csdn.net/koder2009/article/details/3985329
http://blog.csdn.net/koder2009/article/details/3991938
http://blog.csdn.net/wangxiaoqin00007/article/details/7091686
http://www.mitbbs.com/article_t/JobHunting/32058103.html
https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/gfs-sosp2003.pdf
https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/bigtable-osdi06.pdf
https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf
GFS:
https://www.slideshare.net/romain_jacotin/the-google-file-system-gfs
https://www.slideshare.net/mansu/gfs
http://os.51cto.com/art/201008/218364_all.htm
数据备份
https://www.slideshare.net/spf13/replication-durability-and-disaster-recovery
BigTable:
https://www.slideshare.net/romain_jacotin/undestand-google-bigtable-is-as-easy-as-playing-lego-bricks-lecture-by-romain-jacotin
https://www.slideshare.net/vanjakom/google-bigtable-paper-presentation-5078506
https://www.cs.rutgers.edu/~pxk/417/notes/content/bigtable.html
http://blog.jobbole.com/1344/
Bloom filter:
https://llimllib.github.io/bloomfilter-tutorial/
https://en.wikipedia.org/wiki/Bloom_filter
https://medium.com/the-story/what-are-bloom-filters-1ec2a50c68ff
key-value:
https://www.slideshare.net/kingherc/bigtable-and-dynamo
MapReduce:
https://www.slideshare.net/romain_jacotin/the-google-mapreduce
https://www.zhihu.com/question/26045727
倒排索引:
http://blog.jobbole.com/82607/
同字母异形字:
http://www.lintcode.com/en/problem/anagrams/
https://adhoop.wordpress.com/2012/02/14/generate-a-list-of-anagrams-round-1/
海量数据处理:
http://blog.csdn.net/v_july_v/article/details/6279498
http://blog.csdn.net/v_july_v/article/details/7382693
问题:
- 如何设计一个分布式数据库/文件系统
- Word Count,倒排索引,Anagrams
如何设计一个GFS?
- 场景是什么?
- 如何写文件?
- Linux/Windows:metadata + Index -> blocks(1024Byte)
- 文件大怎么办:在Blocks上面装一层Chunks(64MB)->减少metadata,减少traffic,对于小文件有浪费
- 继续变大呢:分布式,master-slave,master知道某个数据在哪个机器上,但不知道chunk具体的位置
- 如何发现一个chunk数据损坏:checksum in each block
- 如何恢复数据:
- 3个备份
- 如何选择chunk server
- 空间剩余多的优先
- 新数据分散
- 2+1策略:两个在同一个机房,一个在另外的机房
- 如何恢复
- 发现checksum错
- 找master
- master告诉slave最近的数据在哪里
- slave找到数据备份,拷贝过来
- 如何发现一个chunk server跪了:心跳
- 如何恢复Chunk Server的数据
- chunk server heartbeat table
- data location table
- repairing table
- chunk server再上线,认为所有数据都过期了
- 如何避免热点问题
- chunk freq table
- server stats
- 将热数据复制到更多的机器上
- 如何读数据
- client向master询问chunk在哪里,master返回按距离排序的server list
- client像最近的chunk server读数据
- 如何写数据
- client向master请求三个chunkserver,一个主机,两个备份
- 写到主机的内存
- 主机将数据发给一个备份机
- 备份机发给另一个备份机
- 三个备份都完成了,告诉client
- client告诉主机,可以写入了
- 主机告诉备份机写入
- 主机告诉client,已经全部写入磁盘
如何设计BigTable?
- 如何支持单点查询和范围查询?
- 按key排序
- 怎么存一个大表?
- Metadata of table
- tablet
- 如何存一个更大的表?
- 大表拆成小表
- 小表拆成更小的
- 如何向表写数据?
- 内存存index,磁盘存小表
- 小表不可修改,只能append或者加新表
- 小表内部有序,之间无序
- 先写到内存,在回写到硬盘
- 内存表太大,回写硬盘
- 如何避免系统失败:事务和log
- 如何读数据
- 每个表(内存、硬盘)都找(之间无序)
- 硬盘查找,慢
- 如何改进
- 每个小表建立索引(block级别),放内存
- 先查索引,再查磁盘
- 如何改进2
- bloomfilter
- 不在一定准
- 在可能准
- Bloom filter
- 如何把表存到GFS
- mem table-》存log
- 小小table-》GFS chunk
- 表的逻辑是什么
- 列族
- 时间戳
- 逻辑表如何转换为物理表
- key:row + column + timestamp
- big table 架构
如何设计MapReduce
如何计算一个1TB的k-v的数据?
Input Split Map Shuffle Reduce Finalize