我运行了一个Proxmox集群,在这个集群上,我在专用网络上有一些虚拟机,其中有一个(Proxmox管理的)CEPH存储后端用于VM磁盘.
运行“Ubuntu 16.04服务器最小虚拟机”的一个(KVM)VM配置了第二个“硬盘”,设置为一个磁盘ZFS池“存储”,使用
zpool create storage /dev/sdb1
它被自动安装到/ storage.该VM还运行nfs-kernel-server.
然后通过nfs导出该目录,并在/ etc / exports中包含以下行:
/storage 10.10.0.0/16(rw,sync)
我从另外两台机器(一台运行Ubuntu 14.04的虚拟机,一台运行Ubuntu 16.04服务器的物理机)安装此导出
mount -t nfs4 10.10.3.1:/storage /mnt
由于这是我测试存储设置的操场,计划的两个Web服务器托管一个写入Berkeley DB文件的旧perl应用程序,我决定以一种简单的方式测试并发写入,使用简单的PHP脚本测试我的共享存储后端:
<?PHP $line = str_repeat($argv[1],30) . "\n"; for ($i = 1; $i <= 10000; $i++) { $of = fopen("test.txt","a") or DIE("can't open output file\n"); fwrite($of,sprintf("%04d-",$i) . $line); fclose($of); } ?>
我转到共享存储目录(这也是PHP脚本所在的位置),并使用它运行它
PHP test.PHP 1
从第一台远程机器,并与
从第二台机器.
我的问题是有些写入似乎没有到达目标文件,即我得到这样的输出:
9286-222222222222222222222222222222 9287-222222222222222222222222222222 9288-222222222222222222222222222222 9289-222222222222222222222222222222 7473-111111111111111111111111111111 7474-111111111111111111111111111111 7475-111111111111111111111111111111 7476-111111111111111111111111111111 7477-111111111111111111111111111111 7478-111111111111111111111111111111 7479-111111111111111111111111111111 9297-222222222222222222222222222222 9298-222222222222222222222222222222 7481-111111111111111111111111111111 9300-222222222222222222222222222222 7482-111111111111111111111111111111 9302-222222222222222222222222222222 7484-111111111111111111111111111111
并验证该行未被缓存并写入文件中的其他位置:
nas:/storage# grep "9290-" test.txt 9290-111111111111111111111111111111 nas:/storage#
即它(其中包括)缺失了
9290-222222222222222222222222222222
线.在这一点上,我希望我只是缺少一些配置参数或设置过程中的一两步来解决这个问题.
编辑:我只是注意到写入似乎彼此阻塞,即行号之间的间隙总是与来自另一个远程“写入器”的交错写入的数量相对应.尽管如此,我仍然没有接近解释为什么会发生这种情况以及如何解决这个问题.
此外,我在vm硬盘的proxmox上激活了“Discard”和“IO thread”,并禁用了这两个选项,没有效果(不认为它会,但仍然检查).行为是一样的.
解决方法
好吧,显然Berkeley DB为并发访问提供了锁定机制,因此我的“简单测试场景”不足以确保在应用程序级别上发生锁定;我的测试脚本没有做任何类似的事情,因此测试与用例不匹配.
因此,我正在考虑回答这个问题.谢谢你的回复!