一、安装配置:

1.下载源码包:

wget http://fallabs.com/tokyocabinet/tokyocabinet-1.4.46.tar.gz

wget http://jaist.dl.sourceforge.net/project/tokyocabinet/tokyotyrant/1.1.33/tokyotyrant-1.1.33.tar.gz

2.编译安装tokyocabinet数据库:

yum install bzip2-devel -y

tar zxvf tokyocabinet-1.4.46.tar.gz

cd tokyocabinet-1.4.46

./configure

make

make install

3.编译安装tokyotyrant

tar zxvf tokyotyrant-1.1.33.tar.gz

cd tokyotyrant-1.1.33

./configure

make

make install

4.创建tokyotyrant数据文件存放目录以及日志文件,同步日志文件:

mkdir -p /ttserver/data   #数据文件

mkdir -p /ttserver/ulog   #同步日志

mkdir -p /ttserver/log    #日志文件

二、启动参数说明 :

ttserver -host -port -thnum -tout [-dmn] -pid -log [-ld|-le] -mul  -ulog -ulim [-uas] -sid -mhost -mport -rts [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 : 指定用来存放同步时间戳的文件名。

    #bnum=xxx”来提高性能。它可以指定bucket存储桶的数量。例如指定“#bnum=1000000”,就可以将最新最热的100万条记录缓存在内存中

    xmsiz=xxx指使用内存大小

    lcnum=xxx

-host name : 指定主机名称或服务器的地址。

-port num : 指定端口号,.默认情况下是1978

-thnum num : 指定的工作线程数。.默认情况是8

-tout num : specify the timeout of each session in seconds.

-tout num :以秒为单位指定每个会话超时。默认情况下,没有超时指定。

-dmn : 工作作为一个守护进程。

-pid path :设置文件路径存储进程ID

-kl :如果检测到纪录进程ID文件,杀死该ID的进程。

-log path :输出日志消息到文件。

-ld : 日志也记录调试信息。

-le : 日志只记录错误信息。

-ulog path : 指定更新日志目录。

-ulim num : 指定每个更新日志文件的大小限制。

-uas :使用异步I/O更新日志。

-sid num : 指定服务器的ID

-mhost name : 指定复制主服务器的主机名。

-mport num : 指定复制主服务器的端口号。

-rts path : 指定复制时间戳文件。

-rcc : 复制的一致性检查。

-skel name : 指定骨骼数据库库的名称,什么意思不太明白?

-mul num : 指定多个数据库机制的分区数目。

-ext path : 指定脚本语言的扩展文件路径。

-extpc name period : 指定函数的名称和周期命令的调用周期。

-mask expr : 指定禁止执行的命令

-unmask expr : 指定允许的命令的名称。

Tokyo Cabinet 单个数据库文件记录数超过1亿,性能会急剧下降。Tokyo Tyrant 的新版本支持了数据库文件拆分,例如 ttserver -mul 256 database.tcb 启动TT时,将会自动拆分成256个文件,存取时,根据key哈希到不同的文件

三、启动或停止ttserver

1.编辑/usr/local/sbin/ttservctl,设置相关参数:

cat /usr/local/sbin/ttservctl

#! /bin/sh

#----------------------------------------------------------------

# Startup script for the server of Tokyo Tyrant

#----------------------------------------------------------------

# configuration variables

prog="ttservctl"

cmd="ttserver"

basedir="/ttserver/"                 #数据库目录

port="1978"                          #ttserver端口

pidfile="$basedir/pid"               #输出进程ID/ttserver/pid文件

logfile="$basedir/log/ttserver.log"       #输出日志信息到/ttserver/log/ttserver.log文件

ulogdir="$basedir/ulog/"             #指定同步日志文件存放路径

ulimsiz="256m"                       #对单个ulog文件限制,超过将新建一个文件

sid=1                                #server idmysql,不能有重复的

mhost="192.168.100.204"          #master的地址(单机或主服务器可以是本机ip也可以是127.0.0.1)

mport="1978"                         #ttserver端口

rtsfile="$basedir/rts"               #replication的时间记录文件

dbname="$basedir/casket.tch#bnum=1000000" #xmsiz=最大使用内存”

maxcon="65535"                  

retval=0

2.启动ttserver服务器:

ttservctl start

3.关闭ttserver服务器:

ttservctl stop

提示:可以放入rc.local, ttserver启动脚本如果错误会有提示,也可以检查端口是否启用来确定ttserver的启动是否成功

 

四、优化性能:

1.如果使用hash数据库我们可以指定#bnum=xxx来提高性能。xxx大于或等于我们的记录总数。

2.如果使用B+ tree数据库我们可以通过指定"#lcnum=xxx#bnum=yyy" 来提高性能.

第一个参数指定被缓存的最大叶子节点数,受内存容量限制,

第二个参数指定桶的数量,它应该大于总记录数的1/128.

3.增加文件描述符。如果有大量的客户端连接,确保我们的文件描述符够用。系统默认是1024,我们可以用使用“ulimit”来重新设定 ulimit -SHn 51200

比如下面的单机实例启动脚本:

#!/bin/sh

ulimit -SHn 51200

ttserver -host 127.0.0.1 -port 11212 -thnum 8 -dmn -pid /ttserver//pid -log /ttserver//log/ttserver.log -le -ulog /ttserver//ulog/ -ulim 256m -sid 1 -rts /ttserver//rts  /ttserver//database.tch#bnum=10000000#xmsiz=434217728#rcnum=20000

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

4.定期优化,整理数据文件碎片,优化命令:

tcrmgr optimize -port port host

提示:整理时会锁库,读写都锁定

 

五、调用:

1、任何Memcached客户端均可直接调用tokyotyrant

2、还可以通过HTTP方式调用,下面以Linuxcurl命令为例,介绍如何操作tokyotyrant

  (1)、写数据,将数据“value”写入到“key”中:curl -X PUT http://127.0.0.1:1978/key -d "value"

   (2)、读数据,读取“key”中数据:curl http://127.0.0.1:1978/key

   (3)、删数据,删除“key”:curl -X DELETE http://127.0.0.1:1978/key

3. PHP API 接口程序以及 DEMO 详见:http://openpear.org/repository/Net_TokyoTyrant/

注:在32位操作系统下,作为 Tokyo Tyrant 后端存储的 Tokyo Cabinet 数据库单个文件不能超过2G,而64位操作系统则不受这一限制。所以,如果使用 Tokyo Tyrant,推荐在64CPU、操作系统上安装运行。在编译Tokyo cabinet的时候,使用如下编译选项就可以突破2G限制:--enable-off64

项目中运用的实例:统计论坛中帖子的点击数量

 

<?php

define('TT_PATH', substr(dirname(__FILE__), 0, -7));

require_once(TT_PATH.'/bbs/TokyoTyrant.php');

$ttObject = new Net_TokyoTyrant();

$memObject = new Memcache();

//连接TT

$memObject->connect('192.168.100.202',1978);

//写入点击数 以 fid_$fid Key 保存对应的域名值

function hitsSet($fid, $num)

  {

    global $memObject;

    $hitskey = "fid_".$fid;  //key

    $res = $memObject->get($hitskey );

    if(empty($res)) {

        $memObject->set($hitskey ,$num);  //设置 fid_id=>num

    } else {

        $memObject->replace($hitskey , $num);  //重置替换

         }

    $memObject->close();  //一定要记得关闭,否则 TIME_OUT  进程会越来越多

  }

//获取点击数

function hitsGet($fid)

  {

    global $memObject;

    $groupkey = "fid_".$fid;  //key

    $res = $memObject->get($fid);  //获取value

    $num = empty($res) ? '0' : $res;

    return $num;

    $memObject->close();

  }

?>

 

六、TTserver的监控、备份与恢复

1.TTserver的监控:

监控命令:

tcrmgr inform -st -port 服务器使用的端口 监控服务地址

监控程序提供数据项包括:内存使用,数据文件大小,读写次数,未命中key数量等,由cacti定时读取实现监控

示例地址:http:///cacti/graph.php?action=view&rra_id=all&local_graph_id=1050

增加磁盘io监控,iotop iotop要求linux内核2.6.20以上)

提示:具体阀值可以设定iotop占总量的80%

2.TTserver的备份:

(1).全量热备份

备份命令为:

tcrmgr copy -port 1978 localhost dpath.tch.xxxxx (其中xxxxx为备份时间)

根据业务需求及数据库运行状态决定备份的频度,全量热备时数据库库会写锁定,读不受影响。全量备份需记录备份时间点以提供replication恢复时所用,时间记录点精确的微妙,可记录到备份文件名中,如backup.tch.1259474040630024

示例备份脚本:

[ -n "$1" ] || { echo “input port number”; exit; }

[ -n "$2" ] || { echo “input backup dir”; exit; }

backup_date=`date +%s%N`

backup_date=`expr $backup_date / 1000`

tcrmgr copy -port ${1} localhost ${2}/backup_${1}.tch.${backup_date}

echo “back up finish! ${2}/backup_${1}.tch.${backup_date}”

(2).增量备份ulog

ttserver产生的ulog在”$basedir/ulog”目录,设置了ulimsiz后会按文件尺寸进行切割并按数据升序命名,可以根据备份的频度,按ulog文件最后修改时间,备份到ulog最大命名数字的前一个文件,同时也需记录备份时间,可将时间记录在打包备份的文件名中,如backup_ulog.1259474040630024.tar.gz, 和全量备份一样,精确到微妙。

提示:全量备份速度和服务器情况有关,基本接近直接copy速度

3.TTserver的恢复:

(1).使用replication恢复

根据备份方案中数据库全量备份方法得到的备份库,如backup.tch.xxxxxx ,

echo xxxxxx > “$basedir/rts”

写入备份时间点,即恢复时间点

cp backup.tch.xxxxx database_name.tch

启动:

./ttservctl start

恢复的库会根据时间点去master库同步数据,实现恢复

(2).使用日志增量恢复

先使用前一个全量备份的数据库文件作为基数据库,下线要整理的ttserver

清空原来的日志,然后解压,再cp 备份的ulog文件 $basedir/ulog/

echo xxxxxx > “$basedir/rts”

写入备份时间点(压缩文件名中包含),即恢复时间点

单独启动ttserver

ttserver database_name.tch

从日志恢复:

tcrmgr restore -port port -rcc localhost ulog

ctrl+c停掉ttserver,然后使用 ./ttservctl start 启动,master结构重新建立

提示:日志增量恢复环节应避免受其他ttserver的服务器影响,如可以使用一个不使用的端口进行恢复,这样数据也不会影响到其他服务器,恢复后再用原来的启动脚本启动,形成原来的dual master结构。

转自:http://wenku.baidu.com/view/5e5be4174431b90d6c85c74d.html