gmirror+ggate != DRBD

Freebsd下没有类似的专有文件系统,但是可以通过gmirror和ggate达到类似的效果。
gmirror是geom中一个用于做软RAID的工具(RAID-0或者RAID-1)
ggate是一个类似于NFS的东西,用于把一块磁盘导出供另外一台机器挂载。
于是做法就是
首先在两台服务器,A和B上各找一块大小相同的物理硬盘,然后用ggated导出。(注意,这两块硬盘坚决不能在A和B上挂载)
然后在另外一台服务器C上,用ggatec挂载上这两块硬盘。挂载前首先要确认没有其它的服务器也挂载了这两块硬盘。
然后在C上用gmirror做RAID-1。
然后用把做好的RAID-1挂载在C的文件系统中。
如果某两台机器间的网络发生问题,如C和A之间,那么对于每个读写操作,ggate会返回EIO。于是gmirror就会自动把这台机器从RAID中移除出去。之后网络恢复后需要人工处理。
但是这样做有个问题。
文件的信息分两部分,meta data(inode等)和实际数据。而通常文件系统为了加速文件系统的性能都是采用的异步写的方式。例如要删除一个文件,它可能先修改inode信息,然后再在适当的时候刷新文件数据到磁盘。
此时,如果另外一台机器正在读这个文件,它应该是先读inode节点。然后再根据节点去找文件。由于主机间缺乏锁机制,如果这删除和读这两个操作在两台机器上交替进行,那么可能读到的就是不正确的数据。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥