背景:
一些关键的业务经常需要做1+1的双机热备来实现高可用,双机热备一个关键点就是如何保证实时的数据同步。比较有名的drbd是在文件系统之下基于块设备做数据同步,基于块设备做同步跟上层应用完全隔离,在通用性上确实是一个大优点,但同时也引入了三个明显的缺点:
1,互备的数据的两台机器必须有一个独立的相同大小的硬盘分区用于DRBD同步;
2,运行过程中备机保存数据的分区不能被mount, 所以这个时候备机数据不可见;
3,有时在主机上的一个小操作可能导致整个分区重新同步一遍,并且这个同步速度很慢;
4,基于块设备同步,一旦出错有可能导致整个分区的文件系统崩溃。
jsync正是为了解决drbd的缺点,jsync基于文件系统做同步,利用Linux内核提供的inotify机制, 侦测特定目录的变动,然后把相应的数据同步到备机,所以jsync不关心主备两台机器的分区是怎么样的,更不需要单独的一个分区。同步的数据在主备的两台机器都是随时可见的。永远只同步需要同步的数据。在文件系统之上同步数据不会有把整个文件系统搞崩溃的可能。
Jsync的特性:
1, 支持同时同步多个顶层目录;
2,递归同步所有顶层目录的子目录;
3,支持同步创建文件及目录,删除文件及目录,移动文件及目录,修改文件内容,权限改变;
4,可定制同步所使用带宽;
5, 完善的日志系统;
6, 同步校验功能;
7, 安装简单rpm -ivh jsync-***.rpm
8, 使用简单,配置/etc/jsync/jsync.cfg几个简单的参数后,service jsync start就可启动同步
jsync的实现:
简单说一下原理,纯python + shell实现.利于开源软件pyinotify做消息通知.inotifytool是另一种基于shell的可选方法,具体效果有待研究。而直接用inotify的C语言接口的话,要递归所有子目录需要做大量的工作,太麻烦。
数据同步基于rsync来做,而备机添加目录,删除文件及目录,以及文件和目录的移动都通过远程执行shell命令来实现。如何做倒rsync及远程执行命令不需要输入备机的密码? 做ssh授权. 带宽控制用rsync的选项, 日志系统基于python的logging模块。
后话:
最开始我是用C语言来做,写了几天发现要考虑的事情越来越多,代码也越来越复杂。基于‘做得别扭的时候一般都没有做对’ 的经验,果断放弃。后来采用python + shell的实现方法,一星期搞定,且自认是C语言高手,python新手,原来何在? 他山之石可以攻玉,python + shell有太多的模块或工具已现成可用。