- 主题:samba 和 nfs 对于几个客户端打开同一个文件是怎么处理的?
我们经常碰到多个进程打开同一个文件读写。最经典的处理方式是映射到同一个文件系统缓冲区让这两个进程随意读写。如果没有协调好,可能数据内容就乱了。
不然 posix 也提供了 flock(), win32api 提供了 LockFileEx() 让应用程序自行加锁。这需要应用程序额外的编程。因为这些系统调用都在同一台机器上面,所以很容易实现。但甚少有软件使用这套 API,大多数软件都假定自己是文件唯一的使用者。
然而,这种控制方式对于网络文件系统却难以实现。不知道 smb/nfs 是怎么处理的。以及有没有好的办法真正地解决这个问题?
--
FROM 59.60.25.*
NFS是顶层交互协议,高版本(v4)提供了并发相关的特性
其他的都是看底层具体实现了
云/HPC领域这是一个大热点,各种方案
【 在 hgoldfish 的大作中提到: 】
: 我们经常碰到多个进程打开同一个文件读写。最经典的处理方式是映射到同一个文件系统缓冲区让这两个进程随意读写。如果没有协调好,可能数据内容就乱了。
: 不然 posix 也提供了 flock(), win32api 提供了 LockFileEx() 让应用程序自行加锁。这需要应用程序额外的编程。因为这些系统调用都在同一台机器上面,所以很容易实现。但甚少有软件使用这套 API,大多数软件都假定自己是文件唯一的使用者。
: 然而,这种控制方式对于网络文件系统却难以实现。不知道 smb/nfs 是怎么处理的。以及有没有好的办法真正地解决这个问题?
: ...................
--
修改:oldwatch FROM 222.70.19.*
FROM 222.70.19.*
有哪些方案比较好的吗?
想起来了,阿里云也有提供 posix nas,支持本地挂载。不知道支不支持在多个服务器之间挂载。
【 在 oldwatch 的大作中提到: 】
: NFS是顶层交互协议,高版本(v4)提供了并发相关的特性
: 其他的都是看底层具体实现了
: 云/HPC领域这是一个大热点,各种方案
: ...................
--
FROM 59.60.25.*
跨服务器共享是基本功能了,否则就和本地块存储没区别了
A家单独列了一个Fsx的产品做这个,阿里好像就直接打包在NFS的配置项里了
【 在 hgoldfish 的大作中提到: 】
: 有哪些方案比较好的吗?
: 想起来了,阿里云也有提供 posix nas,支持本地挂载。不知道支不支持在多个服务器之间挂载。
--
FROM 222.70.19.*
我昨天晚上看完了阿里云 NAS 的文档,发现没讲到有没有什么机制用于处理访问冲突。那估计要应用自己使用 flock() 或者 .lock 文件自行处理了。
【 在 oldwatch 的大作中提到: 】
: 跨服务器共享是基本功能了,否则就和本地块存储没区别了
: A家单独列了一个Fsx的产品做这个,阿里好像就直接打包在NFS的配置项里了
--
FROM 59.60.25.*
nfsv4只支持写锁,如果要更高级的并发控制得找其他方案
Lustre之类的
【 在 hgoldfish 的大作中提到: 】
: 我昨天晚上看完了阿里云 NAS 的文档,发现没讲到有没有什么机制用于处理访问冲突。那估计要应用自己使用 flock() 或者 .lock 文件自行处理了。
--
FROM 222.70.19.*
是。这个东东比较适合程序员使用。要求应用程序能够意识到自己在使用远程文件系统。
我最近就在用这种远程文件系统,最讨厌的事情是 posix 的 open() 没有异步版本。所以如果我在协程里面使用的话,会卡住我一整个线程。每个 open() 我都不得不放到线程池里面去执行。
【 在 oldwatch 的大作中提到: 】
: nfsv4只支持写锁,如果要更高级的并发控制得找其他方案
: Lustre之类的
--
FROM 59.60.25.*
没办法,这儿拖后腿的是文件系统的古早接口
【 在 hgoldfish 的大作中提到: 】
: 是。这个东东比较适合程序员使用。要求应用程序能够意识到自己在使用远程文件系统。
: 我最近就在用这种远程文件系统,最讨厌的事情是 posix 的 open() 没有异步版本。所以如果我在协程里面使用的话,会卡住我一整个线程。每个 open() 我都不得不放到线程池里面去执行。
--
FROM 222.70.19.*
这种古老的协议,大部分都是只能同时一个文件打开操作,一旦打开了该文件,其他文件打开请求会失败。
不过我印象中smb协议可以打开文件的时候有个共享标志,之后可以共享读,具体不记得了,你可以看看文档。
--
修改:nebulabox FROM 183.192.10.*
FROM 183.192.10.*