3.3 原子性的记录追加GFS 提供了一种原子性的追加操作称为记录追加:
- 在传统的写操作中,客户端指定数据写入的位置在文件中的偏移量,这样对同一个文件区域的并行写操作不能进行序列化:该区域最终可能包含来自多个客户端的数据片段 。
- 然而,在一个记录追加操作中,客户端只需要指定数据,GFS 将数据至少一次原子性地追加到文件(如,一个连续的字节序列)的 GFS 选定的一个偏移位置,并将这个偏移位置返回给客户端 。这与在没有竞争的情况下,Uinx 下多个并发写操作向一个使用 O_APPEND 选项打开的文件中写数据相似 。
记录追加操作是修改操作中的一种,遵循 3.1 中介绍的控制流程,只在 Primary 上有一些额外的逻辑 。客户端把数据推送到文件最后一个块的所有的副本上,然后将向 Primary 发送它的请求 。Primary 会检查这次追加操作是否使块的大小超过了最大尺寸(64MB) 。
- 如果超过,它将把这个块填充满,通知所有的 Secondary 副本进行相同的操作,并回复客户端表明这个操作将在下一个块上重新执行 。(记录追加操作的数据大小严格控制在最大尺寸的 1/4 以内,以确保最坏情况下碎片的数量在一个可接受范围 。)
- 通常情况下,如果记录不超过最大尺寸,Primary 将数据追加到它的副本上,然后通知Secondary 把数据写到与 Primary 相同的位置上,最后回复客户端操作成功 。
3.4 快照快照操作几乎瞬间为一个文件或一个目录树(源)创建一个拷贝,并且不会对正在进行的其它操作造成任何影响 。我们的用户使用它为一个巨大的数据集创建一个拷贝分支(而且经常递归的对拷贝进行拷贝),或者是在尝试变化之前对当前的状态创建检查点,之后可以轻松的进行提交或回滚 。
像 AFS 一样,我们使用标准的写时拷贝(Copy-On-Write)技术来实现快照 。当 Master 接收到一个快照请求时,它先取消快照相关的文件块的所有租约 。这确保了任何后面对这些块的写操作将需要与 Master 进行交互,以获取租约的持有者,这将为 Master 提供一个为块创建一个新拷贝的机会 。
写时拷贝:在被修改时才真正执行拷贝在租约被取消或者过期后,Master 将这些操作记录到磁盘,然后以复制源文件或目录树元数据的方式来在内存上执行这些日志记录 。新创建的快照文件与源文件指向相同的块 。
经验总结扩展阅读
- google发送的通知在哪 谷歌发送的通知在哪里找
- JAVA的File对象
- Codeforces 1670 E. Hemose on the Tree
- 二 沁恒CH32V003: Ubuntu20.04 MRS和Makefile开发环境配置
- 驱动开发:内核监控FileObject文件回调
- 伤感英文句子带翻译 英文扎心短句大全
- 齐博X1-栏目的调用2
- Blazor组件自做十一 : File System Access 文件系统访问 组件
- How to get the return value of the setTimeout inner function in js All In One
- System.IO.FileSystemWatcher的坑
