性能強勁的Tokyo Cabinet 和 Tokyo Tyrant

Tokyo Cabinet

Tokyo Cabinet (簡稱TC)是Mikio Hirabayashi開發的一種DBM的開發庫,其數據文件只有一個,裏面存放多個<key,value>的數據記錄,所有操作都是依據 key做主鍵操作。key,value都可以是連續不定長,即可以是二進制,也可是是字符串。數據文件中的記錄組織有三種模式,hash表,B+樹,定長 數組。

做爲hash表,主鍵key必須是唯一的,方法有:按key來存儲value到一個記錄,按key來刪除一個記錄,按key來獲取一個記錄的 value。另外還有一個獲取所有key的方法,獲取的key是不排序的。TC可以做爲NDBM,GBM的替代品,因爲有更高的性能。

當採用B+樹時,可以存儲相同key的多條記錄,有存儲,刪除,讀取的方法,還可以按照一定順序來讀取記錄。

做爲一個定長數組,key必須是自然數,其它的和hash表完全一樣,因爲key是自然數,所以速度比hash表要快。

以上三種數據庫即可以只保存在內存中,也可以指定保持到硬盤。應用最廣泛的,當然就是hash表了。

Tokyo Tyrant

單單的TC數據庫,用處不大,宿主程序需要進行很多開發。TC的作者開發了Tokyo Tyrant (TT)這個網絡服務程序,除了自己的二進制協議,還提供了現在被廣泛應用的HTTP協議,memcached協議來訪問TC數據庫,這樣一來,一下子就擴展了TC的使用範圍,讓TC從一個單純的開發庫變成了易用,高效的數據庫系統。

TT支持的協議包括memcached的持續連接,http1.1的長連接,並且數據文件,有熱備,更新日誌,複製功能,這些都給TT很高的可用性 和高性能。並且,TT內嵌lua腳本的支持,可以對數據進行處理。(看來lua腳本已經是unix下內嵌腳本的首選了)。目前(2008.12)爲止TT 只能運行在linux,freebsd,macos系統上。

安裝等請參見官網 ,或者s135文章

TT的程序

TT的服務器程序是ttserver ,默認端口1978(作者的出生在1978?後來在他主頁得到了驗證)。在啓動的時候,根據參數 dbname名來確定使用的TC數據庫類型。如果爲"*",則使用內存hash表,如果爲"+",則使用內存B+庫,如果後綴爲".tch",則使用 hash表,如果後綴爲".tcb",則使用B+樹數據庫,如果後綴爲".tcf",則使用定長數組。如果dbname參數被省略,則採用內存hash數 據庫。

在ttserver衆多的啓動參數中,有兩個參數在正式使用時非常有用,-mask expr, -unmask expr,分別是禁止的命令,允許的命令。在正式使用時,最好能把vanish(刪除所有數據)屏蔽掉,就像linux系統中把rm -rf * 屏蔽了一樣。

  ttserver [-host name] [-port num] [-thnum num] [-tout num] [-dmn] [-pid path] [-log path] [-ld|-le] [-ulog path] [-ulim num] [-uas] [-sid num] [-mhost name] [-mport num] [-rts path] [-ext path] [-mask expr] [-unmask expr] [dbname]

  -host name : 指定需要綁定的服務器域名或IP地址。默認綁定這臺服務器上的所有IP地址。
  -port num : 指定需要綁定的端口號。默認端口號爲1978
  -thnum num : 指定線程數。默認爲8個線程。
  -tout num : 指定每個會話的超時時間(單位爲秒)。默認永不超時。
  -dmn : 以守護進程方式運行。
  -pid path : 輸出進程ID到指定文件(這裏指定文件名)。
  -log path : 輸出日誌信息到指定文件(這裏指定文件名)。
  -ld : 在日誌文件中還記錄DEBUG調試信息。
  -le : 在日誌文件中僅記錄錯誤信息。
  -ulog path : 指定同步日誌文件存放路徑(這裏指定目錄名)。
  -ulim num : 指定每個同步日誌文件的大小(例如128m)。
  -uas : 使用異步IO記錄更新日誌(使用此項會減少磁盤IO消耗,但是數據會先放在內存中,不會立即寫入磁盤,如果重啓服務器或ttserver進程被kill掉,將導致部分數據丟失。一般情況下不建議使用)。
  -sid num : 指定服務器ID號(當使用主輔模式時,每臺ttserver需要不同的ID號)
  -mhost name : 指定主輔同步模式下,主服務器的域名或IP地址。
  -mport num : 指定主輔同步模式下,主服務器的端口號。
  -rts path : 指定用來存放同步時間戳的文件名。
  (以上cp自
http://blog.s135.com/post/362.htm )
  -ext path : 擴展的腳本文件
  -mask expr : 需要禁止的命令,多個命名用","隔開
  -unmaks expr : 允許的命令
   除了覆蓋TC基本的操作命令,例如put,get,out,等,還有一些另類的表達式:all:所有命令,allorg:所有的二進 制協議,allmc:所有的memcached協議,allhttp:所有的http協議, "allread" is the abbreviation of `get', `mget', `vsiz', `iterinit', `iternext', `fwmkeys', `rnum', `size', and `stat'. "allwrite" is the abbreviation of `put', `putkeep', `putcat', `putshl', `putnr', `out', `addint', `adddouble', and `vanish'. "allmanage" is the abbreviation of `sync', `copy', `restore', and `setmst'. "repl" means replication as master. "slave" means replication as slave.

如果不想這麼麻煩的啓動,可以使用ttservctl簡單的命令來控制。ttservctl start,stop,restart,hup。使用這個命令,數據庫文件位於/var/ttserver/casker.tch,log等相關文件位於 /var/ttserver。

ttulmgr :用來在二進制ulog文件(update log)和text格式的TSV文件之間轉換

ttserver對外有三種協議,可以用curl程序調用http協議訪問,可tt自帶的客戶端程序,使用私有二進制協議訪問。

tcrtest :測試程序, tc remote test
tcrmttest :多線程測試程序 tc multi-thread test
兩個測試程序寫入的數據key,value均是8字節的,按照00000001,00000002格式

tcrtest write host rnum : 寫入 rnum條記錄(是重新寫,不是追加)
tcrtest read host : 讀出所有記錄
tcrtest remote host : 刪除所有記錄

tcrmgr : 測試和調試ttserver的程序,很多用法就就見官方文檔了,主要有:
tcrmgr inform host : 獲取服務器的信息
tcrmgr put host key value : 添加記錄
tcrmgr get host key : 獲取記錄
tcrmgr out host key : 刪除記錄
tcrmgr list host : 列出數據庫中所有的key(這個在memcached中是需要patch才能實現的)
tcrmgr vanish host : 刪除所有數據

還有一些命名是和主從同步,備份相關的

ttserver和用戶數據庫

TC,ttserver這種DBM方式的數據庫,對我們目前的應用來說,最適合的是用來作用戶數據庫,完全用userid做key。通常存儲用戶數 據庫,都使用的是關係型數據庫,例如:mysql,pgsql,oracle。從用戶數據庫特性(數據格式單一,訪問量大等)來說,DBM格式是最適合 的。在採用TC,ttserve上,最大的問題就是技術支持和持久性。仔細分析這點,對很多普通公司(不深入到opensource代碼級)來說,用 mysql,pgsql,oracle等,有了問題,也就是用這些數據庫提供的管理命令弄弄,調調參數,重啓,從備份中恢復。其實和你使用 TC,ttserver,可做的事情都是一樣。再退一萬步來說,如果真需要深入到源代碼級尋找問題,TC,ttserve兩個加起來才1M不到,和 mysql,pgsql源代碼的複雜程度的幾十分之一。
google的賬戶數據庫就是<key,value>形式的Berkeley DB (簡稱:BDB,已經被oracle收購了), Google. Accounts uses Berkeley DB HA for the storage and retrieval of user

ttserver和memcached

ttserver是數據庫,memcached是緩存。兩者都是保存<key,value>形式的數據,通過key進行任何操作。 ttserver可以將數據持久化保存,memcached全部是保存在內存中,memcached會自動刪除過期數據,最長不超過30天。 memcached在和一些api配合時,能自動進行數據的出入序列化,讀取反序列化。ttserver有主從複製的功能,操作日誌等,這完全是數據庫才 有的東西。據說memcached正在對整體架構做調整,到時候支持plugin機制.會把網絡,事件處理,內存存儲剝離開來.以後要做基於磁盤的 key-value存儲就可以寫一個存儲引擎就成了。memcached的二次開發又步入一個小高潮。

TC和BDB

BDB配置開發起來比較麻煩,因爲它沒有ttserver這個一樣的網絡接口。BDB的數據文件會比較大,有時需要執行文件收縮,利用BDB開發的memcachedb就有這種問題。BDB開發已經很長時間了,成熟度高,無論是bug,支持,資料會比tc要好很多。

ttserver和關係型數據庫

ttserver是<key,value>形式,在根據key進行讀取,寫入時速度是飛快的,但在做統計的時候,就比較麻煩了,還是需 要自己寫程序,從ulog中到處log,轉換成sql語句,後臺寫入關係型數據庫,然後再利用成熟的接口,邏輯,進行統計。或者應用在更改 ttserver時,發送消息(mq,syslog等)到輔助進程,輔助進程進行相應的數據操作。這種情況下,關係數據庫完全是ttserver的另一種 形式的存在,除了性能有所缺陷,在應用,統計上更加方便。

====

2009.3.8 補充

使用B+存儲,可以構造FIFO的隊列,通過tcbmgr put -dd c.tcb a aa 可存放進具有重複主鍵的值,在get的時候,只獲取第一個。而使用out命令,可以刪除第一個值。

-dd 是 dbputdup縮寫的意思。

在1.4.0版本的tc後,又多了一種存儲方式 tct,包含了字段的概念。

發佈了335 篇原創文章 · 獲贊 3 · 訪問量 66萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章