Tokyo Tyrant的安装、配置和使用

Tokyo Cabinet 是日本人 Mikio Hirabayashi(平林幹雄)のページ  开发的一款DBM数据库(注:大名鼎鼎的DBM数据库qdbm就是他开发的),该数据库读写非常快。insert:0.4sec/1000000 recordes(2500000qps),写入100万数据只需要0.4秒。search:0.33sec/1000000 recordes (3000000 qps),读取100万数据只需要0.33秒。下图为各种key-value数据库读写数据的性能 测试 ,可以看出Tokyo Cabinet的速度是非常快的。

Tokyo Tyrant 提供dbm数据库Tokyo Cabinet的网络接口 。它使用简单的基于TCP/IP的简单二进制协议进行通信。同时它拥有Memcached兼容协议并且可以用HTTP/1.1协议进行数据交换。所以实现了跨平台,跨语言 使用Tokyo Tyrant。采用热备份,更新日志记录,复制(replication)来实现高可用性和高可靠性。到目前为止,Tokyo Tyrant只能运行在inux, FreeBSD, Mac OS X, Solaris。

Tokyo Cabinet : lightweight database library
Tokyo Tyrant : lightweight database server

下载

wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.42.tar.gz
wget http://1978th.net/tokyotyrant/tokyotyrant-1.1.40.tar.gz

安装

tar zxvf tokyocabinet-1.4.42.tar.gz
cd tokyocabinet-1.4.42
./configure
make && make install
cd ..
tar zxvf tokyotyrant-1.1.40.tar.gz
cd tokyotyrant-1.1.40
./configure
make && make install
cd ..

配置

#其实也没啥好配置的主要就是数据存放目录
#创建TokyoTyrant数据存放目录
mkdir -p /fse/data/ttserver

tt支持的数据库类型有:

内存hash数据库
内存tree数据库
hash数据库
B+ tree数据库,

启动参数说明

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 : 指定被允许的命令名.
    dbname 制定数据库名,如果省略,则被视作内存hash数据库

数据库类型
下面我们再来看下数据库类型的详细配置。

  •     数据库名的命名方式被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.1.101  -port 11212 -thnum 8 -dmn -pid /fse/data/ttserver/ttserver.pid -log /fse/data/ttserver/ttserver.log -le -ulog /fse/data/ttserver/ -ulim 128m -sid 1 -rts /fse/data/ttserver/ttserver.rts /fse/data/ttserver/database.tch#bnum=10000000#xmsiz=434217728#rcnum=20000

使用hash数据库,最大会缓存20000个记录,最大使用内存434217728bytes(414M),bucket存储桶的数量10000000。

目前的库大小:

[root@centos_master ttserver]# ls -l
总计 41024
-rw-r–r– 1 root root 41947424 03-03 00:09 database.tch
-rw-r–r– 1 root root      699 03-03 00:09 ttserver.log

如果使用32位系统文件会有2G大小的限制,64位操作系统则不受此限制。

启动实例
个人推荐通过修改ttservctl来实现启动。下面我们举几个简单的启动例子。
单机启动例子,下面是ttservctl文件的部分:

#! /bin/sh
#—————————————————————-
# Startup script for the server of Tokyo Tyrant
#—————————————————————-
# configuration variables
prog=”ttservctl”
cmd=”ttserver”
basedir=”/var/ttserver” #数据库存放的路径,比如改为”/fse/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.101和192.168.1.1.102,以下为ttservctl文件的一配置内容。

101的配置:

#! /bin/sh
#—————————————————————-
# Startup script for the server of Tokyo Tyrant
#—————————————————————-
# configuration variables
prog=”ttservctl”
cmd=”ttserver”
basedir=”/fse/data/mydata”
port=”11211″
pidfile=”$basedir/pid”
logfile=”$basedir/log”
ulogdir=”$basedir/”
mhost=”192.168.1.102″        #主ip即另外机器的ip
ulimsiz=”256m”
sid=1      #注意要每台机器不一样
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
}

102的配置:

#! /bin/sh
#—————————————————————-
# Startup script for the server of Tokyo Tyrant
#—————————————————————-
# configuration variables
prog=”ttservctl”
cmd=”ttserver”
basedir=”/fse/data/mydata”
port=”11211″
pidfile=”$basedir/pid”
logfile=”$basedir/log”
ulogdir=”$basedir/”
mhost=”192.168.1.101″    #主ip即另外机器的ip
ulimsiz=”256m”
sid=2#注意要每台机器不一样
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
}

调用

TT支持Memcached和HTTP协议的访问,所以任何Memcached客户端均可直接调用Tokyo Tyrant。

下面是Linux下用curl命令使用tt:

#写
curl -X PUT http://127.0.0.1:11211/key -d “value”

#读
curl http://127.0.0.1:11211/key

#删除
curl -X DELETE http://127.0.0.1:11211/key

php调用

<?
$mem=new Memcache();
$mem->connect (“192.168.0.101″ ,1978 );
$mem->add (“key2″ ,”value2″ );
print_r( $mem->get (“key2″ ));
echo(“<hr>” );
$mem->add (“key3″ ,array (“value3″ =>”this is value3″ ));
print_r($mem->get (“key3″ ));
?>

退出

killall ttserver

ps -ef | grep ttserver
kill -TERM 2159

问题与解决方案
Tokyo Tyrant 在 php 上不能自动反序列化解决方法

  1. 没有评论

  1. 没有通告