设为首页 收藏本站
查看: 3235|回复: 0

[经验分享] Tokyo Tyrant-兼容Memcached协议的分布式key-value持久存储系统以及Java client 使用(转)

[复制链接]

尚未签到

发表于 2015-9-2 10:51:49 | 显示全部楼层 |阅读模式
[文章作者:张宴 本文版本:v1.4 最后修改:2010.06.11 转载请注明原文链接:http://blog.s135.com/read.php/362/]
  Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几倍。
   DSC0000.gif

  Tokyo Tyrant 是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有Memcached兼容协议,也可以通过HTTP协议进行数据交换。
  Tokyo Tyrant 加上 Tokyo Cabinet,构成了一款支持高并发的分布式持久存储系统,对任何原有Memcached客户端来讲,可以将Tokyo Tyrant看成是一个Memcached,但是,它的数据是可以持久存储的。这一点,跟新浪的Memcachedb性质一样。
  相比Memcachedb而言,Tokyo Tyrant具有以下优势:
  1、故障转移:Tokyo Tyrant支持双机互为主辅模式,主辅库均可读写,而Memcachedb目前支持类似MySQL主辅库同步的方式实现读写分离,支持“主服务器可读写、辅助服务器只读”模式。
   DSC0001.gif
  这里使用 $memcache->addServer 而不是 $memcache->connect 去连接 Tokyo Tyrant 服务器,是因为当 Memcache 客户端使用 addServer 服务器池时,是根据“crc32(key) % current_server_num”哈希算法将 key 哈希到不同的服务器的,PHP、C 和 python 的客户端都是如此的算法。Memcache 客户端的 addserver 具有故障转移机制,当 addserver 了2台 Memcached 服务器,而其中1台宕机了,那么 current_server_num 会由原先的2变成1。
  引用 memcached 官方网站和 PHP 手册中的两段话:


引用
http://www.danga.com/memcached/
If a host goes down, the API re-maps that dead host's requests onto the servers that are available.
http://cn.php.net/manual/zh/function.Memcache-addServer.php
Failover may occur at any stage in any of the methods, as long as other servers are available the request the user won't notice. Any kind of socket or Memcached server level errors (except out-of-memory) may trigger the failover. Normal client errors such as adding an existing key will not trigger a failover.

  2、日志文件体积小:Tokyo Tyrant用于主辅同步的日志文件比较小,大约是数据库文件的1.3倍,而Memcachedb的同步日志文件非常大,如果不定期清理,很容易将磁盘写满。

  3、超大数据量下表现出色:
   DSC0002.gif
  但是,Tokyo Tyrant 也有缺点:在32位操作系统下,作为 Tokyo Tyrant 后端存储的 Tokyo Cabinet 数据库单个文件不能超过2G,而64位操作系统则不受这一限制。所以,如果使用 Tokyo Tyrant,推荐在64位CPU、操作系统上安装运行。

  一、安装
  1、首先编译安装tokyocabinet数据库

wget http://www.1978th.net/tokyocabinet/tokyocabinet-1.4.45.tar.gz
tar zxvf tokyocabinet-1.4.45.tar.gz
cd tokyocabinet-1.4.45/
./configure
#注:在32位Linux操作系统上编译Tokyo cabinet,请使用./configure --enable-off64代替./configure,可以使数据库文件突破2GB的限制。
#./configure --enable-off64
make
make install
cd ../
  2、然后编译安装tokyotyrant

wget http://www.1978th.net/tokyotyrant/tokyotyrant-1.1.40.tar.gz
tar zxvf tokyotyrant-1.1.40.tar.gz
cd tokyotyrant-1.1.40/
./configure
make
make install
cd ../

  二、配置
  1、创建tokyotyrant数据文件存放目录

mkdir -p /ttserver/
  2、启动tokyotyrant的主进程(ttserver)
  (1)、单机模式

ulimit -SHn 51200
ttserver -host 127.0.0.1 -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.tcb#lmemb=1024#nmemb=2048#bnum=10000000
  (2)、双机互为主辅模式
  服务器192.168.1.91:

ulimit -SHn 51200
ttserver -host 192.168.1.91 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 91 -mhost 192.168.1.92 -mport 11211 -rts /ttserver/ttserver.rts /ttserver/database.tcb#lmemb=1024#nmemb=2048#bnum=10000000
  服务器192.168.1.92:

ulimit -SHn 51200
ttserver -host 192.168.1.92 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 92 -mhost 192.168.1.91 -mport 11211 -rts /ttserver/ttserver.rts /ttserver/database.tcb#lmemb=1024#nmemb=2048#bnum=10000000
  (3)、参数说明
  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] [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 : 指定用来存放同步时间戳的文件名。
  如果使用的是哈希数据库,可以指定参数“#bnum=xxx”来提高性能。它可以指定bucket存储桶的数量。例如指定“#bnum=1000000”,就可以将最新最热的100万条记录缓存在内存中:

ttserver -host 127.0.0.1 -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
  如果大量的客户端访问ttserver,请确保文件描述符够用。许多服务器的默认文件描述符为1024,可以在启动ttserver前使用ulimit命令提高这项值。例如:

ulimit -SHn 51200
  3、停止tokyotyrant(ttserver)

ps -ef | grep ttserver
  找到ttserver的进程号并kill,例如:

kill -TERM 2159

  三、调用
  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
下面介绍下 tokyotyrant-java
RDB
  RDB provides simple synchronous API.  See the example
MRDB
  MRDB provides effcient asynchronous API. See the example
  


package tokyotyrant.example;
import tokyotyrant.MRDB;
import tokyotyrant.networking.NodeAddress;
import tokyotyrant.transcoder.DoubleTranscoder;
import tokyotyrant.transcoder.IntegerTranscoder;
public class MRDBExample {
        public static void main(String[] args) throws Exception {
                Object value;
                // create the object
                MRDB db = new MRDB();
                // connect to the servers
                db.open(NodeAddress.addresses("tcp://localhost:1978"));
                // store records
                if (!db.await(db.put("foo", "hop"))
                                || !db.await(db.put("bar", "step"))
                                || !db.await(db.put("baz", "jump"))) {
                        System.err.println("put error");
                }
                // retrieve records
                value = db.await(db.get("foo"));
                if (value != null) {
                        System.out.println(value);
                } else {
                        System.err.println("get error");
                }
                // add int
                db.put("int", 3, new IntegerTranscoder());
                int i = db.await(db.addint("int", 4));
                System.out.println(i);
                // add double
                db.put("d", 3.0D, new DoubleTranscoder());
                double d = db.await(db.adddouble("d", 4.0D));
                System.out.println(d);
                // close the connections
                db.close();
        }
  }
  


package my.test;
import tokyotyrant.MRDB;
import tokyotyrant.networking.NodeAddress;
/**
* 测试使用MRDB
* @author henry
* @verion 1.0
* @date 2009-7-13
*/
public class TestTTDB {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
      
        try {
            //实例化一个MRDB(Multiple Rs DB:多重认证数据库)
            MRDB rdb = new MRDB();
            //启动一个链接
            rdb.open(NodeAddress.addresses("tcp://192.168.1.140:11211"));
           
            //rdb.await判断数据库链接是否还存活,是则rdb.put插入数据
            //类似于一个多用途RDB管理器
            if(!rdb.await(rdb.put("name1", "Tom")) ||
                    !rdb.await(rdb.put("myName1", "Jam"))) {
                System.out.println("Error"); //如果链接已断开,则打印Error
            }
           
            //从数据库中读取name1这个参数的值
            Object value = rdb.await(rdb.get("name1"));
           
            if(value != null) {//判断数据是否为空
                System.out.println(value);
            } else {
                System.out.println("value is null");
            }
           
            rdb.close();//关闭数据库链接
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      
    }
  }
  

  在eclipse中,需要的jar如下:



DSC0003.jpg 其中要用到slf4j,log4j,还有netty,否则会连接不上TTserver  
  
  回应网友问题:
  mrdb不需要再增加任何连接池,支持高并发操作。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-108648-1-1.html 上篇帖子: 在Linux上安装memcached服务器端 下篇帖子: memcached for windows 修改端口和最大内存
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表