啓動參數介紹
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 ]
下面來說這些參數的功能:
|
數據庫類型
- 下面我們再來看下數據庫類型的詳細配置。
- 數據庫名的命名方式被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壓縮.
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
}