使用TC/TT存储session数据
最近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:"hashl99rfenbe56ar2e91oi5ihmcl5ts12814212692 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数据
发表评论 取消回复
技术组织
最近评论
- passenger 发表在《一个完整的Oracle建表的例子》
- tudou 发表在《Oracle增大redo log file的方法》
- Yousri 发表在《如何在mac下长期使用SecureCRT》
- Amazon SES筆記 « What's Going On 发表在《如何使用Amazon的邮件服务SES》
- 如何使用Amazon的邮件服务SES | 半瓶 发表在《为Postfix增加DKIM功能》
- pary 发表在《为Postfix增加DKIM功能》
历史归档
广告位







博客的风格很有意思
简单最好
能介绍一下lua函数expire每行是啥意思吗,不明白为啥有insert