啓動參數介紹 我們繼續來看啓動參數和配置
。
ttserver命令可以啓動一個數據庫實例。因爲數據庫已經實現了Tokyo Cabinet的抽象API
,所以可以在啓動的時候指定數據庫的配置類型。
支持的數據庫類型有:
- 內存hash數據庫
- 內存tree數據庫
- hash數據庫
- B+ tree數據庫,
命令通過下面的格式來使用,‘dbname’制定數據庫名,如果省略,則被視作內存hash數據庫。
ttserver [-host
name
] [-port
num
] [-th
num
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
] [-extpc
name
period
] [-mask
expr
] [
dbname
]
下面來說這些參數的功能:
-host name :指明服務器的hostname或者ip地址。默認服務器的所有地址都會被綁定。比如:指定127.0.0.1這樣的ip,就只是本地可以訪問了。 -port num : 指定服務啓動的端口. 默認1978.如果要啓動多個數據庫實例,端口需要不一樣。 -thnum num : 指定服務工作的線程 數。默認8. -tout num : 指定每個會話的超時時間。默認永不超時。 -dmn : 以守護進程方式運行。 -pid path : 輸出進程IP到指定的文件。 -log path : 輸出日誌信息到指定文件。 -ld : 日誌中記錄debug信息。 -le :日誌中只記錄錯誤信息。 -ulog path : 指定存放更新日誌(update log)的目錄.可以用來備份恢復數據庫,主從庫之間的同步 。 -ulim num : 指定每個更新日誌文件的大小限制. -uas :使用異步 IO記錄更新日誌。(使用此項可以減少寫入日誌的IO開銷,但是在服務器意外關機,進程被kill時可能會丟失數據。根據經驗,一般可以不使用)。 -sid num : 指定服務的ID號。主從複製的時候通過不同的ID號來識別。 -mhost name : 指定主從複製模式下的主服務器的IP或域名。 -mport num : 指定主從模式下主服務器的端口號. -rts path : 指定用於主從複製的時間戳存放文件. -ext path : 指定擴展腳本語言 文件。 -extpc name period : 指定被週期調用的函數名和間隔時間. -mask expr : 指定被禁止的命令名(比如可以禁止使用清空vanish). -unmask expr : 指定被允許的命令名. |
數據庫類型
下面我們再來看下數據庫類型的詳細配置。
- 數據庫名的命名方式被Tokyo Cabinet的抽象API指定。
- 如果數據庫名爲"*",表示內存hash數據庫。
- 如果數據庫名爲"+"表示內存tree數據庫。
- 如果數據庫名爲".tch",則數據庫爲hash數據庫。
- 如果數據庫名的後綴爲".tcb",數據庫將爲B+ tree數據庫。
- 如果數據庫名的後綴爲".tcf"。則數據庫將爲fixed-length數據庫。
- 如果數據庫名的後綴爲".tct",則數據將爲一個table數據庫(有表的概念)。
數據庫的調整參數通過數據庫名的延伸來指定,通過"#"分開,每個參數通過一個參數名和值來指定,用"="隔開。
內存hash數據庫支持"bnum", "capnum", 和 "capsiz"
內存tree數據庫支持"capnum" 和 "capsiz"
capnum指定記錄的最大容量,capsiz指定最大的內存使用量(在內存數據庫中),記錄通過存儲
的順序移除。
hash數據庫支持"mode", "bnum", "apow", "fpow", "opts", "rcnum", 和 "xmsiz".
`rcnum'指定最大的緩存 記錄數。如果它不大於零,那麼緩存記錄不可用。默認不可用。
xmsiz 指定外部內存的大小。如果不大於0,內存不可用。默認是67108864,即64M。
`bnum' 指定bucket存儲桶的數量。如果指定的數目不大於0,將會使用默認的數值131071.推薦數量應該在所有需要存儲的記錄總數的0.4-4倍
`apow' 跟一個key關聯的記錄數,2的N次方表示. 如果不指定,默認2^4=16.
`fpow' specifies the maximum number of elements of the free block pool by power of 2. 默認2^10=1024.
`opts' 指定選項,位或:`HDBTLARGE' 指定數據庫的大小通過使用64位數組桶能夠超過2G。
`HDBTDEFLATE' 指定每個記錄被Deflate encoding壓縮 。
`HDBTBZIP' 指定每個記錄被BZIP2 encoding壓縮
`HDBTTCBS'指定每個記錄被 TCBS encoding壓縮 .
B+ tree數據庫支持"mode", "lmemb", "nmemb", "bnum", "apow", "fpow", "opts", "lcnum", "ncnum", 和 "xmsiz".
Fixed-length 數據庫 支持 "mode", "width", and "limsiz".
Table 數據庫支持 "mode", "bnum", "apow", "fpow", "opts", "rcnum", "lcnum", "ncnum", "xmsiz", 和 "idx"
"idx"指定表的索引。
"mode"可以包含 "w" 寫, "r" 讀, "c" 創建, "t" 截斷,"e" 無鎖,和"f" 非阻塞鎖。默認的的mod爲"wc"。
優化
性能
如果使用hash數據庫我們可以指定#bnum=xxx來提高性能。xxx大於或等我我們的記錄總數。
如果使用B+ tree數據庫我們可以通過指定"#lcnum=xxx#bnum=yyy" 來提高性能.第一個參數指定被緩存的最大葉子節點數,受內存容量限制,第二個參數指定桶的數量,它應該大於總記錄數的1/128.
如果有大量的客戶端連接,確保我們的文件描述符夠用。系統默認是1024,我們可以用使用“ulimit”來重新設定
比如下面的單機實例啓動腳本(一個正在線上運行的腳本):
#!/bin/sh ulimit -SHn 51200 ttserver -host 192.168.0.136 -port 11212 -thnum 8 -dmn -pid /data/ttserver/ttserver.pid -log /data/ttserver/ttserver.log -le -ulog /data/ttserver/ -ulim 128m -sid 1 -rts /data/ttserver/ttserver.rts /data/ttserver/database.tch#bnum=10000000#xmsiz=434217728#rcnum=20000 |
使用hash數據庫,最大會緩存20000個記錄,最大使用內存434217728bytes(414M),bucket存儲桶的數量10000000。
目前的庫大小:
-rw-r--r-- 1 root root 28G Mar 8 12:19 bbsdatabase.tch |
因爲使用了64位操作系統,所以文件大小不受2G的限制。
我們再看下讀取數據的速度:
當前獲取memcache Threads_cdb_threads_tid3565732_displayorder_0 使用時間 0.00054812431335449 |
以上是程序打印
出來的通過memcache協議讀取key爲memcache Threads_cdb_threads_tid3565732_displayorder_0的數據所花的時間0.00054812431335449(s),可以看到速度還是非常快的。
啓動實例
個人推薦通過修改ttservctl來實現啓動。下面我們舉幾個簡單的啓動例子。
單機啓動例子,下面是ttservctl文件的部分:
#! /bin/sh #---------------------------------------------------------------- # Startup script for the server of Tokyo Tyrant #---------------------------------------------------------------- # configuration variables prog="ttservctl" cmd="ttserver" basedir="/var/ttserver" #數據庫存放的路徑,比如改爲"/data/mydata" port="1978" #啓動的端口 pidfile="$basedir/pid" logfile="$basedir/log" ulogdir="$basedir/ulog" ulimsiz="256m" sid=1 dbname="$basedir/casket.tch#bnum=1000000" #上面講的數據庫類型配置 maxcon="65536" retval=0 |
雙機互爲主輔模式,比如兩臺機器的Ip分別爲192.168.1.176和192.168.1.1.177,以下爲ttservctl文件的一部分。
176的配置:
#! /bin/sh #---------------------------------------------------------------- # Startup script for the server of Tokyo Tyrant #---------------------------------------------------------------- # configuration variables prog="ttservctl" cmd="ttserver" basedir="/data/data/data1" port="11211" pidfile="$basedir/pid" logfile="$basedir/log" ulogdir="$basedir/" mhost="192.168.1.177" #主ip即另外機器的ip ulimsiz="256m" sid=6#注意要每臺機器不一樣 dbname="$basedir/casket.tch#bnum=100000000#xmsiz=104857600#rcnum=1000000" rts="$basedir/ttserver.rts" #在ttservctl基礎上增加 maxcon="65536" retval=0 # locale clear LANG=C LC_ALL=C export LANG LC_ALL # start the server start(){ printf 'Starting the server of Tokyo Tyrant/n' ulimit -n "$maxcon" mkdir -p "$basedir" if [ -f "$pidfile" ] ; then pid=`cat "$pidfile"` printf 'Existing process: %d/n' "$pid" retval=1 else $cmd / -port "$port" / -dmn / -pid "$pidfile" / -log "$logfile" / -ulog "$ulogdir" / -ulim "$ulimsiz" / -sid "$sid" / -mhost "$mhost" /#在ttservctl基礎上增加 -mport "$port" /#在ttservctl基礎上增加 -rts "$rts" /#在ttservctl基礎上增加 "$dbname" if [ "$?" -eq 0 ] ; then printf 'Done/n' else printf 'The server could not started/n' retval=1 fi fi } |
177的配置:
#! /bin/sh #---------------------------------------------------------------- # Startup script for the server of Tokyo Tyrant #---------------------------------------------------------------- # configuration variables prog="ttservctl" cmd="ttserver" basedir="/data/data/data1" port="11211" pidfile="$basedir/pid" logfile="$basedir/log" ulogdir="$basedir/" mhost="192.168.1.176" #主ip即另外機器的ip ulimsiz="256m" sid=7#注意要每臺機器不一樣 dbname="$basedir/casket.tch#bnum=100000000#xmsiz=104857600#rcnum=1000000" rts="$basedir/ttserver.rts" #在ttservctl基礎上增加 maxcon="65536" retval=0 # locale clear LANG=C LC_ALL=C export LANG LC_ALL # start the server start(){ printf 'Starting the server of Tokyo Tyrant/n' ulimit -n "$maxcon" mkdir -p "$basedir" if [ -f "$pidfile" ] ; then pid=`cat "$pidfile"` printf 'Existing process: %d/n' "$pid" retval=1 else $cmd / -port "$port" / -dmn / -pid "$pidfile" / -log "$logfile" / -ulog "$ulogdir" / -ulim "$ulimsiz" / -sid "$sid" / -mhost "$mhost" /#在ttservctl基礎上增加 -mport "$port" /#在ttservctl基礎上增加 -rts "$rts" /#在ttservctl基礎上增加 "$dbname" if [ "$?" -eq 0 ] ; then printf 'Done/n' else printf 'The server could not started/n' retval=1 fi fi } |