tt安全


转http://hi.baidu.com/ah__fu/blog/item/309462946d463415d31b7058.html

今天一位朋友找我,说复制出来的tch文件,在遍历的时候少读出了很多记录。
阅读tchdb.c的源码,遍历的实现实际上是从文件的第一条记录开始,按照每个记录块遍历。因此,这样的遍历实际上是对所有记录的快照,如果服务器当时处于频繁的添加和删除,遍历是无法准确获取所有记录的。

这位朋友又提到,tch文件是在LINUX下用cp拷贝出来的,未处于联机状态。备份数据库的时候,直接对tch文件进行复制是不能完整的读取数据的,正确的办法是使用TokyoTyrant本身提供的备份工具来进行备份。用工具备份的时候,数据库处于加锁排他状态,能够保证数据的完整性。

从这点再想到,关闭ttserver的时候,一定不要野蛮地使用kill -9来杀死ttserver进程,必须使用kill -15或者kill -TERM来通知ttserver自动关闭。ttserver收到信号后,会将内存中的数据全部同步到磁盘,再退出,否则,写入的瞬间如果被杀死,可能导致记录块错误,造成tch文件的永久损坏。

因此,使用ttserver的时候,切记ttserver远比mysql脆弱,对于重要的数据,应该对数据的安全性引起重视。
这些情况需要了解:
1、写入的瞬间,如果ttserver进程被杀死,可能导致tch文件的某些记录块损坏,或者某些记录丢失。比如更新记录的时候,如果原来的块不够大,会先删除旧记录,再在新的位置插入,如果在这瞬间杀死进程,记录就会丢失;
2、写入记录后,如果ttserver进程被杀死,数据不会丢失。写入后,虽然数据未完全写入磁盘,但记录还存在于内核缓冲区中,进程杀死后,内核缓冲区中仍保留了数据,之后操作系统会负责写回;
3、瞬间断电,文件损坏、记录块损坏、数据丢失都是有可能发生的;
4、双击互为主备,这是对于重要的数据存储推荐的做法。如果希望数据的安全性更高,可以选择flare或者LightCloud等应用,通过群集来提高安全性;
5、ulog日志是可以用于数据恢复的,如果可能尽量保存足够完整的ulog日志;
6、不要在服务器运行的时候拷贝数据,很可能拷贝出来的数据文件是坏的。有三个办法:
·通过ulog文件,使用数据恢复的方式复制数据:tcrmgr restore -port 20000 192.168.0.100 $(pwd)/old_ulog/
·新建一个ttserver,将master指向要复制的服务器,这样就可以把旧服务器上的数据复制过来了
·使用tcrmgr工具备份出离线文件(不要直接cp):tcrmgr copy -port 20000 192.168.0.100 $(pwd)/temp/test2.tch。需要注意的是,这个工具会锁住整个数据库,访问频繁的时候不要执行。

猜你喜欢

转载自haoningabc.iteye.com/blog/1115166
tt1
TT