没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
CurveFS 支持多挂载
• 背景
• 本地文件系统的文件并发读写
o write 和 read 行为
o 内核数据结构
o 多进程共享同一个文件
▪ O_APPEND
▪ 文件锁 flock/fcntl
▪ 总结
• 多挂载文件系统调研
o GPFS
▪ 简介
▪ 数据和元数据资源并发保护
▪ 数据保护:字节区间锁
▪ 元数据保护:共享写锁
▪ Allocation Map 保护
▪ 其他元数据信息保护
▪ 总结
o Lustre
▪ 简介
▪ Lustre 分布式锁管理器模型
▪ 基本锁模型
▪ 意图锁
▪ 范围锁
▪ 总结
o JuiceFS
▪ 简介
▪ JuiceFS 使用 DBServer 管理锁
▪ flock 锁
▪ fcntl 区间锁
▪ 总结
o ChubaoFS
o CephFS
▪ cephfs 使用 cap 实现分布式锁
▪ caps permission
▪ caps combination
▪ caps 管理
▪ 总结:
▪ fuse write 实例
▪ 总结
o NFS
▪ 简介
▪ 数据和元数据缓存一致性
▪ 客户端缓存
▪ 结论
• 业务场景
o AI 场景
• CurveFS 如何支持多挂载
背景
当前有较多应用场景对于文件系统有一写多读、多写的需求,即同一个文件系统可以在多
台机器上同时挂载并进行读写。例如:
▪ 云原生数据库:多台计算节点共同使用一个文件系统,其中主计算节点支持读写,
从计算节点支持读。
▪ AI 训练:多台计算节点共享同一个文件系统,基本没有写同一个文件的场景,一
个节点的写入数据是需要对其他节点立即可见。
下图描述的是 curvefs 的多挂载场景,client1 和 client2 分别在不同的节点上,挂载到
相同的文件系统 fs1 上。
一写多读场景:client1 写入文件 write(/mnt/mount1/test, 0, 4, "aaaa"),client2
读取文件 read(/mnt/mount1/test, 0, 4),期望可以读到"aaaa"。对于一个文件系统,
同一时刻只有一个节点在写入。
多写多读场景 1:client1 写入文件 write(/mnt/mount1/test, 0, 4, "aaaa") ,同时
client2 写入文件 write(/mnt/mount1/test2, 0, 4, "bbbb"),在两个节点写入完成之
后,client2 读取到 read(/mnt/mount1/test, 0, 4)为"aaaa", client1 读取到
read(/mnt/mount1/test2, 0, 4) 为"bbbb"。对于同一个文件系统,同一时刻有多个节
点写入,但写入的是不同文件。
多写多读场景 2:client1 写入文件 write(/mnt/mount1/test, 0, 4, "aaaa") ,同时
client2 写入文件 write(/mnt/mount1/test, 4, 4, "bbbb") ,在两个节点写入完成之
后,client1 和 client2 读取到 read(/mnt/mount1/test, 0, 8)为"aaaabbbb"。对于同
一个文件系统,同一时刻有多个节点写入同一个文件的不同位置。
多读多写场景 3:client1 写入文件 write(/mnt/mount1/test, 0, 4, "aaaa") ,同时
client2 写入文件 write(/mnt/mount1/test, 0, 4, "bbbb"), 在两个节点写入完成之
后,client1 和 client2 读取到 read(/mnt/mount1/test, 0, 4)要不是"aaaa", 要不是
"bbbb"。对于同一个文件系统,同一时刻有多个节点写入同一个文件的相同位置。
对于以上四中场景,curvefs 在并发读写场景下需要支持何种一致性?如何支持?是本文
需要得出的结论。
本地文件系统的文件并发读写
在调研多挂载文件系统之前,我们梳理一下本地文件系统对于文件读写的并发操作行为。
write 和 read 行为
posix 接口说明:
1. posix 并没有规定并发写行为。
This volume of POSIX.1‐2008 does not specify behavior of concurrent
writes to a file from multiple processes. Applications should use some
form of concurrency control.
2. posix 规定 read 在 write 返回后可以获取新的数据。无论读写在同一个进程还是
在不同进程,读写都要保证这样的语义。
3. POSIX requires that a read(2) that can be proved to occur after a
write() has returned will return the new data. Note that not all
filesystems are POSIX conforming.
If a read() of file data can be proven (by any means) to occur after a
write() of the data, it must reflect that write(), even if the calls
are made by different processes. A similar requirement applies to
multiple write operations to the same file position. This is needed to
guarantee the propagation of data from write() calls to subsequent
read() calls. This requirement is particularly significant for networked
file systems, where some caching schemes violate these semantics.
但是 linux 提供了一些系统调用,使得用户可以在使用这些接口实现实现期望的并发行
为。
内核数据结构
linux 支持多进程间共享打开文件,同一时刻允许多个进程同时打开文件,每个进程之间
的读写操作互不影响。为了实现这一个机制,linux 内核使用了三种数据结构表示打开的
文件。
1、每个进程的进程表中有一个记录项,包含了当前进程所有打开的文件描述符,它包含
了一个指向文件表项的指针和文件描述符标志。
2、内核中,为所有打开的文件维持一张表,它包含了以下内容:
▪ 当前文件打开状态:以何种方式打开该文件,只读、只写或者可读可写
▪ 当前文件的偏移量:当前文件指针所处的位置
▪ 指向该文件节点表的指针:节点包含当前文件的属性信息
3、每个文件的信息被封装在 v 节点表项中,包含了当前文件名、所有者以及 inode 等信
息。
三者之间的关系为:
当对文件进行写操作时,在文件表项中的文件偏移量将增加写入的字节数。如果此时文件
偏移量超过了文件长度,则更新文件长度为当前的文件偏移量
多进程共享同一个文件
因为每个文件描述符都有一个属于自己的文件表项,所以每个进程之间的文件指针偏移互
相独立,互相读写不干扰:每次 write 完成之后,文件表项的当前文件指针偏移量会立马
加上写入的字节数。
那如何协调多进程之间的数据写入呢?linux 提供了以下几种方式:
O_APPEND
如果打开文件的时候加了 O_APPEND 参数,每次写入数据前先把偏移量设置到文件末尾
文件锁 flock/fcntl
flock
flock - apply or remove an advisory lock on an open file
▪ flock 提供的文件锁是建议性质的。即一个进程可以忽略其他进程加的锁,直接对
目标文件进行读写操作。只有当前进程主动调用 flock 去检查,文件锁才会在多进
程同步中起到作用。
▪ 文件锁必须作用在一个打开的文件上。
Locks created by flock() are associated with an open file table entry.
flock() creates locks on systems's "Open file descriptions". "Open file
descriptions" are generated by open() calls.
a filedescriptor (FD) is a reference to a "Open file description". FDs
generated by dup() or fork() refer to the same "Open file description".
flock 对已打开的文件加锁时,是加在文件表项上。考虑这种场景:进程 1 打开 file1 拿
到 fd0,进程 2 打开 file1 拿到 fd1:
剩余36页未读,继续阅读
shkpwbdkak
- 粉丝: 28
- 资源: 300
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0