(转)ttserver删除记录的问题

转自:http://bbs.linuxtone.org/home.php?mod=space&uid=17551&do=blog&id=3163
用ttserver,存放的数据量太大了,使用的是hash的存储模式,启动参数中对数据文件做过压缩,做过分片,但是目前的database.tch目录下的文件差不多140G了,最近一段时间一直想将该数据文件的大小给减小一些,但一直未能成功。

原本我以为通过删除ttserver中的记录,把对应的key和value删掉就可以把对应的database.tch的大小给降下来,于是我使用的是Tokyo tyrant中的管理命令 tcrmgr ,使用tcrmgr out -port xxxxx localhost key 这条命令,里边的key是筛选出来的一批key,执行完这个命令以后,通过tcrmgr inform -port xxxxx localhost 发现里边的record number确实减少了,但file size的值却没有任何变化,database.tch的大小也没减小,通过晚上搜寻资料发现tcrmgr out这个命令只是完成了一次逻辑上的删除,并没有实际对硬盘上的database.tch内的记录进行物理删除。

我本以为可能是由于在tcrmgr out的操作在内存中完成,没有写回到硬盘中,于是又执行了一次tcrmgr sync -port xxxxx localhost   但是完成以后,数据文件的大小依然没改变,
发现还是需要用tcrmgr optimize -port xxxx localhost来进行操作。
由于out参数是一种标记删除,当你在使用inform进行查询的时候,确实发现数据记录数变小了,但并没有同步清除掉硬盘中database.tch中的数据记录,这就导致了数据文件的大小不发生改变。

由于最开始删除的记录数比较少,当时测试optimize的时候,没有明显的效果,后来删除了将近1000万条记录,再次执行optimize的时候,发现数据文件相比原来减少了40G。
需要注意的是,在执行optimize优化数据文件时,ttserver的库是处于锁定状态的,即无法读写,因此如果你需要执行这条命令时,需要做好准备工作,特别是对线上服务器进行操作时,我在这次优化的过程中使用的方法是,在六台ttserver(从服务器)前加一个代理,然后逐台进行优化,这样不会影响服务。在ttserver(主服务器)方面,做双机互备,然后单台进行优化,此过程的缺点就是耗时过长。


./tcrmgr inform -port 5100 -st 10.10.10.14
starttime=`date "+%s"`;for((i=1;i<1001;i++)); do curl -X PUT http://10.10.10.14:5100/key_$i -d $i; done;endtime=`date "+%s"`;echo $(($endtime-$starttime));
starttime=`date "+%s"`;for((i=1;i<1001;i++)); do curl http://10.10.10.14:5100/key_$i; done;endtime=`date "+%s"`;echo $(($endtime-$starttime));

猜你喜欢

转载自lionlx.iteye.com/blog/1730514