最近写了个双机文件同步的软件,自己取名jsync

背景:


一些关键的业务经常需要做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有太多的模块或工具已现成可用。

你可能感兴趣的:(python,shell,语言,logging,文件同步,linux内核)