为什么多个客户端同时对同一文件进行操作时,会出现文件不存在或者文件不完整的情况
现象描述
当客户端A和客户端B同时挂载SFS Turbo文件系统,并对同一个SFS Turbo文件系统进行操作时,可能会出现以下三种典型场景:
- 场景一:客户端A新增文件或重命名文件,后由客户端B对该文件进行读操作,返回文件不存在。
- 场景二:两个客户端同时写某个文件,出现写完后文件不完整。
- 场景三:两个客户端同时写某个文件,出现写报错。
定位思路
SFS Turbo作为共享文件系统,由多个客户端共享使用。由于存在客户端缓存和服务端缓存,SFS Turbo仅保证最终一致性。
挂载客户端使用NFS协议,其缓存由NFS机制控制,不同操作系统版本行为不同。由于SFS Turbo后端为分布式系统,有多个NFS服务器提供服务,当客户端挂载在不同NFS服务器上时,可能出现数据同步慢的情况。
- 场景一:客户端A写新文件后,由于缓存未更新,客户端B目录项缓存中没有新文件的信息,因此返回文件不存在。
- 场景二:两个客户端对文件进行追加写,追加写会从文件size位置开始追加。客户端A先写了之后,客户端B缓存中size未更新,因此会将客户端A写的内容进行覆盖,导致文件部分丢失。
- 场景三:两个客户端对文件进行覆盖写,覆盖写会先将文件size置为0,再进行写。当客户端A进行写操作时,客户端B将size置为0,此时导致客户端A写入位置超过文件长度,导致报错。
解决方法
- 多个客户端双写:业务应避免多个客户端对同一文件同时进行写操作。如果业务需要同时写,需要对业务进行调整。可令不同客户端写入不同文件,再对文件进行合并;或者多个客户端协商,指定主客户端进行写操作。
- 不同客户端写后读:需要避免缓存影响,可参考同时挂载至两个服务器的文件系统数据存在延时怎么办?关闭客户端缓存,同时将客户端通过IP挂载到同一个NFS服务器上,避免服务端缓存影响。
关闭缓存和IP挂载会影响SFS Turbo的性能,使得性能无法达到对应的规格,请谨慎评估再进行关闭缓存或IP挂载操作。