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

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

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

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

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

1
2
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 @   草屋主人  阅读(2974)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示