最近NoSQL挺火的,而TC/TT是其中一个典型的代表,TC是底层存储,TT是访问接口,日本人开发的,支持双Master的备份,不支持水平扩展,不过另外一个日本人用C++写的Flare工具可以取代TT实现水平扩展功能。本文主要记录通过TC/TT来存储session数据,这样可降低session和单点服务器的耦合关系,相对数据库存储来说又提高了性能,相比memcached实现了持久化,算是一个不错的折中方案吧。方案没有最优最差之分,只有适合不同的场合,根据系统的具体压力情况作出分析优化。

1、下载相关软件的最新版本(TC/TT/TC的lua扩展):

[root@localhost tctt]# wget http://fallabs.com/tokyocabinet/tokyocabinet-1.4.46.tar.gz

[root@localhost tctt]# wget http://fallabs.com/tokyotyrant/tokyotyrant-1.1.41.tar.gz

[root@localhost tctt]# wget http://fallabs.com/tokyocabinet/luapkg/tokyocabinet-lua-1.9.tar.gz

[root@localhost tctt]# ll
total 1292
-rw-r--r--  1 root root 1002423 Aug  5 20:49 tokyocabinet-1.4.46.tar.gz
-rw-r--r--  1 root root  108327 Aug  5 14:26 tokyocabinet-lua-1.9.tar.gz
-rw-r--r--  1 root root  196196 Aug  5 14:26 tokyotyrant-1.1.41.tar.gz

2、安装lua脚本,注意这里不能通过yum的方式安装,否则后面装tt时会提示找不到lua.h文件:

wget http://www.lua.org/ftp/lua-5.1.4.tar.gz

make linux

make install

一般会报错如下:

luaconf.h:275:31: error: readline/readline.h: No such file or directory
luaconf.h:276:30: error: readline/history.h: No such file or directory

通过yum安装readline-devel即可

yum install readline-devel

3、安装TC/TT/TC的lua扩展这些软件,很简单,基本不会有问题,注意的是编译tt的时候要加--enable-lua参数:

[root@localhost tctt]# tar zxvf tokyocabinet-1.4.46.tar.gz

[root@localhost tctt]# cd tokyocabinet-1.4.46

[root@localhost tokyocabinet-1.4.46]# ./configure

[root@localhost tokyocabinet-1.4.46]# make

[root@localhost tokyocabinet-1.4.46]# make install

[root@localhost tctt]# tar zxvf tokyocabinet-lua-1.9.tar.gz

[root@localhost tokyocabinet-lua-1.9]# make

[root@localhost tokyocabinet-lua-1.9]# make install

[root@localhost tctt]# tar zxvf tokyotyrant-1.1.41.tar.gz

[root@localhost tctt]# cd tokyotyrant-1.1.41

[root@localhost tokyotyrant-1.1.41]# ./configure --enable-lua

[root@localhost tokyotyrant-1.1.41]# make

[root@localhost tokyotyrant-1.1.41]# make install

4、下载并安装tt的php扩展,然后把tokyo_tyrant.so配置到php.ini文件中:

[root@localhost tctt]# wget http://pecl.php.net/get/tokyo_tyrant-0.5.0.tgz

[root@localhost tctt]# tar zxvf tokyo_tyrant-0.5.0.tgz

[root@localhost tokyo_tyrant-0.5.0]# ./configure --with-php-config=/usr/local/php533/bin/php-config

[root@localhost tokyo_tyrant-0.5.0]# make

[root@localhost tokyo_tyrant-0.5.0]# make install

Installing shared extensions:     /usr/local/php533/lib/php/extensions/no-debug-non-zts-20090626/

6、建立一个expire.lua文件,用于清理过期的session

function expire()
local args = {}
local cdate = string.format("%d", _time())
table.insert(args, "addcond\0ts\0NUMLE\0" .. cdate)
table.insert(args, "out")
local res = _misc("search", args)
if not res then
_log("expiration was failed", 2)
end
end

7、启动数据库,这里的详细参数可见官方文档

ttserver -host 192.168.0.33 -port 11213 -ext /ttserver/expire.lua -extpc expire 5.0 -thnum 8 -dmn -pid /ttserver/mpsession.pid -log /ttserver/mpsession.log -le -ulog /ttserver -ulim 128m -sid 1 -rts /ttserver/mpsession.rts '/ttserver/mpsession.tct#idx=ts:dec'

expire.lua文件会每5秒执行一次,清理ts列的时间为当前时间的记录,这里保存的时间是unix时间戳,ts这列的名字是php的tt扩展里代码写死的,不能改。

可查看一下数据文件和日志文件:

[root@localhost ttserver]# ll
total 1212
-rw-r--r--  1 root root  48855 Aug 10 14:50 00000001.ulog
-rwxr-xr-x  1 root root    273 Aug  9 14:48 expire.lua
-rw-r--r--  1 root root    695 Aug 10 13:54 mpsession.log
-rw-r--r--  1 root root      6 Aug 10 13:54 mpsession.pid
-rw-r--r--  1 root root 561584 Aug 10 13:56 mpsession.tct
-rw-r--r--  1 root root  74496 Aug 10 13:54 mpsession.tct.idx.ts.dec

8、编写php程序测试

<?php
session_start();
class Foo{
public $bar;
}
$foo = new Foo;
$_SESSION['public'] = serialize($foo);
echo $_SESSION['public'];
?>

9、查看数据库的记录:

[root@localhost ttserver]# tcrmgr list -port 11213 -pv 192.168.0.33
1      datapublic|s:31:"O:3:"Foo":1:{s:8:"hashl99rfenbe56ar2e91oi5ihmcl5ts1281421269

2     datapublic|s:26:"O:3:"Foo":1:{s:3:"bar";N;}";hash0vgqo8ag92s3boorudc3iqe9e5ts1281421912

注意,这里的php程序生成的记录是编号为2的记录,编号为1的记录是把上边的程序里Foo类定义中public改成private时生成的,从这里可见这时存储的数据时不完整的,经测试protected也会有同样的问题,这或许是这个扩展的一个bug。

10、持续观察数据库记录,客户端不做任何操作,等session过期后,会发现记录已经被lua脚本删除了。

php扩展程序中的bug并不会影响使用这个session存储功能,经测试直接使用TokyoTyrantTable类的put方法存储序列化后的数据是没有问题的。但是这里存储session用的key是每次累加1递增的,我想取这个key的过程应该会消耗一定的资源,但愿在生成key的过程中不要有什么bug。

 

2 Responses to 使用TC/TT存储session数据

  1. usserver 说道:

    博客的风格很有意思
    简单最好

  2. jianwill 说道:

    能介绍一下lua函数expire每行是啥意思吗,不明白为啥有insert

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>