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

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

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

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

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

ttserver -port 1978 -dmn -pid /data/ttserver/test1/pid /data/ttserver/test1/casket.tch#bnum=1000000
ttserver -port 1979 -dmn -pid /data/ttserver/test2/pid /data/ttserver/test2/casket.tch#bnum=1000000

 

       分别往两个端口写入10000条数据,kill -9 pid掉进程,再启动ttserver,查看数据是否丢失,发现没有丢失,这里可以判断ttserver意外崩溃是不会丢失数据的。

       下面再来测试系统崩溃和断电测试,先用下面的代码往两个端口的ttserver写50000条数据:

       

<?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命令。

    虽然断电,系统意外崩溃的情况比较少,但是如果是线上系统,还是应该考虑的,不然后悔就来不及了。

 

posted @ 2010-09-03 11:32 草屋主人 阅读(...) 评论(...) 编辑 收藏