同步备份工具之 rsync

时间:2022-02-07 11:31:53

  1.常用同步方法

    SCP、 NFS、 SFTP、 http、 samba、 rsync、 drbd(基于文件系统同步,效率高)

  2.rsync 介绍

  rsync,英文全称是 remote synchronize, 是一款实现远程同步功能的免费软件,它在同步文件的同时,可以
保持原来文件的权限、时间、软硬链接等附加信息。 rsync 是用 “rsync 算法”提供了一个客户机和远程文件服务器
的文件同步的快速方法,而且可以通过 ssh 方式来传输文件。 甚至还可以实现只同步一个文件里有变化的内容部分,
所以可以实现快速的同步备份数据。
同时, rsync 还可以实现同步本地数据、删除文件和目录的功能。一个 rsync 相当于 scp、 cp、 rm,并且还在性
能上优于它们每一个命令。

  3.rsync 特性

  能更新整个目录和树和文件系统;
  有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
  对于安装来说,无任何特殊权限要求;
  对于多个文件来说,内部流水线减少文件等待的延时;
  能用 rsh、 ssh 或直接端口做为传输入端口(rsync 本身不对数据加密);
  支持匿名 rsync 同步文件,是理想的镜像工具;

  4.rsync 在企业的工作场景

  (1)服务器之间的数据同步(cron+rsync)
  (2)把所有客户服务器数据同步到备份服务器(cron+rsync)
  (3)与 inotify 或 sersync 配合,做实时的数据同步(rsync+inotify/sersync)

  5.rsync命令行常用参数

1)参数说明
-v:--verbose 详细模式输出
-z:--compress 对备份的文件在传输的过程中进行压缩处理
-a:--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于参数:-vrztopg
-r:--recursive 对子目录以递归模式处理。
-t:--times 保持文件时间信息
-o:--owner 保持文件属主信息。
-p:--perms 保持文件权限。
-g:--group 保持文件属组信息
-D:--devices 保持设备文件信息
-l: --links 保留软链结。
-e:--rsh=command 指定使用 rsh、 ssh 方式进行数据同步
--exclude=PATTERN 指定排除不需要传输的文件模式。
--exclude-from=FILE 排除 FILE 中指定模式的文件。
--bwlimit=KBPS 限制 I/O 带宽, KBytes per second。

(2)工作中常用参数组合:-avz
(3)参数使用演示
a.使用--bwlimit参数限制传输带宽
rsync -avz --bwlimit=100 -e 'ssh' /etc/hosts root@192.168.0.100:/tmp/

  6.rsync的三种工作模式讲解及用法

SYNOPSIS
       Local:  rsync [OPTION...] SRC... [DEST]      ##本地备份
示例:
[root@localhost ~]# rsync -avz /etc/hosts /tmp/
sending incremental file list
hosts

sent 152 bytes  received 31 bytes  366.00 bytes/sec
total size is 188  speedup is 1.03
[root@localhost ~]# ll /tmp/hosts 
-rw-r--r-- 1 root root 188 Sep 21 05:44 /tmp/hosts
[root@localhost ~]# ll /etc/hosts
-rw-r--r-- 1 root root 188 Sep 21 05:44 /etc/hosts

       Access via remote shell:         ##ssh协议远程备份
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
示例:
[root@localhost ~]# rsync -avz -e 'ssh -p 22' /etc/hosts root@192.168.0.175:/tmp/
The authenticity of host '192.168.0.175 (192.168.0.175)' can't be established.
ECDSA key fingerprint is SHA256:46QEG3vm+DkznMyVjIiHxE9xGGRFtlocipE8eKGqzp0.
ECDSA key fingerprint is MD5:72:9e:44:4d:87:96:be:58:de:00:f9:77:8a:33:9f:43.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.175' (ECDSA) to the list of known hosts.
root@192.168.0.175's password: 
sending incremental file list
hosts

sent 152 bytes  received 31 bytes  19.26 bytes/sec
total size is 188  speedup is 1.03

       Access via rsync daemon:         ##以守护进程的方式进行备份
         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
               rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
               rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

rsync daemon模式的配置过程
**=====Rsync服务端:
(1).查看rsync安装包
# rpm -qa rsync

(2).添加rsync服务的用户,管理本地目录的
# useradd -s /sbin/nologin -M rsync
# id rsync

(3).生成rsync.conf配置文件
# vim /etc/rsyncd.conf 配置文件
uid = rsync     ##用户,远端命令使用rsync访问共享目录
gid = rsync     ##用户组       
use chroot = yes    ##安全
max connections = 200   ##最大连接数
pid file = /var/run/rsyncd.pid      ##pid文件路径
log file = /var/log/rsyncd.log      ##日志文件路径
timeout = 300               ##超时时间
[long]              ##模块名称
path=/backup                ##服务器提供访问的目录
ignore errors           ##忽略错误
read only = false       ##可写
list = false            ##禁止列表
hosts allow = 192.168.0.0/24    ##允许网段
hosts deny = 0.0.0.0/32     ##禁止网段
auth users = rsync_backup       ##虚拟用户
secrets file = /etc/rsync.password  ##密码文件

(4).根据rsyncd.conf的auth users配置账户,远程连接使用,并根据secrets file参数生成密码文件
echo "rsync_backup:123456" > /etc/rsync.password
cat /etc/rsync.password

(5).为密码文件设置权限
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password

(6).创建共享的目录并授权rsync服务管理
mkdir /backup
chown -R rsync.rsync /backup

(7).启动rsync服务并检查
rsync --daemon
ps -ef |grep rsync|grep -v grep
lsof -i :873

(8).加入开机启动
echo "/usr/bin/rsync --daemon" >> /etc/rc.local
tail -1 /etc/rc.local

**======rsync客户端
(1).生成连接服务器需要的密码文件
echo "123456" > /etc/rsync.password
cat /etc/rsync.password

(2).为密码文件设置权限
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password

(3).同步文件
推送:
    rsync -avz /tmp/ rsync_backup@192.168.0.175::long --password-file=/etc/rsync.password
    rsync -avz /tmp/ rsync://rsync_backup@192.168.0.175/long --password-file=/etc/rsync.password
拉取:
    rsync -avz rsync_backup@192.168.0.175::long /tmp/ --password-file=/etc/rsync.password
    rsync -avz rsync://rsync_backup@192.168.0.175/long /tmp/ --password-file=/etc/rsync.password 

  7.服务故障模拟

  (1)服务器备份目录不存在
  (2)服务器备份目录权限不足
  (3)服务器rsync服务用户被删除
  (4)鉴权模块失败--查看日志(密码文件路径错误,密码错误等等)
  (5)启动rsync服务问题(配置文件路径或文件名不正确,rsync配置文件的正确名称及路径为:/etc/rsyncd.conf)
  (6)rsync服务ip段的控制问题(拒绝和允许二选一)

  8.rsync优缺点

  优点:
  (1)增量备份,支持socket(daemon),集中备份(支持推拉,都是以客户端为参照物)
  (2)远程shell通道模式还可以加密(ssh)传输,socket(daemon)需要加密传输,可以利用vpn服务或ipsec服务
  缺点:
  (1)大量小文件同步的时候,比对时间较长,有的时候,rsync进程可能会停止
  (2)同步大文件,10G这样的大文件有时也会出现问题:中断。未完整同步前,是隐藏文件,可以通过续传等参数实现传输。一次性远程拷贝可以用scp

  9.rsync守护进程服务传输数据排错思路

  (1)查看rsync服务配置文件路径是否正确,正确的默认路径为:/etc/rsyncd.conf;
  (2)查看配置文件host allow,host deny,允许的ip网段是否为允许客户端访问的ip网段;
  (3)查看配置文件中path参数里的路径是否存在,权限是否正确(正常应为配置文件中的UID参数对应的属主和组);
  (4)查看rsync服务是否启动。查看命令为:ps -ef |grep rsync。端口是否存在:netstat -lnp |grep 873;
  (5)查看iptables防火墙和selinux是否开启允许rsync服务通过,也可以考虑关闭iptables和selinux;
  (6)查看服务端rsync设置的密码未见是否为600权限,密码文件格式是否正确,正确格式为 用户名:密码,文件路径和配置文件里的secrect files 参数对应;
  (7)如果是推送数据,要查看下,配置rsyncd.conf文件中用户是否对模块下目录有可读可写的权限。

  10.rsync多模块使用

vim /etc/rsyncd.conf配置文件    ##设置全局参数共用,独立的模块只需要配置备份路径即可
uid = rsync     
gid = rsync     
use chroot = yes    
max connections = 200   
pid file = /var/run/rsyncd.pid      
log file = /var/log/rsyncd.log      
timeout = 300
ignore errors           
read only = false       
list = false            
hosts allow = 192.168.0.0/24            
auth users = rsync_backup       
secrets file = /etc/rsync.password              
[long]              
path=/root/rsync        
[ying]              
path=/root/ying 

  11.rsync daemon服务模式排除及无差异同步

rsync排除的相关参数:
--exclude=PATTERN (排除较少文件时使用)
--exclude=FILE (排除较多文件时使用,可以将文件名写入一个文件中,再指定排除)
客户端:
排除单个文件
rsync -avz --exclude=a.txt /backup/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
排除多个目录文件
(1)排除多个不连续的文件
rsync -avz --exclude={a.txt,b.txt,c.txt} /backup/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
rsync -avz --exclude={a,b} /backup/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
(2)排除多个连续的文件
rsync -avz --exclude={a..g} /backup/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
(3)通过指定文件来排除多个连续的文件
rsync -avz --exclude-from=/tmp/rsynctest/1.log /backup/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
##1.log中需要写入排除的文件名,并且最好指定1.log的全路径是什么
(4)完全同步:无差异同步(客户端有,服务端就有;客户端没有,服务端就没有)---谨慎使用
rsync -avz --delete /backup/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password

服务端:
在服务端排除文件--通过修改配置文件rsyncd.conf;增加:exclude=a.txt b.txt

  12.案例

1)某DBA做数据同步,带宽占满,导致用户无法访问网站
rsync scp ftp 都具备限速功能
# dd if=/dev/zero of=test1 bs=1M count=128
# rsync -avz --bwlimit=100 /backup/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
默认单位为kbyte
还有断点续传的功能

(2)某视频网站,视频推到服务器上线发布,本地/backup只有当天发布的内容,服务器上却又以前的所有文件,执行命令
rsync -avz --delete /backup/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
*:服务器端删除以前的所有,只有当天的数据文件

  13.总结

rsync有三种工作模式
(1)local:rsync
(2)通道模式:rsync -avzP -e 'ssh -p 22' /etc/hosts root@192.168.0.175:/tmp
一般配合ssh key免秘钥传输,结合定时任务
(3)daemon模式
内网不需要,加密性能会有损失
外网同步建议加密使用rsync+vpn(pptp,openvpn,ipsec)

  14.备份全网服务器数据生产架构方案案例

某公司里有一台web服务器,里面的数据很重要,但是如果硬盘坏了,数据就会丢失,现在领导要求你把数据在其他机器上做一个周期性的定时备份。要求如下:
1)web服务器A和备份服务器B的备份目录必须为/backup
2)要本分的系统配置文件包括但不限于:
a.定时任务服务的配置文件(/var/spool/cron/root)
b.开启自动的配置文件(/etc/rc.local)
c.日常脚本的目录(server/scripts)
d.防火墙iptables的配置文件(/ets/sysconfig/iptables)
e.自我思考还需要备份哪些配置?
3)web服务器站点目录假定为(var/html/www)
4)web服务器A的访问日志路径假定为(/app/logs)
6)备份服务器上,保留最近7天的备份数据,同时保留6个月内每周一的所有数据副本
7)备份服务器上要按照备份数据服务器的内网ip为目录保存备份,备份的文件按照时间名字保存。
8)需要确保备份的数据尽量完整正确,在备份服务器上对备份服务器的数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中

1.环境需求配置
web服务器  192.168.0.165   主机名称:web01
rsync备份服务器  192.168.0.165   主机名称:backup

2.备份方案思路
①搭建backup服务器
a.rsync服务
②搭建web01服务器
a.验证rsync服务器是否能推送成功
b.开发脚本实现打包、备份、推送、校验、删除
c.配置定时任务每天00点定时推送
③backup服务器
a.开发脚本实现数据校验、删除、报警
b.配置定时任务每天6点定时执行
④同理搭建存储服务器nfs01

同步备份工具之 rsync

backup服务器设置:
[root@backup ]# useradd rsync -s /sbin/nologin -M
[root@backup ]# mkdir /backup
[root@backup ]# chown -R rsync.rsync /backup
[root@backup ]# vim /etc/rsyncd.conf
uid = rsync     
gid = rsync     
use chroot = no 
max connections = 200   
pid file = /var/run/rsyncd.pid      
log file = /var/log/rsyncd.log      
timeout = 300
ignore errors           
read only = false       
list = false            
hosts allow = 192.168.0.0/24            
auth users = rsync_backup       
secrets file = /etc/rsync.password              
[backup]                
path=/backup
[root@backup ]# echo "rsync_backup:123456" > /etc/rsync.password
[root@backup ]# systemctl start rsyncd
[root@backup ]# systemctl enable rsyncd
[root@backup ]# ps -ef |grep rsync
[root@web01 ]# echo "123456" >/etc/rsync.password
[root@web01 ]# rsync -avz rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
sending incremental file list
hosts

sent 148 bytes  received 27 bytes  350.00 bytes/sec
total size is 188  speedup is 1.07
[root@web01 ]# mkdir /var/html/www -p
[root@web01 ]# mkdir /app/logs -p
[root@web01 ]# mkdir /server/scripts -p
[root@web01 ]# mkdir /backup
[root@web01 ]# touch /var/html/www/{1..10}.html
[root@web01 ]# touch /app/logs/{1..10}.log
[root@web01 ]# vim /server/scripts/bak.sh
#/bin/bash
cd / &&\
IP=`ifconfig enp0s3 |awk -F "[ :]+" 'NR==2{print $3}'`
BakPath=/backup
mkdir $BakPath/$IP -p
######判断是否属于星期二,并对星期一的数据增加标记打包
if [ $(date +%w) -eq 2 ];then
date="$(date +%F -d "-1day")_week1"
else
date="$(date +%F -d "-1day")"
fi

cd / &&\
tar zcfh $BakPath/$IP/sys_config_${date}.tar.gz /var/spool/crond/ /etc/rc.local /server/scripts /etc/sysconfig/iptables && \
tar zcf $BakPath/$IP/web_data_${date}.tar.gz /var/html/www && \
tar zcf $BakPath/$IP/access_log_${date}.tar.gz /app/logs && \
find $BakPath -type f -name "*.tar.gz" |xargs md5sum > $BakPath/$IP/flag_${date}
########bak data to backupserver by long at 20171013
rsync -az $BakPath/ rsync_backup@192.168.0.175::backup/ --password-file=/etc/rsync.password
#######delete data 7 days ago.
find $BakPath -type -f -mtime +7 |xargs rm -rf 
[root@web01 ]# crontab -e
00 * * * * /bin/bash /server/scripts/bak.sh

[root@backup ]# yum install -y mailx
[root@backup ]# vim /etc/mailrc
set from=wangjinlong@163.com smtp=smtp.163.com smtp-auth-user=wangjinlong smtp-auth-password=123456 smtp-auth=login
###from:发送的邮件地址
###smtp:发生的外部smtp服务器地址
###smtp-auth-user是外部smtp服务器认证的用户名
###smtp-auth-password:外部smtp服务器认证的用户密码(授权码)
###smtp-auth:邮件认证方式
[root@backup ]# mail -s "testing" 18824948172@139.com < /etc/hosts
[root@backup ]# mkdir -p /server/scripts
[root@backup ]# vim /server/scripts/check.sh
#!/bin/bash
#######对数据进行校验
find /backup/ -name "flag_$(date +%F)"|xargs md5sum -c > /tmp/mail_$(date +%F).log
if [ $(date +%w) -eq 2 ];then
date="$(date +%F -d "-1day")_week1"
else
date="$(date +%F -d "-1day")"
fi
####对180天前的数据进行删除,并留下6个月内每星期一的数据
find /backup -type -f -name "*.tar.gz" -a ! -name "*week1*" -mtime -7 |xargs rm -rf
mail -s "backup `date`" 18824948172@139.com < /tmp/mail_$(date +%F).log
[root@backup ]# crontab -e
00 06 * * * /bin/bash /server/scripts/check.sh