作者:老陈 | 来源:互联网 | 2023-06-04 15:38
前面的一些文章讲到了memcache以及TT,memcache内存数据库很好理解,数据存储在内存中,重启服务器或者重启memcahce进程,数据是会丢失的。那么我们也提到过TTServer数据是
前面的一些文章讲到了memcache以及TT,memcache内存数据库很好理解,数据存储在内存中,重启服务器或者重启memcahce进程,数据是会丢失的。那么我们也提到过TTServer数据是持久存储的,它的数据真是绝对安全吗?
下面我们来具体测试一下,在测试服务器启动两个ttserver,不记录日志。
1
2
|
ttserver -port 1978 -dmn -pid /data/ttserver/test1/pid /data/ttserver/test1/casket.tch
ttserver -port 1979 -dmn -pid /data/ttserver/test2/pid /data/ttserver/test2/casket.tch
|
根据网上的测试方法:分别往两个端口写入10000条数据,kill -9 pid掉进程,再启动ttserver,查看数据是否丢失,发现没有丢失,这里可以判断ttserver意外崩溃是不会丢失数据的。
下面再来断电测试,先用下面的代码往两个端口的ttserver写50000条数据:
php
$mem
=
new
Memcache();
$mem
->
addServer (
"
127.0.0.1
"
,
1979
,
false
,
1
,
100
);
$mem
->
addServer (
"
127.9.9.1
"
,
1978
,
false
,
1
,
100
);
$start
=
microtime
(
true
);
for
(
$i
=
0
;
$i
<
50000
;
$i
++
){
$mem
->
add(
"test
_
"
.
$i
,
"
INFO 127122222 a b c d{....}
"
);
}
print_r
(
$mem
->
getExtendedStats());
echo
microtime
(
true
)
-
$start
;
?>
执行过程中,拔掉机器电源后,再重新启动机器,然后启动ttserver 。发现两个端口的ttserver都只剩下16000条数据(我测试的结果)。
所以:ttserver意外崩溃,例如进程直接kill -9 是不会丢失数据的,如果系统断电是会丢失数据的。这应该是ttserver只是把数据写到文件系统,并没有flush到磁盘造成的。
如何解决(参考网上资料)
ttserver 其实提供了一个同步命令sync,可以把数据flush到磁盘,不过每次都调用,性能将会急剧下降。为了不降低性能,数据可靠性得到保证,可以采用记录日志的方式,出现意外断电可以从日志恢复数据。还可以使用主从复制,master丢失数据,slave的数据还在(推荐),也可以定期的执行下sync命令。
其实,这个与mysql数据库事务日志刷新级别有极其相似的原理。TC支持异步的写入机制,就是说写入的数据可以不一定刷到磁盘上,可以等到一定条件后(比如间隔多长时间)再进行同步操作。这个异步的好处当然就是快,坏处当然就是可能在突发情况下丢失一些数据。TC的大部分写入方法都是同步的,而且会在操作过程中进行异步数据的同步磁盘写入。
如果是数据不是特别大(一般不要超过内存太多,根据操作系统,32位的操作系统单个文件不能超过2G,64位操作系统则无限制)
注:序列化问题
在实际应用中更常用 memcache 协议使用ttserver,当我们从中取数据时,会是一个序列化的字符串,没有自动反序列化处理,但在memcached服务器上却是自动反序列化的。这样我们先将数据取出,如: a:1:{s:5:"value";s:14:"this is a value";}
,再利用 unserialize() 函数反序列化就可以使用了。