TokyoTyrant

TokyoTyrant

一個可持久化數據的,好處是速度不錯,而且大至兼容Memcached的文本協議,客戶端可以繼續使用SpyMemcached。壞處是只是大致兼容,像Expired Time,CheckAndSet這些重要的原語都不支持,而且在可擴展性上沒什麼想象空間,和傳統資料庫一樣的Active-Active replication。

Anyway看了一圈最後還是選了它。

客戶端


在modules/extension項目封裝了基於SpyMemcached客戶端,屏蔽了一些TT不支持的特性如Binary協議,Expired Time,CheckAndSet語句,而且實現了一個spy client池--對Memcached,一個spy client單線程已足夠,基於SpyMemcached客戶端,屏蔽了一些TT不支持的特性如Binary協議,Expired Time,CheckAndSet語句,而且實現了一個spy client池--對Memcached,一個spy client單線程已足夠,而對TT則必須使用池。而對TT則必須使用池。

伺服器


1.在servers/tokyotyrant中,演示了生產環境active-active HA模式與測試環境單機版本兩種啟動腳本。
生產環境腳本在原有ttservctrl的基礎上作了如下修改:
打開了ulogdir,ulimsiz,sid(兩台server 必須不一樣),mhost(直接填寫對方的IP或用相同的host名字然後在/etc/hosts中設定對方的IP),mport ,rtsfile 這幾個HA 同步複製相關的選項。在cmd中添加-thnum 64 (32線程,默認為8, 和memcached不一樣,此處加大線程數能明顯提高性能),-uas(非同步寫日誌) -le(日誌只記錄錯誤信息)的參數 在dbname中設置參數:xmsiz=2147483648 (用mmap映射2G文件內容到內存),bnum=1000000(桶數量從1M增加到10M,假設TT中有大約10M數據) 在dbname中設置參數: opts=ld,使用64位地址存儲大於2G的數據,使用Deflate encoding以Page為單位進行壓縮(如果page內的數據內容長得有點像就會得到較高的壓縮率) 在dbname中設置參數:dfunit=8, 記錄被刪除後會回收硬碟空間, 否則硬碟空間會嘩嘩的不停往上漲, 直到你手工執行tcrmgr optimized localhost為止. 測試環境腳本等於原來的ttservctrl.
2.一般採用默認的casket.tch, hash database, 如果需要進行較多的forward match操作,且主鍵的分佈有一定規律性而不是完全隨機,可考慮使用casket.tcb -- btree database, 但在大數據量下讀取單條數據的性能會下降,HashBTree演演算法的天然差異決定了。
3.在雙機複製環境下,產生的ulog文件非常巨大,需要定期進行清理。
4.如果數據被頻繁增刪,casket.tch文件會越來越大,需要執行tcrmgr optimize localhost來減肥。
5.看數據文件的大小不能用 du -sh *,用ls -lh 吧,那才是真實的.

HQ監控


在servers/hq中,增加了tokyotyrant -plugin.jar,在原有memcached-plugin.jar的基礎上,對tokyotyrant實際支持的輸出值進行了微調。
原理都是telnet 1978埠,執行status命令。

後續演示


在下個版本,將會演示TT的一個很重要的私有協議--PrefixMatch,找出超時對象就靠它了,而且會擴展JMemcached支持該原語以方便測試用例編寫與Windows上的開發。