Rsync + Inotify双机热备
一、备份机操作
备份机:主服务器或主机文件将需要备份的文件同步到此服务器上,即从主服务器上同步过来进行备份。
1.1安装rsync
sudo apt-get install rsync
1.2修改/etc/dault/rsync文件
sudo vim /etc/default/rsync
修改如下部分:
RSYNC_ENABLE=true(默认为false)
RSYNC_CONFIG_FILE=‘/etc/rsync/rsyncd.conf’(指定rsync配置文件路径,默认为/etc/rsyncd.conf,也可以使用默认)
1.3方便管理rsync配置文件,新建文件夹rsync
sudo mkdir -p /etc/rsync/
1.4建立密码文件rsync.secrets
密码文件是双机同步时认证的关键,两机密码需要相同。
cat > /etc/rsync/rsyncd.secrets << EOF
> #/etc/rsync/rsyncd.secrets
> www-data:123456
> EOF
创建完用户名为www-data,密码为123456的文件后,需要给该文件设置权限(必须设置)
chmod 600 /etc/rsync/rsyncd.secrets
1.5拷贝文件rsyncd.conf,并自定义修改内容
cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/rsync/
usr下的rsyncd.conf是自带的模板文件,自己使用需要修改
vim /etc/rsync/rsyncd.conf
# 日志文件路径
log file=/var/log/rsyncd
# pid文件
pid file=/var/run/rsyncd.pid
# 模块名称(重要)
[www-data]
comment = public archive
# 备份文件的存储路径,需要确保存在(重要)
path = /var/www/pub
use chroot = yes
# 最大连接数10个
# max connections=10
# lock文件
lock file = /var/lock/rsyncd
# 不仅读也要写权限
read only = no
list = yes
# uid与pid非必要情况可设置问www-data
uid = root
pid = root
# 用户名称
auth users = www-data
# 指定同步校验用户时的密码文件
fake super = yes
# 密码文件
secrets file = /etc/rsync/rsyncd.secrets
strict modes = yes
# 指定主服务器ip
hosts allow = 192.168.27.130
# 是否忽略错误
ignore errors = no
# 是否忽略非可读的
ignore nonreadable = yes
# 日志转移
transfer logging = yes
# 日志输出格式
log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
# 最大响应时间
timeout = 600
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
修改完成,保存并退出
1.6启动服务
/etc/init.d/rsync restart
/etc/init.d/rsync status
正常情况下服务都会启动顺利,但是!
也可能会出现上图的错误,rsync.conf在已经配置路径的情况下依旧默认是在/etc/文件夹下,执行命令:
mv /etc/rsync/rsyncd.conf /etc/
重新启动服务成功。
二、主服务器配置
主服务器:指重要文件的原件在该服务器上。
2.1安装rsync
sudo apt-get install rsync
2.2修改/etc/dault/rsync文件
sudo vim /etc/default/rsync
修改如下部分:
RSYNC_ENABLE=true(默认为false)
2.3方便管理rsync配置文件,新建文件夹rsync
sudo mkdir -p /etc/rsync/
2.4建立密码文件rsync.secrets
密码文件是双机同步时认证的关键,两机密码需要相同(这里只需要密码就行)
cat > /etc/rsync/rsyncd.secrets << EOF
> #/etc/rsync/rsyncd.secrets
> 123456
> EOF
创建完密码为123456的文件后,需要给该文件设置权限(必须设置)
chmod 600 /etc/rsync/rsyncd.secrets
2.5验证主从服务器的连接状态
在主服务器上运行:
rsync -vzrtopg --progress www-data@192.168.27.131::www-data --password-file=/etc/rsync/rsyncd.secrets
解释一下各个参数的含义:
www-data : 在备份服务器上设置的用户名
192.168.27.31 : 备份服务器ip
www-data : 备份服务器中rsyncd.conf中模块名称
2.6测试数据备份效果
依旧在主服务器上执行:
rsync -avzPt --delete /etc/rsync/temp/ www-data@192.168.27.131::www-data --password-file=/etc/rsync/rsyncd.secrets
解释一下各个参数的含义:
/etc/rsync/temp : 需要备份文件存储路径
www-data : 在备份服务器上设置的用户名
192.168.27.31 : 备份服务器ip
www-data : 备份服务器中rsyncd.conf中模块名称
总结来说:通过rsync将/etc/rsync/temp/路径下的所有文件备份到用户名为www-data,ip地址为192.168.27.131的服务器,里面的rsyncd.conf文件夹中的www-data模块下的path(也就是/var/www/pub)指向路径里面。
如果temp后面不加 / 就会将temp文件夹整个保存到/var/www/pub下。
三、定时备份
3.1选择命令编辑方式
crontab -e
选择3,vim.tiny编辑方式
3.2输入定时命令
0 5 * * * rsync -avzPt --delete /etc/rsync/temp/ www-data@192.168.27.131::www-data --password-file=/etc/rsync/rsyncd.secrets
解释一下各个参数的含义:
0 :指分钟
5 :指小时
即在5时00分执行该备份命令。
四、即时备份
4.1安装inotify
apt-get install inotify-tools
安装完成后,inotifywait默认路径为/usr/bin/inotifywait
4.2创建脚本
cat > /etc/rsync/rsync.init.sh <<EOF
> #!/bin/bash
> /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /etc/rsync/temp/ | while read files
> do
> rsync -avzPt --delete --password-file=/etc/rsync/rsyncd.secrets /etc/rsync/temp/ www-data@192.168.27.131::www-data
> echo "{files} was rsynced" >> /temp/rsync.log 2>&1
> done
解释一下各个参数的含义:
#!/bin/bash : 脚本文件必备
/usr/bin/inotifywait : inotifywait默认路径
modify,delete,create,attrib : 修改,删除,新建,更改格式(对文件操作)
/etc/rsync/temp/ : 监听的文件路径
while read files : 文件被读取时
echo “{files} was rsynced” >> /temp/rsync.log 2>&1 : 日志信息保存
4.3修改脚本权限
chmod 755 /etc/rsync/rsync.init.sh
4.4设置脚本开机自启
编辑 /etc/rc.local文件,在 exit0 的前面一行,加入如下语句
/bin/bash /etc/rsync/rsync.init.sh > /dev/null 2>&1 &
特别申明:/etc/rc.local 文件在ubuntu18系统里,默认是没有的。!!!
这个时候就需要自己手动设置才会有的,方法如下:
1.创建软连接
ln -sf /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
添加一句命令行,将命令追加到rc-local.service中(>>是追加,>是覆盖)
cat >>/etc/systemd/system/rc-local.service<<EOF
> [Install]
> WantedBy=multi-user.target
> Alias=rc-local.service
> EOF
3.创建rc.local文件并赋权
touch /etc/rc.local && chmod 755 /etc/rc.local
4.导入必要的语句
cat >>/etc/rc.local<<EOF
> #!/bin/bash
> /bin/bash /etc/rsync/rsync.init.sh > /dev/null 2>&1 &
> exit 0
> EOF
5.重新加载服务
systemctl daemon-reload
五、备注和错误处理
5.1rsync命令说明
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"=“–partial --progress”,其中的"–progress"才 是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系 统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"–device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送 给服务端,包括它们的属性。用法见下文示例。
–size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判 断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝 dir1目录,使用该选项将拷贝dir1但不拷贝file1。
–max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如: “–max-size=1.5m”)
–min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
–exclude :指定排除规则来排除不需要传输的文件。
–delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"–delete"是在接收端 执行的,所以它是在 : exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~“做后缀。
–backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
–port :连接daemon时使用的端口号,默认为873端口。
–password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是 远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该 选项比增量传输更高效。
–existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
–ignore-existing:要求只更新目标端不存在的文件。
–remove-source-files:要求删除源端已经成功传输的文件。
虽然选项非常多,但最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输。
5.2日志格式解析
log format =
%h:远程主机名
%a:远程IP地址
%l:文件长度字符数
%p:该次rsync会话的进程id
%o:操作类型:“send"或"recv”、”del.”
%f:文件名
%P:模块路径
%m:模块名
%t:当前时间
%u:认证的用户名(匿名时是null)
%b:实际传输的字节数
%c:当发送文件时,该字段记录该文件的校验码
5.3常见错误
问题一:
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
原因:服务器端的目录不存在或无权限,创建目录并修正权限可解决问题。
问题二:
@ERROR: auth failed on module tee
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
原因:服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败,提供正确的用户名密码解决此问题。
问题三:
@ERROR: Unknown module ‘tee_nonexists’
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
原因:服务器不存在指定模块。提供正确的模块名或在服务器端修改成你要的模块以解决问题
问题四:(在client上遇到)
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.1.128::backup /home/
rsync: could not open password file “/etc/rsync.pas”: No such file or directory (2)
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:client端没有设置/etc/rsync.pass这个文件,而在使用rsync命令的时候,加了这个参数–
password-file=/etc/rsync.pass
问题五:
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.1.128::backup /home/
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:client端已经设置/etc/rsync.pas这个文件,里面也设置了密码111111,和服务器一致,但是
服务器段设置有错误,服务器端应该设置/etc/rsync.pas ,里面内容root:111111 ,这里登陆名不可缺少
问题六:
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.1.128::backup /home/
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:是因为服务器端的/home/backup 其中backup这个目录并没有设置,所以提示:chdir failed
问题七:
rsync: write failed on “/home/backup2010/wensong”: No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7]
rsync: connection unexpectedly closed (2721 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]
遇到这个问题:磁盘空间不够,所以无法操作,可以通过df /home/backup2010 来查看可用空间和已用空间