数据的价值和重要性历来都很重要。大数据时代,更是如此。而备份数据是最常用也是最有效的保护数据的方式。而我利用inotify+rsync达到了实时同步数据从而备份数据的目的!!
被备份的服务器简称备A,IP是192.168.1.1; 备份数据存放的服务器简称远B,IP是192.168.1.2 两个服务器的系统均为Centos 7.3 64bit
安装rsync 1 2 rpm -qa|grep rsync #检查是否安装过rsync,whereis rsync也可以 yum install rsync -y #如果未安装,使用yum安装rsync
备A和远B都必须安装rsync,而且版本最好一样!!Centos一般都默认自带rsync,可利用rsync –version或者rsync -h查看版本。
在备A上安装inotify 1 2 3 4 5 6 wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz tar zxvf inotify-tools-3.14.tar.gz cd inotify-tools-3.14 ./configure --prefix=/usr/local/inotify make make install
配置备A的rsync 1 2 3 4 mkdir -p /usr/local/rsync touch /usr/local/rsync/exclude.list echo 'testpassword' >/usr/local/rsync/rsync.passwd chmod 600 /usr/local/rsync/rsync.passwd
exclude.list是用来排除文件和目录,先暂时留空;rsync.passwd是密码文件,只存放密码。密码文件必须给读写权限,否则会报错
配置远B的rsync 1 2 3 4 mkdir -p /usr/local/rsync echo 'user:testpassword' >/usr/local/rsync/rsync.passwd chmod 600 /usr/local/rsync/rsync.passwd touch /usr/local/rsync/rsync.conf
rsync.passwd是用来存放用户名和密码的,user和testpassword分别是用户名和密码,testpassword必须和备A的rsync.passwd里面的密码一样!!rsync.conf是配置文件,内容设置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log port = 873 address = 192.168.1.2 secrets file=/usr/local/rsync/rsync.passwd uid = root gid = root use chroot = yes read only = no write only = no #允许访问rsyncd服务的ip,ip端或者单独ip之间使用空格隔开 hosts allow = 192.168.1.1 #不允许访问rsyncd服务的ip,*是全部(不涵盖在hosts allow中声明的ip,注意和hosts allow的先后顺序) hosts deny = * #客户端最大连接数 max connections = 5 #日志相关 # log file 指定rsync发送消息日志文件,而不是发送给syslog,如果不填这个参数默认发送给syslog # transfer logging 是否记录传输文件日志 # log format 日志文件格式,格式参数请google # syslog facility rsync发送消息给syslog时的消息级别, # timeout连接超时时间 log file = /usr/local/logs/rsync.log transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 timeout = 300 [leo] #模块根目录,必须指定 用于存放备份数据,可以任意指定,文件夹是在远B服务器上 path=/data/leo/ #是否允许列出模块里的内容 list=yes #忽略错误 ignore errors #模块验证用户名称,可使用空格或者逗号隔开多个用户名 auth users = user #注释 comment = some description about this moudle #排除目录,多个之间使用空格隔开 一般只要在备A配置排除就好 #exclude = test1/ test2/
配置还可以稍微修改并简化一点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 uid = root gid = root use chroot = no max connections = 10 strict modes = yes pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [leo] path = /data/leo/ comment = backup wwwroot ignore errors read only = no write only = no hosts allow = 192.168.1.1 hosts deny = * list = false uid = root gid = root auth users = user secrets file = /usr/local/rsync/rsync.passwd
启动远B的rsync 1 /usr/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf
为了方便,可以让远B的rsync随机启动,我们需要将启动命令加入/etc/rc.local文件
1 2 echo '/usr/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf' >> /etc/rc.local chmod +x /etc/rc.local
启动脚本如果没有执行权限,那么随机启动会失败,所以运行了chmod +x /etc/rc.local。启动后,可以通过netstat -an | grep 873 检验是否已经启动rsync
开放远B的rsync端口 1 2 3 iptables -I INPUT 3 -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT service iptables save service iptables reload
在备A创建备份脚本 假设,我们需要备份的是/data/leo文件夹,我们需要排除/data/leo/root文件夹和/data/leo/sh.sh文件 我们在/data/leo创建rsync.sh,并填充如下内容:
1 2 3 4 5 6 7 8 9 10 #!/bin/bash host=192.168.1.2 src=/data/leo/ des=leo user=user /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files do /usr/bin/rsync -vzrtopg --delete --progress --exclude-from=/usr/local/rsync/exclude.list --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des echo "${files} was rsynced" >>/data/wwwlogs/rsync.log 2>&1 done
host是远B的IP;src是备A服务器上的备份源文件夹;des是远B配置文件/usr/local/rsync/rsync.conf里面的[leo]的leo,也就是说这个模块名称由远B的配置文件决定。如果备A删除文件,而要求远B保留被删除文件,则将–delete参数去除
排除/data/leo/root文件夹和/data/leo/sh.sh
1 2 echo 'root/' >> /usr/local/rsync/exclude.list echo 'sh.sh' >>/usr/local/rsync/exclude.list
一行一个排除规则,只能用相对路径
开机启动备A的启动脚本 1 2 3 echo 'bash /data/leo/rsync.sh &' >> /etc/rc.local chmod +x /etc/rc.local chmod 744 /data/leo/rsync.sh
一些错误 1.rsync: failed to connect to X.X.X.X: No route to host 远B没有开放873端口的原因,备A无法访问远B
2.rsync failed Connection refused 111 远B的rsync没有启动,启动即可