`

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代码,直接反序列化。

分享到:
评论

相关推荐

    tokyocabinet安装配置总结(Ubuntu)

    现在你可以编写程序或使用命令行工具(如`tcrdb`和`tctdb`)与Tokyocabinet数据库进行交互。例如,创建一个新的数据库、插入数据、查询数据等。 10. **文档资源**: 提供的`Tokyocabinet_Tokyotyrant文档大合集....

    tokyocabinet.cr:TokyoCabinet的Crystal客户端

    总之,`tokyocabinet.cr`为Crystal开发者提供了一个高效、便捷的接口,用于与TokyoCabinet数据库进行交互,使得在Crystal项目中存储和管理大量数据变得简单。通过理解TokyoCabinet的核心特性和`tokyocabinet.cr`的...

    tokyocabinet-1.4.30.tar

    Tokyocabinet是一款高效、轻量级且功能丰富的键值对数据库系统,广泛应用于日志存储、缓存服务以及各种数据持久化场景。其1.4.30版本的发布,意味着开发者们可以获取到最新的优化和改进。下面将详细探讨Tokyocabinet...

    再说tokyocabinet 及其扩展

    标题“再说tokyocabinet 及其扩展”指的是对Tokyo Cabinet这一开源数据库系统的深入讨论,以及可能涉及的对其功能的增强或优化。Tokyo Cabinet是一款高效、轻量级的键值存储系统,广泛用于数据缓存和日志记录等场景...

    tokyocabinet-1.4.48.tar.gz

    标题中的"tokyocabinet-1.4.48.tar.gz"表示的是Tokyo Cabinet的1.4.48版本的源码压缩包,它采用tar.gz格式进行打包,这是一种在Linux和类Unix系统中常见的文件归档和压缩方式。 Tokyo Cabinet提供了两种主要的数据...

    tokyotyrant/tokyocabinet/gpac

    结合“描述”中的信息,“对数据库的使用方式进行了修改,使得开源软件能够支持分布式的访问”,我们可以理解为TokyoTyrant 和 TokyoCabinet 被用作分布式数据库系统的一部分,可能与 GPAC 集成,以提供多媒体内容的...

    tokyocabinet-1.4.47.tar.gz

    下载tokyocabinet-1.4.47.tar.gz后,解压并编译源码,通常包括configure、make和make install步骤。安装完成后,可以通过提供的示例代码了解如何使用Tokyo Cabinet的API进行数据库操作。 10. 社区支持与维护: ...

    tokyocabinet

    东京暴君数据库的客户端封装,使东京暴君可以通过网络连接

    tokyocabinet源码分析

    Tokyocabinet是一个高效且轻量级的数据库管理系统(DBM),其主要特色在于提供了一系列灵活的数据存储方式,支持多种不同的数据库类型,包括基于哈希表、固定长度数组以及B+树等。本文将深入探讨Tokyocabinet的核心...

    tokyocabinet-1.4.45.tar.gz

    Tokyo Cabinet是一个高效、轻量级且开源的数据库管理系统,主要设计用于在本地存储大量数据。这个名为"tokyocabinet-1.4.45.tar.gz"的压缩包文件包含的是Tokyo Cabinet的1.4.45版本源代码。在本文中,我们将深入探讨...

    tokyocabinet中HDB和BDB引擎的存储速度比较

    标题中的“tokyocabinet”是一个轻量级的键值对数据库系统,它提供了两种不同的存储引擎:HDB(Hash Database)和BDB(Btree Database)。这两种引擎各有特点,适用于不同的场景。在进行存储速度的比较时,我们需要...

    redis数据库

    1. **键值(Key-Value)存储数据库**:如TokyoCabinet/Tyrant、Redis、Voldemort、BerkeleyDB等。这类数据库最适合用于内容缓存,尤其是面对高访问负载时表现出色。 2. **列存储数据库**:例如Cassandra、HBase、Riak...

    tokyocabinet.jar

    Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几...tokyocabinet.jar是该数据库的接口API

    NoSql数据库之Redis笔记

    - **键值(Key-Value)存储数据库**:如TokyoCabinet/Tyrant、Redis等,适合于内容缓存场景,数据模型为一系列键值对,优点在于快速查询,缺点是数据缺少结构化。 - **列存储数据库**:如Cassandra、HBase等,适用于...

    tokyocabinet-ruby-1.31.tar.gz_TOKYO_TokyoCabinet

    Tokyo cabinet 是一个管理数据库的库。该数据库是一个单一的数据文件,每个记录为关键字和值。每个关键字和值是可变长度的字节序。二进制数据和字符串都可作为关键字或值。每个关键字必须唯一。没有数据表和数据类型...

    Tokyocabinet-Tokyotyrant文档大合集

    这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符串。这里没有数据类型和数据表的概念。 当做为Hash表数据库使用时,每个key必须是不同的,因此无法...

    tokyocabinet-perl-1.34.tar.gz_TOKYO

    Tokyo cabinet 是一个管理数据库的库。该数据库是一个单一的数据文件,每个记录为关键字和值。每个关键字和值是可变长度的字节序。二进制数据和字符串都可作为关键字或值。每个关键字必须唯一。没有数据表和数据类型...

    tokyocabinet-java-1.24.tar.gz_TOKYO_Tokyo Cabinet java_tokyocabi

    Tokyo cabinet 是一个管理数据库的库。该数据库是一个单一的数据文件,每个记录为关键字和值。每个关键字和值是可变长度的字节序。二进制数据和字符串都可作为关键字或值。每个关键字必须唯一。没有数据表和数据类型...

Global site tag (gtag.js) - Google Analytics