新安装的MogileFS::Server是2.70版本,发现一个问题,即文件没有按策略保留2份副本。这是默认策略:
mindevcount参数显示最少应保留2个副本。但是实际观察到文件只保留了一份:
同时tracker的日志里有如下报错:
Apr 25 15:27:37 tracker mogilefsd[6018]: Child 39040 (replicate) died: 256 (UNEXPECTED)
Apr 25 15:27:37 tracker mogilefsd[6018]: Job replicate has only 0, wants 1, making 1.
Apr 25 15:27:38 tracker mogilefsd[39050]: crash log: Modification of a read-only value attempted at /usr/local/share/perl/5.14.2/Sys/Syscall.pm line 225.
得到邮件列表上Eric Wong大虾的指点,得知这是Sys::Syscall 0.25版本的一个bug,需要降级到0.23。在tracker上运行如下命令:
cpanm http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
安装0.23版本的Sys::Syscall,然后重启mogilefsd服务,问题解决了。
新上传的文件,可以看到保存了2份副本:
它们位于不同node的不同device上,保证高可用。
八卦下,Sys::Syscall的作者是Brad Fitzpatrick,他也是Mogilefs和Memcache的作者。而Eric Wong同学在Ruby社区也小有知名度,是Web框架Unicorn的作者。