Tokyocabinet数据库

Tokyo Cabinet是日本人平林幹雄开发的一款DBM数据库,该数据库读写非常快。但是单单的TC数据库,用处不大,宿主程序需要进行很多开发。TC的作者开发了Tokyo Tyrant(TT)这个网络服务程序,除了自己的二进制协议,还提供了现在被广泛应用的HTTP协议,memcached协议来访问TC数据库,这样一来,一下子就扩展了TC的使用范围,让TC从一个单纯的开发库变成了易用,高效的数据库系统。

Tokyo Tyrant是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有Memcached兼容协议,也可以通过HTTP协议进行数据交换。
Tokyo Tyrant 加上 Tokyo Cabinet,构成了一款支持高并发的分布式持久存储系统,对任何原有Memcached客户端来讲,可以将Tokyo Tyrant看成是一个Memcached,但是,它的数据是可以持久存储的。
#建立Tokyo Tyrant日志及数据存放目录 mkdir /ttserver
#下载安装tokyocabinet wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.3.17.tar.gz
tar zxvf tokyocabinet-1.3.17.tar.gz
cd tokyocabinet-1.3.17/
./configure
make
make install
cd ../
#下载安装tokyotyrant wget http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.7.tar.gz
tar -xzvf tokyotyrant-1.1.7.tar.gz
cd tokyotyrant-1.1.7
./configure --prefix=/usr/local/tokyotyrant
make
make   install
#启动Tokyo Tyrant服务器端
如果大量的客户端访问ttserver,请确保文件描述符够用。许多服务器的默认文件描述符为1024,可以在启动ttserver前使用ulimit命令提高这项值。例如:ulimit -SHn 51200
启动的时候,根据参数dbname名来确定使用的TC数据库类型。如果为"*",则使用内存hash表,如果为"+",则使用内存B+库,如果后缀为".tch",则使用hash表,如果后缀为".tcb",则使用B+树数据库,如果后缀为".tcf",则使用定长数组。如果dbname参数被省略,则采用内存hash数据库。
在ttserver众多的启动参数中,有两个参数在正式使用时非常有用,-mask expr, -unmask expr,分别是禁止的命令,允许的命令。在正式使用时,最好能把vanish(删除所有数据)屏蔽掉,就像linux系统中把rm -rf * 屏蔽了一样。
参数解释 ttserver [-host name] [-port num] [-thnum 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] [-mask expr] [-unmask expr] [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 : 指定用来存放同步时间戳的文件名。
  -ext path : 扩展的脚本文件
  -mask expr : 需要禁止的命令,多个命名用","隔开
  -unmaks expr : 允许的命令
启动命令 /usr/local/tokyotyrant/bin/ttserver -host 192.168.137.64 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 1 -rts /ttserver/ttserver.rts /ttserver/database.tch#bnum=1000000
如果不想这么麻烦的启动,可以使用ttservctl简单的命令来控制。ttservctl start,stop,restart,hup。使用这个命令,数据库文件位于/var/ttserver/casker.tch,log等相关文件位于/var/ttserver。
# 关闭服务 cat /ttserver/ttserver.pid |   xargs   kill -TERM
# 调用
  1、任何Memcached客户端均可直接调用tokyotyrant。
  2、还可以通过HTTP方式调用,下面以Linux的curl命令为例,介绍如何操作tokyotyrant:
  (1)、写数据,将数据“value”写入到“key”中: curl -X PUT http://127.0.0.1:11211/key -d "value"
(2)、读数据,读取“key”中数据: curl http://127.0.0.1:11211/key
(3)、删数据,删除“key”: curl -X DELETE http://127.0.0.1:11211/key
#实时查看监控数据命令 watch "echo stats | nc 192.168.12.6 11211"                                                            
Every 2.0s: echo stats | nc 192.168.12.6 11211                                                    Thu Feb 12 18:32:57 2009
STAT pid 18860
STAT uptime 7973
STAT time 1234434777
STAT version 1.1.7
STAT rusage_user 7.550852
STAT rusage_system 17.756300
STAT curr_items 100000
STAT bytes 7398720
END
# 效率测试
我们用tokyotyrant自带的工具tcrmttest,用来测试(多线程)对Tokyo Tyrant网络接口的写入、读取移动做效率测试。
# 查看tcrmttest工具的帮助及参数
cd   /usr/local/tokyotyrant/bin/
./tcrmttest
./tcrmttest: test cases of the remote database API of Tokyo Tyrant
usage:
   ./tcrmttest write [-port num] [-tnum num] [-nr] [-ext name] [-rnd] host rnum
   ./tcrmttest read [-port num] [-tnum num] [-mul num] host
   ./tcrmttest remove [-port num] [-tnum num] host
   ./tcrmttest write -port 11211 192.168.137.64 100000
<Writing Test>
   host=192.168.137.64   port=11211   tnum=1   rnum=100000   nr=0   ext=   rnd=0
......................... (00010000)
......................... (00020000)
......................... (00030000)
......................... (00040000)
......................... (00050000)
......................... (00060000)
......................... (00070000)
......................... (00080000)
......................... (00090000)
......................... (00100000)
record number: 2103120
size: 1245941232
time: 636.535
ok
在已经有2百万数据的基础上追加10万数据,2百万数据占用数据库文件大小约为1.2G,平均每条数据用0.00637秒,平均每秒158条记录(该服务器为一台1u服务器做服务器端 2G物理内存   cpu为双核Intel(R) Xeon(TM) CPU 2.80GHz   32位平台)。
重新配置Tokyo Tyrant一台服务器,试试从0条数据写入的效率(该服务器为一台1u服务器做服务器端 2G物理内存   cpu为双核Intel(R) Xeon(TM) CPU 2.40GHz 32位平台)。 # ./tcrmttest write -port 11211 192.168.12.6 100000
<Writing Test>
   host=192.168.12.6   port=11211   tnum=1   rnum=100000   nr=0   ext=   rnd=0
......................... (00010000)
......................... (00020000)
......................... (00030000)
......................... (00040000)
......................... (00050000)
......................... (00060000)
......................... (00070000)
......................... (00080000)
......................... (00090000)
......................... (00100000)
record number: 100000
size: 7398720
time: 6.845
ok
平均每条插入时间为0.006845秒,每秒插入14609条记录。
两台服务器硬件及负载相当,看来原有的数据库文件大小的插入效率有很大影响,那么读取数据的效率呢?
继续测试。 ./tcrmttest read -port 11211 192.168.12.6
<Reading Test>
   host=192.168.12.6   port=11211   tnum=1   mul=0   rnd=0
......................... (00010000)
......................... (00020000)
......................... (00030000)
......................... (00040000)
......................... (00050000)
......................... (00060000)
......................... (00070000)
......................... (00080000)
......................... (00090000)
......................... (00100000)
record number: 100000
size: 7398720
time: 5.559
ok

每秒约读取17989条记录。

前段时间做过一个压力测试

名词解释
最大:缓存命中率约为0时的响应时间
最小:缓存命中率约为100%时的响应时间
平均:缓存命中率从0~100%的平均响应时间
平稳:系统平稳时的响应时间(约等于最小)
数据访问时间:从数据发起请求到数据下载完毕的时间间隔。
命中率:系统已有内存缓存的数据与总测试数据相比的百分比。


实验环境硬件:
一台pc机做TT客户端 2G物理内存   cpu为Intel(R) Pentium(R) 双核核 CPU 2.40GHz 
一台1u服务器做TT服务器端 4G物理内存   cpu为双核Intel(R) Xeon(TM) CPU 2.80GHz 
软件环境:tc的数据库大约是1.2G ,保存单元300多万

测试方法
使用1-1000000写入的key的对应value值,通过Tokyo Tyrant的http网络接口,组合URL,通过LoadRunner模拟大并发访问该URL。

结论
不同并发对数据访问时间的长短影响比较明显,并发数越高数据访问时间越长。根据测试中的平均时间数据与平稳时间数据之比,预计用户查词未命中内存缓存访问时间是未命中内存缓存数据访问时间的3倍左右。该架构性能良好,在测试中为发现有效服务器错误。


测试数据,在内存缓存命中率100%下平稳数据访问时间:
2000并发平稳数据访问时间为0.31秒,1000并发时为0.19秒。
tt的接口没有显示并发数的功能
我用的方法 watch "netstat -ant |grep 192.168.xx.xx:11211 |wc -l"


实际使用的时候 Tokyo Tyrant服务端的端口有时候会telnet 不上去 应该是和连击数过大有关
一般Tokyo Tyrant服务端在双核2.6 4G内存的服务器上能撑到1000并发连击数,过了1000有时候会telnet 不上去,这时候无法同步新数据,但是还是可以的查询原有的数据。

让处于TIME_WAIT状态的连接重用,可以提高 Tokyo Tyrant并发数

在/etc/sysctl.conf中加上:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000

然后
/sbin/sysctl -p


可以通过HTTP方式调用,下面以Linux的curl命令为例,介绍如何操作tokyotyrant:

 (1)、写数据,将数据“value”写入到“key”中: curl -X PUT http://127.0.0.1:11211/key -d "value"
 (2)、读数据,读取“key”中数据: curl http://127.0.0.1:11211/key
 (3)、删数据,删除“key”: curl -X DELETE http://127.0.0.1:11211/key
memcache java客户端连   Tokyo Tyrant 反序列化问题

memcache java客户端, Tokyo Tyrant的问题,Tokyo Tyrant传过来的flag始终为0.我修改了客户端get代码,直接反序列化。

猜你喜欢

转载自rockecsn.iteye.com/blog/1568523