主流NoSQL数据库评测之Tokyo Cabinet

上一篇文章我 们对NoSQL数据库产品中的HandlerSocket作了详细的评测。在本篇中要评测的NoSQL产品是Tokyo Cabinet和Tokyo Tyrant,Tokyo Cabinet是一个性能优秀的数据存储引擎,而Tokyo Tyrant则提供了访问Tokyo Cabinet数据的网络接口。这是一个很成熟的产品,在国内外也有众多的成功案例。php

  1、Tokyo Cabinet和Tokyo Tyrant简介html

  Tokyo Cabinet(简称TC)和Tokyo Tyrant(简称TT),顾名思义,是源自日本的开源项目。由FAL Labs维护,主要的开发人员是Mikio Hirabayashi。最先应用在日本最大的SNS网站mixi.jp上成功后而声名鹊起。linux

   TC是一个用C写的数据存储引擎,以key-value的方式存储数据,支持Hash、B+ tree、Hash Table等多种数据结构。同时提供了C、 Perl、 Ruby、Java和Lua等多种语言的API支持,可是若是经过网络来访问,就须要用TT。TT一样是用C写的,支持从网络端高并发、多线程的访问 TC。另外TC/TT支持master/slave架构,能够经过配置实现高可用性,这也是很不错的一个特性。web

  TC由于支持灵活的数据 结构而倍受欢迎,特别是Hash Table类型,很像传统的关系型数据库,只是每条存储记录的列是自由定义的,能够经过列做为条件来查询,十分方便。这是不少key-value结构的 NoSQL产品所不具有的特性。固然,Hash Table类型和Hash、B+ tree相比存取效率会低一些,任何事物都是有两面性的,在带来高度灵活度的同时,必然要牺牲部分的效率。数据库

  TC/TT是一个久经考验的 很稳定的产品,在千万及如下数据量级别表现出色。可是开发者因为种种缘由,已经很长时间没有更新版本了,而是推出了对应升级产品,叫作Kyoto Cabinet和Kyoto Tycoon,这也给TC/TT的前景带来了不明朗的因素,很明显做者是鼓励人们使用升级的产品,可是因为新产品没有更多的成功案例,在业界的影响力反而 不如TC/TT,所以在现阶段,TC/TT仍然是一个不错的NoSQL选择。apache

  2、测试说明缓存

  一、测试环境服务器

  TC/TT部署在一台PC 服务器上,配置以下:网络

  CPU为Xeon 2.80GHz *4数据结构

  内存为4G

  硬盘为一块400G SATA盘

  操做系统为64位CentOS 5.3版本

  二、测试方法

   这里仍然采用第三方实现的PHP客户端进行测试,网址为http://pecl.php.net/package/tokyo_tyrant,这是一个 标准的PHP扩展程序,能够编译到PHP运行环境中。要说明的是,这个PHP客户端实现的是TT接口,确定比使TT自带的tcrtest效率要低一些,但 是咱们的测试要尽可能模拟实际的生产环境,因此这里使用了第三方的PHP客户端。

  为了避免对测试服务器产生额外的影响,测试客户端部署在另一台独立的服务器上,运行的PHP的版本是5.3.5,web server是Nginx 0.8.54,经过fastcgi的方式调用PHP服务。使用apache ab工具实现多个请求和并发操做。

   为了更全面的反应TC/TT的性能,我对B+ tree和Hash Table两种数据库类型分别进行了测试,就使用上文提到的ttserver示例语句来创建测试数据库,每一个类型的测试又分为两个步骤,首先是写操做,通 过500个请求,每一个请求写入10000条记录,并发度为2来共写入500万条数据,数据的key为数字1到5000000,value大小为100个字 节。而后是读操做,也是用500个请求,每一个请求随机根据key值读出10000条记录,并发度为10共读出500万条记录,评测的重点是写入和读出数据 的时间,以及在此过程当中服务器的资源使用状况。

  3、安装和使用

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

  [root@localhost tctt]# wget http: // fallabs.com / tokyocabinet / tokyocabinet - 1.4 . 47 .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

  注意这里的lua扩展是可选的,若是不须要使用lua接口,能够没必要安装。

 

  二、安装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

  三、安装TC、TT和TC的lua扩展,注意的是若是要使用LUA接口,那么编译TT的时候要加--enable-lua参数:

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

[root@localhost tctt]# cd tokyocabinet
- 1.4 . 47

[root@localhost tokyocabinet
- 1.4 . 47 ]# . / configure

[root@localhost tokyocabinet
- 1.4 . 47 ]# make

[root@localhost tokyocabinet
- 1.4 . 47 ]# 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

  至此就安装完成了,整个过程很简单,固然安装过程可能须要一些其余的程序包,能够根据提示进行安装便可。

  TT提供了不少命令行工具来管理数据库,比较经常使用的两个是ttserver和tcrmgr。

  Ttserver的用法以下:

  ttserver [ - host name] [ - port num] [ - thnum num] [ - tout num] [ - dmn] [ - pid path] [ - kl] [ - log path] [ - ld| - le] [ - ulog path] [ - ulim num] [ - uas] [ - sid num] [ - mhost name] [ - mport num] [ - rts path] [ - rcc] [ - skel name] [ - mul num] [ - ext path] [ - extpc name period] [ - mask expr] [ - unmask expr] [dbname]

  各个参数的说明可查看官方文档,这里就不一一列举了。咱们能够创建一个hash table类型和一个B+ tree类型的数据库:

  ttserver - host 192.168 . 0.35 - port 11301 - thnum 8 - dmn - pid / home / tc / test_data / test_data_b.pid - log / home / tc / test_data / test_data_b.log - le - ulog / home / tc / test_data / - ulim 128m - sid 1 - rts / home / tc / test_data / test_data_b.rts / home / tc / test_data / test_data.tcb

ttserver
- host 192.168 . 0.35 - port 11302 - thnum 8 - dmn - pid / home / tc / test_data / test_data_t.pid - log / home / tc / test_data / test_data_t.log - le - ulog / home / tc / test_data / - ulim 128m - sid 1 - rts / home / tc / test_data / test_data_t.rts / home / tc / test_data / test_data.tct

  注意最后一个参数的扩展名tcb和tct决定了数据库的类型分别是B+ tree和table。

  经过tcrmgr命令行工具能够管理远程数据库,好比咱们要查看key为1的记录能够这样操做:

 

  [root@localhost tc]# tcrmgr get -port 11301 192.168.0.35 1

  要了解更详细的信息,读者能够参看官方文档。

  4、测试结果

  一、B+tree类型写操做

  成功写入500万条记录,共耗时739秒,平均每秒写入数据6766笔。数据文件大小137M。写入过程当中,服务器内存CPU和磁盘等资源使用状况以下图所示:

  

  

  

   可见,CPU使用率平稳,Idle值稳定在73到83之间,wait值稳定在7到12之间。内存分配上的变化较大,主要用来缓存数据,cache部分上 升了1.1G,可是没有交换区到内存的换入换出。磁盘IO表现有周期性的上下波动,估计和TC的实现机制有关,数据先写入内存缓冲区,而后按期的刷新到磁 盘。

  二、B+tree类型读操做

  成功读出500万条记录,共耗时1171秒,平均每秒读出数据4270笔。

  读数据过程当中没有发生磁盘IO。CPU较繁忙,Idle值稳定在38左右,等待CPU资源的进程一直在1到6个之间。内存表现平稳没有波动。

  

 

  三、Hash Table类型写操做

  成功写入445万条记录,写入失败55万条记录,共耗时1560秒,平均每秒写入数据2853笔。数据文件大小538M。写入过程当中,服务器内存、CPU和磁盘等资源使用状况以下图所示:

  

  

  CPU使用率较平稳,Idle值稳定在60到80之间,wait值最高在50左右,稳定在20到40之间。内存cache部分上升了0.7G用于缓存数据。磁盘IO表现有呈阶梯状的上升,最后达到100%,致使没法成功写入数据。

  四、Hash Table类型读操做

  成功读出500万条记录,共耗时175秒,平均每秒读出数据28571笔。

  读数据过程当中没有发生磁盘IO。CPU较繁忙,Idle值稳定在37到41之间,等待CPU资源的进程一直在1到9个之间。内存表现平稳没有波动。

  

  5、总结

   经过以上测试结果能够说明,TC/TT写入的数据的时候,先缓冲到内存中,而后经过必定的机制写入磁盘,这也是写的效率较高的缘由,可是由此带来了周期 性的磁盘繁忙,也可能有丢失数据的风险。写入的数据彻底缓存到了文件系统中,因此cache部分占用的内存大量增长,这也是读取数据的时候没有发生磁盘 IO的缘由。B+ tree类型写入性能十分优异,使人惊讶的是读出的速度反而慢于写入的速度。Hash Table类型写入性能通常,但读取性能良好。整体上来讲TC/TT在非海量数据的状况下表现不错,服务器资源占用稳定,读写效率较高。