Tokyo Cabinet

Tokyo Cabinet (简称TC)是Mikio Hirabayashi开发的一种DBM的开发库,其数据文件只有一个,里面存放多个<key,value>的数据记录,所有操作都是依据 key做主键操作。key,value都可以是连续不定长,即可以是二进制,也可是是字符串。数据文件中的记录组织有三种模式,hash表,B+树,定长 数组。

做为hash表,主键key必须是唯一的,方法有:按key来存储value到一个记录,按key来删除一个记录,按key来获取一个记录的 value。另外还有一个获取所有key的方法,获取的key是不排序的。TC可以做为NDBM,GBM的替代品,因为有更高的性能。

当采用B+树时,可以存储相同key的多条记录,有存储,删除,读取的方法,还可以按照一定顺序来读取记录。

做为一个定长数组,key必须是自然数,其它的和hash表完全一样,因为key是自然数,所以速度比hash表要快。

以上三种数据库即可以只保存在内存中,也可以指定保持到硬盘。应用最广泛的,当然就是hash表了。

Tokyo Tyrant

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

TT支持的协议包括memcached的持续连接,http1.1的长连接,并且数据文件,有热备,更新日志,复制功能,这些都给TT很高的可用性 和高性能。并且,TT内嵌lua脚本的支持,可以对数据进行处理。(看来lua脚本已经是unix下内嵌脚本的首选了)。目前(2008.12)为止TT 只能运行在linux,freebsd,macos系统上。

安装等请参见官网 ,或者s135文章

TT的程序

TT的服务器程序是ttserver ,默认端口1978(作者的出生在1978?后来在他主页得到了验证)。在启动的时候,根据参数 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 : 指定用来存放同步时间戳的文件名。
  (以上cp自 http://blog.s135.com/post/362.htm)
  -ext path : 扩展的脚本文件
  -mask expr : 需要禁止的命令,多个命名用","隔开
  -unmaks expr : 允许的命令 
   除了覆盖TC基本的操作命令,例如put,get,out,等,还有一些另类的表达式:all:所有命令,allorg:所有的二进 制协议,allmc:所有的memcached协议,allhttp:所有的http协议, "allread" is the abbreviation of `get', `mget', `vsiz', `iterinit', `iternext', `fwmkeys', `rnum', `size', and `stat'. "allwrite" is the abbreviation of `put', `putkeep', `putcat', `putshl', `putnr', `out', `addint', `adddouble', and `vanish'. "allmanage" is the abbreviation of `sync', `copy', `restore', and `setmst'. "repl" means replication as master. "slave" means replication as slave.

如果不想这么麻烦的启动,可以使用ttservctl简单的命令来控制。ttservctl start,stop,restart,hup。使用这个命令,数据库文件位于/var/ttserver/casker.tch,log等相关文件位于 /var/ttserver。

ttulmgr :用来在二进制ulog文件(update log)和text格式的TSV文件之间转换

ttserver对外有三种协议,可以用curl程序调用http协议访问,可tt自带的客户端程序,使用私有二进制协议访问。

tcrtest :测试程序, tc remote test
tcrmttest :多线程测试程序 tc multi-thread test
两个测试程序写入的数据key,value均是8字节的,按照00000001,00000002格式

tcrtest write host rnum : 写入 rnum条记录(是重新写,不是追加)
tcrtest read host : 读出所有记录
tcrtest remote host : 删除所有记录

tcrmgr : 测试和调试ttserver的程序,很多用法就就见官方文档了,主要有:
tcrmgr inform host : 获取服务器的信息
tcrmgr put host key value : 添加记录
tcrmgr get host key : 获取记录
tcrmgr out host key : 删除记录
tcrmgr list host : 列出数据库中所有的key(这个在memcached中是需要patch才能实现的)
tcrmgr vanish host : 删除所有数据 
还有一些命名是和主从同步,备份相关的

ttserver和用户数据库

TC,ttserver这种DBM方式的数据库,对我们目前的应用来说,最适合的是用来作用户数据库,完全用userid做key。通常存储用户数 据库,都使用的是关系型数据库,例如:mysql,pgsql,oracle。从用户数据库特性(数据格式单一,访问量大等)来说,DBM格式是最适合 的。在采用TC,ttserve上,最大的问题就是技术支持和持久性。仔细分析这点,对很多普通公司(不深入到opensource代码级)来说,用 mysql,pgsql,oracle等,有了问题,也就是用这些数据库提供的管理命令弄弄,调调参数,重启,从备份中恢复。其实和你使用 TC,ttserver,可做的事情都是一样。再退一万步来说,如果真需要深入到源代码级寻找问题,TC,ttserve两个加起来才1M不到,和 mysql,pgsql源代码的复杂程度的几十分之一。
google的账户数据库就是<key,value>形式的Berkeley DB (简称:BDB,已经被oracle收购了), Google. Accounts uses Berkeley DB HA for the storage and retrieval of user 。

ttserver和memcached

ttserver是数据库,memcached是缓存。两者都是保存<key,value>形式的数据,通过key进行任何操作。 ttserver可以将数据持久化保存,memcached全部是保存在内存中,memcached会自动删除过期数据,最长不超过30天。 memcached在和一些api配合时,能自动进行数据的出入序列化,读取反序列化。ttserver有主从复制的功能,操作日志等,这完全是数据库才 有的东西。据说memcached正在对整体架构做调整,到时候支持plugin机制.会把网络,事件处理,内存存储剥离开来.以后要做基于磁盘的 key-value存储就可以写一个存储引擎就成了。memcached的二次开发又步入一个小高潮。

TC和BDB

BDB配置开发起来比较麻烦,因为它没有ttserver这个一样的网络接口。BDB的数据文件会比较大,有时需要执行文件收缩,利用BDB开发的memcachedb就有这种问题。BDB开发已经很长时间了,成熟度高,无论是bug,支持,资料会比tc要好很多。

ttserver和关系型数据库

ttserver是<key,value>形式,在根据key进行读取,写入时速度是飞快的,但在做统计的时候,就比较麻烦了,还是需 要自己写程序,从ulog中到处log,转换成sql语句,后台写入关系型数据库,然后再利用成熟的接口,逻辑,进行统计。或者应用在更改 ttserver时,发送消息(mq,syslog等)到辅助进程,辅助进程进行相应的数据操作。这种情况下,关系数据库完全是ttserver的另一种 形式的存在,除了性能有所缺陷,在应用,统计上更加方便。

====

2009.3.8 补充

使用B+存储,可以构造FIFO的队列,通过tcbmgr put -dd c.tcb a aa 可存放进具有重复主键的值,在get的时候,只获取第一个。而使用out命令,可以删除第一个值。

-dd 是 dbputdup缩写的意思。

在1.4.0版本的tc后,又多了一种存储方式 tct,包含了字段的概念。

性能强劲的Tokyo Cabinet 和 Tokyo Tyrant的更多相关文章

  1. 非关系型数据库(NoSql)

    最近了解了一点非关系型数据库,刚刚接触,觉得这是一个很好的方向,对于大数据 方面的处理,非关系型数据库能起到至关重要的地位.这里我主要是整理了一些前辈的经验,仅供参考. 关系型数据库的特点 1.关系型 ...

  2. NoSQL数据库探讨之一 - 为什么要用非关系数据库?

    随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速.而传统的关系数据库在应付 web2.0网站,特别是超大规模和高并发的SNS类型的web2 ...

  3. key-value数据库

    http://blog.csdn.net/byane/article/details/6928519 传统的文件系统中,需要维护目录的层次结构,使用dentry,inode,directory等复杂结 ...

  4. 浅尝key-value数据库(一)——一览NoSQL

    浅尝key-value数据库(一)——一览NoSQL 最近由于一个项目的关系,研究了一下key-value数据库这个最近很火的概念.本系列从项目需求的角度分析并测试了几个key-value数据库的性能 ...

  5. Linux实战教学笔记44:NoSQL数据库开篇之应用指南

    第1章 NoSQL数据库 1.1 NoSQL概述 自关系型数据库诞生40年以来,从理论产生发展到现实产品,例如:大家最常见的MySQL和Oracle,逐渐在数据库领域里上升到了霸主地位,形成每年高达数 ...

  6. NoSQL数据库介绍(4)

    4 键/值存储      讨论了经常使用的概念.技术和模式后.第一类NoSQL数据存储会在本章进行研究. 键/值存储通常有一个简单的数据模型:一个map/dictionary,同意客户按键来存放和请求 ...

  7. Tokyocabinet/Tokyotyrant文档大合集

    1. 前言 这里不是我个人原创,是我对网络上整理到的资料的再加工,以更成体系,更方便研究阅读.主要是对其中跟主题无关的文字删除,部分人称稍做修改;本人无版权,您可以将本页面视为对参考页面的镜像.第二部 ...

  8. TT(Tokyo Tyrant )介绍及使用

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

  9. Tokyo Tyrant(TTServer)系列(一)-介绍和安装

    Tokyo Cabinet 是日本人Mikio Hirabayashi 开发的一款DBM 数据库,该数据库读写很快.哈希模式写入100 万条数据仅仅需0.643 秒.读取100 万条数据仅仅需0.77 ...

随机推荐

  1. hdu 2349 最小生成树

    /* 刚開始想错了,我以为必须是相邻的点才干连接.原来无线距离能够随意连接 对最小生成树理解不够深啊 */ #include<stdio.h> #include<math.h> ...

  2. Junit使用教程(三)

    四.实例总结 1. 参数化测试 有时一个测试方法,不同的参数值会产生不同的结果,那么我们为了测试全面,会把多个参数值都写出来并一一断言测试,这样有时难免费时费力,这是我们便可以采用参数化测试来解决这个 ...

  3. 小技巧之Selenium如何切换到弹出的Tab页中

    今天群里讨论了一个问题,如何将selenium的操作焦点切换到浏览器中新弹出来的Tab页中,正好对应到了昨天的那篇文章“小技巧之在浏览器中打开新的页签”.今天就带大家来解决这个问题: 先封装一个Tab ...

  4. macOS 安装安卓模拟器 并用charles抓包

    mac上面安装安卓模拟器并能使用charles抓包软件调研 一.Genymotion 1.先下载Virtua Box虚拟机 https://www.virtualbox.org/wiki/Downlo ...

  5. Cannot lock storage /tmp/hadoop-root/dfs/name. The directory is already locked.

    [root@nn01 bin]# ./hadoop namenode -format 12/05/21 06:13:51 INFO namenode.NameNode: STARTUP_MSG: /* ...

  6. SetTimer时间间隔的问题

    1.用WM_TIMER来设置定时器   SetTimer函数的原型 UINT_PTR SetTimer( HWND hWnd,                      // 窗体句柄 UINT_PT ...

  7. CyclicBarrier的工作原理及其实例

    CyclicBarrier是多线程中一个重要的类,主要用于线程组内部之间的线程的相互等待问题. 1.CyclicBarrier的工作原理 CyclicBarrier大致是可循环利用的屏障,顾名思义,这 ...

  8. 修改Liunx服务器SSH端口

    为提高Linux系统安全性,我们经常会修改ssh端口,下面以CentOS 6为例: vi /etc/ssh/sshd_config 修改ssh端口,默认配置如下: 修改为自己想要的端口号(小于6553 ...

  9. FreeSWITCH版本更新

    [1]FreeSWITCH版本更新 从2014年10月底开始,FreeSWITCH代码库改为由stash管理,该管理工具能更好地与jira集成. 如果你以前已经clone了代码,请做如下更新: git ...

  10. Myecplise Tomcat 启动很慢

    今天突然遇到一个问题,tomcat在Myecplse启动非常慢,直接用tomcat自带的start.bat启动很快,如果通过Myeclipse启动会发现项目一直在实例化,最后发现是因为加了断点调试,断 ...