<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[清空数据]Tokyo Tyrant（TTServer）系列-memcache协议及启动ttserver示例。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Sat, 12 Oct 2013 01:39:09 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：其实ttserver一直没有实践过，昨天有同事问怎么样清空，我查了下好像和memcache一样的协议，用telnet上其端口用：flush_all 就能清空。<br/>通过memcache协议使用ttserver<br/> 通过telnet 127.0.0.1 1978 telnet连接到到我们第一节的启动实例。<br/>以下我们通过add增加key为key1和value为value1的数据。<br/>通过get key1获取数据，如果你看不明白，可以搜索下memcache协议的东西看下。<br/>add key1 1 0 6<br/>value1<br/>STORED<br/>get key1<br/>VALUE key1 0 6<br/>value1<br/>END<br/><br/>通过php使用<br/><textarea name="code" class="php" rows="15" cols="100">
$mem=new Memcache();
$mem-&gt;connect(&quot;192.168.15.178&quot;,1978);
$mem-&gt;add(&quot;key2&quot;,&quot;value2&quot;);
print_r( $mem-&gt;get(&quot;key2&quot;));
echo &quot;&lt;hr&gt;&quot;;
$mem-&gt;add(&quot;key3&quot;,array(&quot;value3&quot;=&gt;&quot;this is value3&quot;));
print_r($mem-&gt;get(&quot;key3&quot;));
?&gt;
</textarea><br/>运行后输出：<br/> <br/>value2 a:1:&#123;s:6:&quot;value3&quot;;s:14:&quot;this is value3&quot;;&#125;<br/><br/>来自：http://www.cnblogs.com/sunli/archive/2009/03/18/1415168.html<br/>用Nginx作反向代理 ：http://blog.csdn.net/starxu85/article/details/5247491<br/>摘录：<br/>2.利用nginx实现http协议的高可用性<br/>2.1为什么要把nginx扯进来？<br/>ttserver提供了http接口<br/>ttserver没有提供安全 保证<br/>nginx在处理http请求和反向代理的性能 非常好<br/><br/>nginx的反向代理具有负载均衡和健康检查功能<br/>当然，也可参考：http://www.s135.com/post/384/<br/><br/><br/>启动ttserver的示例：<br/><textarea name="code" class="C" rows="15" cols="100">
/usr/local/bin/ttserver -port 21213 -ld -dmn -pid /data/ttserver/21213/ttserver.pid -log /data/ttserver/21213/ttserver.log -ulog /data/ttserver/21213/ulog -ulim 256m -sid 8213 -rts /data/ttserver/21213/ttserver.rts /data/ttserver/21213/database.tch#bnum=1000
/usr/local/bin/ttserver -port 21211 -ld -dmn -pid /data/ttserver/21211/ttserver.pid -log /data/ttserver/21211/ttserver.log -ulog /data/ttserver/21211/ulog -ulim 256m -sid 8211 -rts /data/ttserver/21211/ttserver.rts /data/ttserver/21211/database.tch#bnum=1000
</textarea><br/><br/>ttserve安装及测试：<br/>概述<br/>编辑<br/><br/>Tokyo Cabinet 是一款 DBM 数据库，该数据库读写非常快，哈希模式写入100万条数据只需0.643秒，读取100万条数据只需0.773秒，是 Berkeley DB 等 DBM 的几倍。利用Tokyo Tyrant构建兼容Memcached协议、支持故障转移、高并发的分布式key-value持久存储系统。key-value分布式存储系统查询速度快、存放数据量大、支持高并发，非常适合通过主键进行查询，但不能进行复杂的条件查询。<br/>Tokyo Tyrant 是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有Memcached兼容协议，也可以通过HTTP协议进行数据交换。Tokyo Tyrant 加上 Tokyo Cabinet，构成了一款支持高并发的分布式持久存储系统，对任何原有Memcached客户端来讲，可以将Tokyo Tyrant看成是一个Memcached，但是，它的数据是可以持久存储的。<br/>2ttserve安装<br/>编辑<br/><br/>下载zlib和bzip并进行安装，因为我使用的是ubuntu系统，所以直接apt-get install libbz2-dev就 ok了。<br/>安装tokyo cabinet<br/>下载 tokyocabinet-1.4.41.tar.gz<br/>tar zxvf tokyocabinet-1.4.41.tar.gz<br/>cd tokyocabinet-1.4.41/<br/>64位系统安装方法<br/>./configure<br/>make<br/>make install<br/>32位系统安装方法<br/>./configure --enable-off64 #启动64位偏移，因为本机是32位，如果不加此参数，数据库文件超过2G就会崩溃<br/>make<br/>make install<br/>因为我的机器是32位，所以选择第二种方法<br/>安装tokyo tyrant<br/>tar zxvf tokyotyrant-1.1.40.tar.gz<br/>cd tokyotyrant-1.1.40<br/>./configure<br/>make<br/>make install<br/>创建tokyo tyrant数据文件存放的目录<br/>mkdir -p /ser/ttserver<br/>ttserver相关参数<br/>ttserver [-host name] [-port num] [-thnum num] [-tout num] [-dmn] [-pid path] [-log path] [-ld&#124;-le] [-ulog path] [-ulim num] [-uas] [-sid num] [-mhost name] [-mport num] [-rts path] [-ext path] [-mask expr] [-unmask expr] [dbname]<br/>-host name : 指定需要绑定的服务器域名或IP地址。默认绑定这台服务器上的所有IP地址。<br/>-port num : 指定需要绑定的端口号。默认端口号为1978<br/>-thnum num : 指定线程数。默认为8个线程。<br/>-tout num : 指定每个会话的超时时间（单位为秒）。默认永不超时。<br/>-dmn : 以守护进程方式运行。<br/>-pid path : 输出进程ID到指定文件（这里指定文件名）。<br/>-log path : 输出日志信息到指定文件（这里指定文件名）。<br/>-ld : 在日志文件中还记录DEBUG调试信息。<br/>-le : 在日志文件中仅记录错误信息。<br/>-ulog path : 指定同步日志文件存放路径（这里指定目录名）。<br/>-ulim num : 指定每个同步日志文件的大小（例如128m）。<br/>-uas : 使用异步IO记录更新日志（使用此项会减少磁盘IO消耗，但是数据会先放在内存中，不会立即写入磁盘，如果重启服务器或ttserver进程被kill掉，将导致部分数据丢失。一般情况下不建议使用）。<br/>-sid num : 指定服务器ID号（当使用主辅模式时，每台ttserver需要不同的ID号）<br/>-mhost name : 指定主辅同步模式下，主服务器的域名或IP地址。<br/>-mport num : 指定主辅同步模式下，主服务器的端口号。<br/>-rts path : 指定用来存放同步时间戳的文件名。<br/>-ext path : 扩展的脚本文件<br/>-mask expr : 需要禁止的命令，多个命名用&quot;，&quot;隔开<br/>-unmaks expr : 允许的命令<br/>单机模式启动<br/>ttserver -host 127.0.0.1 -port 11211 -thnum 8 -dmn -pid /ser/ttserver/ttserver.pid -log /ser/ttserver/ttserver.log -le -ulog /ser/ttserver/ -ulim 128m -sid 1 -rts /ser/ttserver.rts /ser/ttserver/database.tch<br/>启动的时候，根据参数database名来确定使用的TC数据库类型。如果为&quot;*&quot;，则使用内存hash表，如果为&quot;+&quot;，则使用内存B+库，如果后缀为&quot;.tch&quot;，则使用hash表，如果后缀为&quot;.tcb&quot;，则使用B+树数据库，如果后缀为&quot;.tcf&quot;，则使用定长数组。如果dbname参数被省略，则采用内存hash数据库。<br/>如果使用的是哈希数据库，可以指定参数“#bnum=xxx”来提高性能。它可以指定bucket存储桶的数量。例如指定“#bnum=1000000”，就可以将最新最热的100万条记录缓存在内存中。<br/>ttserver -host 127.0.0.1 -port 11211 -thnum 8 -dmn -pid /ser/ttserver/ttserver.pid -log /ser/ttserver/ttserver.log -le -ulog /ser/ttserver/ -ulim 128m -sid 1 -rts /ser/ttserver.rts /ser/ttserver/database.tch#bnum=1000000<br/>如果大量的客户端访问ttserver，请确保文件描述符够用。许多服务器的默认文件描述符为1024，可以在启动ttserver前使用ulimit命令提高这项值。例如：ulimit -SHn 51200<br/>关闭服务<br/>cat /ser/ttserver/ttserver.pid或者ps -ef&#124;grep ttserver<br/>kill -TERM 10095<br/>调用<br/>写入<br/>curl -X PUT http://127.0.0.1:11211/key -d &quot;ttserver&quot;<br/>读取<br/>curl http://127.0.0.1:11211/key<br/>删除<br/>curl -X DELETE http://127.0.0.1:11211/key<br/>测试写入和读取1000条数据<br/>starttime=`date &quot;+%s&quot;`;for((i=1;i&lt;1001;i++)); do curl http://127.0.0.1:11211/key_$i; done;endtime=`date &quot;+%s&quot;`;echo $(($endtime-$starttime));<br/><br/>摘自：http://baike.baidu.com/view/3551871.htm?fr=aladdin<br/><br/>附录：CURL -X参数说明<br/>-X/--request &lt;command&gt; Specify request command to use<br/>写入<br/>curl -X PUT http://127.0.0.1:11211/key -d &quot;ttserver&quot;<br/>读取<br/>curl http://127.0.0.1:11211/key<br/>删除<br/>curl -X DELETE http://127.0.0.1:11211/key<br/>测试写入和读取1000条数据<br/>starttime=`date &quot;+%s&quot;`;for((i=1;i&lt;1001;i++)); do curl http://127.0.0.1:11211/key_$i; done;endtime=`date &quot;+%s&quot;`;echo $(($endtime-$starttime));<br/><br/>可以用fiddler2加上curl的代理了解这个-X：<br/>curl -x 10.0.0.172:80 www.wo.com.cn 此命令使用10.0.0.172:80这个代理服务器IP和端口访问站点www.wo.com.cn<br/><br/>fiddler2 提供的 8888 端口(ttserver:21211,21213):<br/>curl -x 127.0.0.1:8888 -X PUT http://192.168.109.7:21211/key -d &quot;ttserver&quot;<br/>读取：<br/>curl -x 127.0.0.1:8888 http://192.168.109.7:21211/key<br/>删除<br/>curl -x 127.0.0.1:8888&nbsp;&nbsp;-X DELETE http://192.168.109.7:21211/key<br/><br/>上面的写入读取及删除，实践如下：<br/><textarea name="code" class="C" rows="15" cols="100">
C:&#92;Users&#92;admin&gt;curl -x 127.0.0.1:8888 -X PUT http://192.168.109.7:21211/key -d &quot;ttserver&quot;
Created
C:&#92;Users&#92;admin&gt;curl -x 127.0.0.1:8888 http://192.168.109.7:21211/key
ttserver
C:&#92;Users&#92;admin&gt;curl -x 127.0.0.1:8888&nbsp;&nbsp;-X DELETE http://192.168.109.7:21211/key
OK
</textarea><br/>单独对写入作fiddler2下的http请求头分析：<br/>一)C:&#92;Users&#92;admin&gt;curl -x 127.0.0.1:8888 http://192.168.109.7:21211/key<br/>ttserver<br/><textarea name="code" class="php" rows="15" cols="100">
Fillder里看到的header头情况：
Url：
http://192.168.109.7:21211/key
请求头：
[codes=C]
PUT http://192.168.109.7:21211/key HTTP/1.1
User-Agent: curl/7.17.0 (i586-pc-mingw32msvc) libcurl/7.17.0 zlib/1.2.2
Host: 192.168.109.7:21211
Pragma: no-cache
Accept: */*
Connection: Keep-Alive
Content-Length: 8
Content-Type: application/x-www-form-urlencoded
</textarea><br/>POST参数，fiddler2的右侧webform：<br/><textarea name="code" class="C" rows="15" cols="100">
Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Value
ttserver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值空的
</textarea><br/><br/>http请求返回：<br/>HTTP/1.1 201 Created<br/>Content-Type: text/plain<br/>Content-Length: 8<br/>Created<br/>[/codes]<br/><br/>二)C:&#92;Users&#92;admin&gt;curl -x 127.0.0.1:8888 http://192.168.109.7:21211/key<br/>ttserver<br/><textarea name="code" class="php" rows="15" cols="100">
GET http://192.168.109.7:21211/key HTTP/1.1
User-Agent: curl/7.17.0 (i586-pc-mingw32msvc) libcurl/7.17.0 zlib/1.2.2
Host: 192.168.109.7:21211
Pragma: no-cache
Accept: */*
Connection: Keep-Alive
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 8
</textarea><br/>返回：<br/><textarea name="code" class="C" rows="15" cols="100">
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 8
ttserver
</textarea><br/><br/>三)C:&#92;Users&#92;admin&gt;curl -x 127.0.0.1:8888&nbsp;&nbsp;-X DELETE http://192.168.109.7:21211/key<br/>OK<br/>请求头：<br/><textarea name="code" class="C" rows="15" cols="100">
DELETE http://192.168.109.7:21211/key HTTP/1.1
User-Agent: curl/7.17.0 (i586-pc-mingw32msvc) libcurl/7.17.0 zlib/1.2.2
Host: 192.168.109.7:21211
Pragma: no-cache
Accept: */*
Connection: Keep-Alive
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 3
</textarea><br/><br/>返回：<br/><textarea name="code" class="php" rows="15" cols="100">
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 3
OK
</textarea><br/><br/>最后，<br/>发现这个curl的 -X参数有点意思，也就是在http的头里加上PUT，GET，DELETE：<br/>PUT http://192.168.109.7:21211/key<br/>GET http://192.168.109.7:21211/key<br/>DELETE http://192.168.109.7:21211/key<br/>key就是键值，而这个传入PUT时的form有键无值，这个键就是存入ttserver的值，通过GET及DELETE能够对这个存入的ttserver值进行各种操作。
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [清空数据]Tokyo Tyrant（TTServer）系列-memcache协议及启动ttserver示例。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>