当心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命令。
虽然断电,系统意外崩溃的情况比较少,但是如果是线上系统,还是应该考虑的,不然后悔就来不及了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述