您的位置:首页 > 其它

当心ttserver(tokyo tyrant)在系统崩溃或断电的时候丢失数据

2010-09-03 11:32 603 查看
[文章作者:孙立 链接:http://www.cnblogs.com/sunli/ 更新时间:2010-09-03]

在我前面的文章介绍了ttserver非常高的性能,也介绍过在大数据量下的可能出现的不稳定因素,但是如果是数据不是特别大(一般不要超过内存太多),那么使用ttserver还是非常合适的。最近在公司的测试环境中,出现了ttserver的数据全部为空的现象,问运维部门才知道出现了意外断电,部分测试系统记录了日志可以恢复,部分没有记录日志,数据就永远丢失了,还好是测试环境。其中一个ttserver已经跑了一年多了,居然数据都出现全部丢失的情况。

是ttserver的问题还是系统的问题

下面我们来具体测试一下,在测试服务器启动两个ttserver,不记录日志

<?php
$mem=new Memcache();
$mem->addServer ("192.168.13.169",1979,false,1,100);
$mem->addServer ("192.168.13.169",1978,false,1,100);
$start=microtime(true);
for($i=0;$i<50000;$i++){
$mem->add("bbs_pass_".$i,"INFO 127122222 a b c d{....}");
}
print_r($mem->getExtendedStats());
echo microtime(true)-$start;
?>


打印出两个ttserver各有30000条数据,马上把机器的电源给拔了。启动机器。启动ttserver 。telnet连上ttserver,发现两个端口的ttserver都只剩下10000条数据了。

结论:ttserver意外崩溃,进程直接kill -9 是不会丢失数据的,如果系统断电是会丢失数据的。这应该是ttserver只是把数据写到文件系统,并没有flush到磁盘造成的。

如何解决

ttserver 其实提供了一个同步命令sync(作者肯定知道丢失数据的问题,所以才有这个命令),可以把数据flush到磁盘,不过每次都调用,性能将会急剧下降。为了不降低性能,数据可靠性得到保证,可以采用记录日志的方式,出现意外断电可以从日志恢复数据。还可以使用主从复制,master丢失数据,slave的数据还在(本人推荐),也可以定期的执行下sync命令。

虽然断电,系统意外崩溃的情况比较少,但是如果是线上系统,还是应该考虑的,不然后悔就来不及了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐