1. 程式人生 > >Tokyo Tyrant(TTServer)系列(六)-數據丟失誰的錯

Tokyo Tyrant(TTServer)系列(六)-數據丟失誰的錯

內存數據庫 emca aps csdn AC cell class mon cached

前面的一些文章講到了memcache以及TT。memcache內存數據庫非常好理解。數據存儲在內存中,重新啟動服務器或者重新啟動memcahce進程,數據是會丟失的。

那麽我們也提到過TTServer數據是持久存儲的,它的數據真是絕對安全嗎?

?? ? ? 以下我們來詳細測試一下,在測試服務器啟動兩個ttserver,不記錄日誌。

12ttserver -port 1978 -dmn -pid /data/ttserver/test1/pid /data/ttserver/test1/casket.tchttserver -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() 函數反序列化就能夠使用了。


Tokyo Tyrant(TTServer)系列(六)-數據丟失誰的錯