集群中 NFS 上的 SQLite 数据库。我会得到数据损坏吗?

SQLite DB on NFS in cluster. Will I get data corruption?

我将 SQLite 用于我想在 NFS 上保留的数据库。我的集群中的任何 VM 都可能在某个时候关闭,在这种情况下 docker swarm 将在另一个 VM 上启动一个副本来接管。

不幸的是,NFS 似乎不支持文件锁定,所以我将其关闭(通过使用 "nolock" 挂载),现在我担心是否可以确保数据不会被损坏。

我能想到的场景是:其中一个 VM 与 Internet 断开连接的时间刚好足以让另一个副本启动并接管流量,然后它返回并写入数据库 --> 损坏的数据

如果支持文件锁定,这样使用NFS是不是省事了? 当指定 "nolock" 时,我假设它不是正确的吗?

documentationnolock:

This is useful for accessing a database on a filesystem that does not support locking. Caution: Database corruption might result if two or more processes write to the same database and any one of those processes uses nolock=1.

另一种方法是使用 unix-dotfile VFS,它通过创建一个单独的文件来实现锁定。这甚至适用于无锁 NFS,但是

  • 它比 'real' 锁定慢;
  • 它防止任何类型的并发(只有一个客户端可以访问数据库,即使是读取);和
  • 如果您的客户端在事务处理过程中死亡,锁定文件将保留并且必须手动删除。