GFS学习笔记
系统交互
append
snapshot(快照)
- 收回chunck租赁,中断当前的变更
- 记录日志,并实施变更:赋值原文件(或目录)的metadata(源数据),snapshot文件指向根源文件(或目录)同样的chunck集合
- 在snapshot以后的第一个写操作的时机实施chunck的复制操作: 在master接收到client的写请求时(为了获取租约持有者),master发现chunck的引用大于1,master要求所有含有此chunck的副本本地复制该chunck,然后分配一个租约给新复制出的chunck并回复给client,client将在新chunck上进行实际的变更
master
- 命名空间管理和锁
- 命名空间不存储目录相关的信息,每个节点的变更不会导致父节点的变更
- 命名空间树结构上的每一个节点都有自己的锁(读写锁)
- 锁不是持久存在的,都是即时分配的,用过以后释放掉(会不会缓存一段时间)(节点过多,减少资源消耗)
- 某个命名空间上的操作需要两种锁
- 所有祖先节点的读锁
- 该命名空间所在节点的读锁或者写锁(视需求而定)
- 获取锁的顺序固定(防止死锁)
- 首先按照命名空间树的层级顺序获取
- 然后相同层级按照字典顺序获取
- 这样设计锁达到的效果
- 允许
- 所有节点都可以并发读
- 祖先节点读,后代节点写
- 统一目录下面所有节点并发写
- 不允许
- 祖先节点写,后代节点读或写(后代节点的任意操作都需要祖先节点的读锁,与祖先节点写操作需要的写锁互斥)
- 允许
- 副本布置
- 背景:集群高度分布式,跨越多个层级(机房/机架/机器)
- 原则:最大化可靠性和可用性(要防止机架级别的崩溃)
- 策略:跨机架(当然会跨机器)
- 效果:
- 读操作可以从距离客户端最快的机架上的机器读取,可以重复利用多个机架的带宽(读操作是选择一个replica进行读取)
- 写操作需要向分布在多个机架的副本上写入(可靠性和可用性的代价)
- chunck创建、重复制、重负载均衡
- 创建、重复制、重负载均衡是chunck副本创建的三个时机
- 创建副本
- 初始化副本的放置策略
- 选择磁盘空间利用率低的chunckserver(平衡chunckserver的磁盘利用率)
- 单台chuanckserver短时间不会创建过多副本(一般来说创建的副本就是即将形成的热点数据,后续会紧跟着写操作和读操作,要避免单台chunckserver上创建过多的人点数据)
- 跨机架(提高可靠性和可用性)
- 初始化副本的放置策略
- 重复制
- 为什么重复制?chunck的复制等级达不到标准
- 重复制的优先级?
- 与复制等级差距越大,优先级越高
- 活动文件的chunck重复制的优先级显然高于已被删除文件的chunck(参见垃圾回收)
- 提高阻塞client进程的chunck的优先级,减少运行程序失败的影响
- ?那些chunck会阻塞client进程
- ?运行程序失败的影响指的是append一类的失败导致碎片的产生吗
- 重复制目标机器的选择同chunck创建时的选择策略一样
- 优先磁盘利用率低的chunckserver
- 同一个chunckserver上的热点数据不要太多
- 跨机架
- 重复制会占据一定的网络资源(chunck传输多次)
- 限制重复制的集群和单机并发数
- 对限制重复制操作限流
- 重负载
- 目标:均衡磁盘利用率和负载
- 周期运行
- 策略
- 目标chunckserver选择同创建和重复制的原则一样
- 源chunckserver选择优先磁盘空闲率低的机器
- 垃圾回收
删除文件时不会立刻回收对应的物理存储空间,而是将这个操作延迟到周期性的垃圾回收期间执行
- 文件垃圾回收分两步进行
- 逻辑删除:
- 记录日志
- 重命名为隐藏的文件名(包含删除的时间戳)
- 物理删除:
- master 文件命名空间 周期扫描的时候,识别这些逻辑删除超过设置时间的文件并删除文件元数据和文件到chunck的引用
- 逻辑删除:
- chunck垃圾回收
- master chunck命名空间 周期扫描的时候,识别“孤儿“chunck(没有任何文件引用),并删除chunck的源数据
- 在master和chunckserver的心跳消息中,chunckserver会向master报告它含有的chunck集合,而master会回复chunckserver哪些chunck已经没有元数据了,chunckserver就可以删除这些chunck
- 优势:
- 简单、可靠:垃圾回收提供了统一的可靠的方式来清理没有引用的副本
- 文件创建时的部分失败重试会产生垃圾
- 常规删除的情况下,删除指令从master到chunckserver的传递并不可靠,需要重试,相当麻烦
- 性能优良:垃圾回收的执行都是和各种周期性任务一起执行的,批量处理提交效率,同时由于周期性任务都是在系统闲暇时段执行的,所以可以提高master的响应。
- 为误删除提供一定的恢复机制
- 简单、可靠:垃圾回收提供了统一的可靠的方式来清理没有引用的副本
- 劣势:
- 存储空间不足时占用存储空间
- 创建和删除操作频繁执行的情况下会产生大量不能立刻回收的存储空间
- 优化:
- 文件被多次删除的情况下加快回收
- 自定义回收策略
- 文件垃圾回收分两步进行
欢迎使用Markdown编辑器写博客
本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:
- Markdown和扩展Markdown简洁的语法
- 代码块高亮
- 图片链接和图片上传
- LaTex数学公式
- UML序列图和流程图
- 离线写博客
- 导入导出Markdown文件
- 丰富的快捷键
快捷键
- 加粗
Ctrl + B
- 斜体
Ctrl + I
- 引用
Ctrl + Q
- 插入链接
Ctrl + L
- 插入代码
Ctrl + K
- 插入图片
Ctrl + G
- 提升标题
Ctrl + H
- 有序列表
Ctrl + O
- 无序列表
Ctrl + U
- 横线
Ctrl + R
- 撤销
Ctrl + Z
- 重做
Ctrl + Y
Markdown及扩展
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]
使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。
本编辑器支持 Markdown Extra , 扩展了很多好用的功能。具体请参考Github.
表格
Markdown Extra 表格语法:
项目 | 价格 |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
可以使用冒号来定义对齐方式:
项目 | 价格 | 数量 |
---|---|---|
Computer | 1600 元 | 5 |
Phone | 12 元 | 12 |
Pipe | 1 元 | 234 |
定义列表
-
Markdown Extra 定义列表语法: 项目1 项目2
- 定义 A
- 定义 B 项目3
- 定义 C
-
定义 D
定义D内容
代码块
代码块语法遵循标准markdown代码,例如:
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''
脚注
生成一个脚注