rsync

1. rsync简介

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

2. rsync特性

rsync支持很多特性:

  • 可以镜像保存整个目录树和文件系统
  • 可以很容易做到保持原来文件的权限、时间、软硬链接等等、
  • 无须特殊权限即可安装
  • 快速:第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件。rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽
  • 安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接
  • 支持匿名传输,以方便进行网站镜像

3. rsync的ssh认证协议

rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:

  • ssh协议
  • rsync协议
    rsync server端不用启动rsync的daemon进程,只要获取remote host的用户名和密码就可以直接rsync同步文件
    rsync server端因为不用启动daemon进程,所以也不用配置文件/etc/rsyncd.conf
    ssh认证协议跟scp的原理是一样的,如果在同步过程中不想输入密码就用ssh-keygen -t rsa打通通道
//这种方式默认是省略了 -e ssh 的,与下面等价:
rsync -avz /SRC -e ssh root@172.16.12.129:/DEST 
    -a  //文件宿主变化,时间戳不变
    -z  //压缩数据传输
 
//当遇到要修改端口的时候,我们可以:
rsync -avz /SRC -e "ssh -p2222" root@172.16.12.129:/DEST  
//修改了ssh 协议的端口,默认是22

4. rsync命令

//Rsync的命令格式常用的有以下三种:
    rsync [OPTION]... SRC DEST
    rsync [OPTION]... SRC [USER@]HOST:DEST
    rsync [OPTION]... [USER@]HOST:SRC DEST

//对应于以上三种命令格式,rsync有三种不同的工作模式:
1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:
[root@server ~]# ls
anaconda-ks.cfg
Centos-8.repo
Centos-8.repo.1
grafana-7.3.4-1.x86_64.rpm
lpl
lpl.txt
master_db.sql
mysqldump
passwd
php-7.4.24.tar.xz
php-8.0.10.tar.xz
test
test.txt
xiongke
xiongke.tar.gz
xiongke.tar.xz
xk
xk.log
xk.sh
[root@server ~]# which rsync
/usr/bin/rsync
[root@server ~]# rsync -avz anaconda-ks.cfg root@192.168.72.135:/tmp/
root@192.168.72.135's password: 
sending incremental file list
anaconda-ks.cfg

sent 766 bytes  received 35 bytes  178.00 bytes/sec
total size is 1,185  speedup is 1.48
[root@localhost ~]# ls /tmp/
anaconda-ks.cfg
logseek
master_db.sql
mysqlbackup
mysql.sock
mysql.sock.lock
systemd-private-fb9423437e304dcb984f165944eec0cd-chronyd.service-wfjW1i
vmware-root_915-4022177651
vmware-root_938-2689078411
vmware-root_953-3979774151
vmware-root_954-2722108059
vmware-root_968-2965448017
zabbix_agentd.log
zabbix_agentd.pid

2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包 \
含单个冒号":"分隔符时启动该模式。如:
[root@server ~]# rsync -avz anaconda-ks.cfg root@192.168.72.135:/opt/xx.cfg
root@192.168.72.135's password: 
sending incremental file list
anaconda-ks.cfg

sent 766 bytes  received 35 bytes  534.00 bytes/sec
total size is 1,185  speedup is 1.48
[root@server ~]# 
[root@localhost ~]# ll /opt/
总用量 12
drwxr-xr-x. 5 mysql mysql 4096 10月 11 03:34 data
-rw-r--r--. 1 root  root  1854 10月  8 05:58 log.py
-rw-------. 1 root  root  1185 7月  11 22:40 xx.cfg
[root@localhost ~]# 

3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径 \
包含单个冒号":"分隔符时启动该模式。如:
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# rsync -avz root@192.168.72.131:/etc/yum.repos.d /root/
The authenticity of host '192.168.72.131 (192.168.72.131)' can't be established.
ECDSA key fingerprint is SHA256:sQ1P7NIMysMUQDzgnRjM4mpjSdsTa892sXKbmm1gtuQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.72.131' (ECDSA) to the list of known hosts.
root@192.168.72.131's password: 
receiving incremental file list
yum.repos.d/
yum.repos.d/CentOS-Base.repo
yum.repos.d/CentOS8-Base-163.repo
yum.repos.d/CentOS8-Base-163.repo.1
yum.repos.d/Centos-8.repo
yum.repos.d/epel-modular.repo
yum.repos.d/epel-playground.repo
yum.repos.d/epel-testing-modular.repo
yum.repos.d/epel-testing.repo
yum.repos.d/epel.repo
yum.repos.d/redhat.repo

sent 218 bytes  received 4,839 bytes  374.59 bytes/sec
total size is 15,271  speedup is 3.02
[root@localhost ~]# ls
anaconda-ks.cfg  yum.repos.d
[root@localhost ~]# 


//rsync常用选项:
-a, --archive       //归档
-v, --verbose       //啰嗦模式
-q, --quiet         //静默模式
-r, --recursive     //递归
-p, --perms         //保持原有的权限属性
-z, --compress      //在传输时压缩,节省带宽,加快传输速度
--delete            //在源服务器上做的删除操作也会在目标服务器上同步

5. rsync+inotify

rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

环境说明:

服务器类型IP地址应用操作系统
源服务器192.168.72.131rsync inotify-tools 脚本centos8
目标服务器192.168.72.135rsynccentos8

需求:

  • 把源服务器上/etc目录实时同步到目标服务器的/tmp/下
    在目标服务器上做以下操作:
//关闭防火墙与SELINUX
[root@localhost ~]# systemctl disable --now firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# ^C

//安装rsync服务端软件
[root@localhost ~]# yum -y install rsync
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
警告:加载 '/etc/yum.repos.d/CentOS-Base.repo' 失败,跳过。
上次元数据过期检查:0:20:43 前,执行于 2021年10月11日 星期一 03时45分08秒。
软件包 rsync-3.1.3-12.el8.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
[root@localhost ~]# 
[root@localhost ~]# yum -y install rsync-daemon
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
警告:加载 '/etc/yum.repos.d/CentOS-Base.repo' 失败,跳过。
上次元数据过期检查:0:29:57 前,执行于 2021年10月11日 星期一 03时45分08秒。
依赖关系解决。
=============================================
 软件包       架构   版本         仓库  大小
=============================================
安装:
 rsync-daemon noarch 3.1.3-12.el8 base  43 k

事务概要
=============================================
安装  1 软件包

总下载:43 k
安装大小:17 k
下载软件包:
rsync-daemon 141 kB/s |  43 kB     00:00    
---------------------------------------------
总计         141 kB/s |  43 kB     00:00     
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                              1/1 
  安装    : rsync-daemon-3.1.3-12.el8.   1/1 
警告:/etc/rsyncd.conf 已建立为 /etc/rsyncd.conf.rpmnew 

  运行脚本: rsync-daemon-3.1.3-12.el8.   1/1 
  验证    : rsync-daemon-3.1.3-12.el8.   1/1 
Installed products updated.

已安装:
  rsync-daemon-3.1.3-12.el8.noarch           

完毕!


//设置rsyncd.conf配置文件
[root@localhost ~]# cat /etc/rsyncd.conf 
log file = /var/log/rsyncd.log  
pidfile = /var/run/rsyncd.pid    
lock file = /var/run/rsync.lock 
secrets file = /etc/rsync.pass   

[etc_from_client]   
path = /tmp/        
comment = sync etc from client
uid = root      
gid = root    
port = 873     
ignore errors  
use chroot = no     
read only = no    
list = no    
max connections = 200  
timeout = 600 
auth users = admin      
[root@localhost ~]# 

//创建用户认证文件
[root@localhost ~]# cat /etc/rsync.pass 
admin:123456
[root@localhost ~]# 

//设置文件权限
[root@localhost ~]# chmod 600 /etc/rsync*
[root@localhost ~]# ll /etc/rsync*
-rw-------. 1 root root 390 10月 11 04:10 /etc/rsyncd.conf
-rw-------. 1 root root  13 10月 11 04:10 /etc/rsync.pass
[root@localhost ~]# 

//启动rsync服务并设置开机自启动
[root@localhost ~]# systemctl enable --now rsyncd
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.
[root@localhost ~]# ss -antl
State   Recv-Q  Send-Q   Local Address:Port                Peer Address:Port              
LISTEN  0       5              0.0.0.0:873                      0.0.0.0:*                 
LISTEN  0       128            0.0.0.0:22                       0.0.0.0:*                 
LISTEN  0       5                 [::]:873                         [::]:*                 
LISTEN  0       80                   *:3306                           *:*                 
LISTEN  0       128               [::]:22                          [::]:*                 
[root@localhost ~]# 

在源服务器上做以下操作:

/关闭防火墙与SELINUX
[root@server ~]# systemctl disable --now firewalld
[root@server ~]# setenforce 0
setenforce: SELinux is disabled
[root@server ~]# 

//安装rsync服务端软件,只需要安装,不要启动,不需要配置
[root@server ~]# yum -y install rsync
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
警告:加载 '/etc/yum.repos.d/CentOS8-Base-163.repo' 失败,跳过。
Repository base is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Repository PowerTools is listed more than once in the configuration
Repository AppStream is listed more than once in the configuration
上次元数据过期检查:0:32:44 前,执行于 2021年10月11日 星期一 03时45分39秒。
软件包 rsync-3.1.3-12.el8.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
[root@server ~]# yum -y install inotify-tools
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
警告:加载 '/etc/yum.repos.d/CentOS8-Base-163.repo' 失败,跳过。
Repository base is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Repository PowerTools is listed more than once in the configuration
Repository AppStream is listed more than once in the configuration
上次元数据过期检查:0:35:35 前,执行于 2021年10月11日 星期一 03时45分39秒。
依赖关系解决。
=============================================
 软件包        架构   版本        仓库  大小
=============================================
安装:
 inotify-tools x86_64 3.14-19.el8 epel  57 k

事务概要
=============================================
安装  1 软件包

总下载:57 k
安装大小:120 k
下载软件包:
inotify-tool 188 kB/s |  57 kB     00:00    
---------------------------------------------
总计          21 kB/s |  57 kB     00:02     
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                              1/1 
  安装    : inotify-tools-3.14-19.el8.   1/1 
  运行脚本: inotify-tools-3.14-19.el8.   1/1 
  验证    : inotify-tools-3.14-19.el8.   1/1 
Installed products updated.

已安装:
  inotify-tools-3.14-19.el8.x86_64           

完毕!
[root@server ~]# 

//创建认证密码文件
[root@server ~]# echo '123456' > /etc/rsync.pass

//设置文件权限,只设置文件所有者具有读取、写入权限即可
[root@server ~]# chmod 600 /etc/rsync.pass

//在源服务器上创建测试目录,然后在源服务器运行以下命令
[root@server ~]# mkdir -pv /root/etc/test
mkdir: 已创建目录 '/root/etc'
mkdir: 已创建目录 '/root/etc/test'
[root@server ~]# rsync -avH --port 873 --progress --delete /root/etc/ admin@192.168.72.135::etc_from_client --password-file=/etc/rsync.pass
sending incremental file list
deleting vmware-root_968-2965448017/
deleting vmware-root_954-2722108059/
deleting vmware-root_953-3979774151/
deleting vmware-root_938-2689078411/
deleting vmware-root_915-4022177651/
deleting systemd-private-fb9423437e304dcb984f165944eec0cd-chronyd.service-wfjW1i/tmp/
deleting systemd-private-fb9423437e304dcb984f165944eec0cd-chronyd.service-wfjW1i/
deleting mysqlbackup/2021-10-08_06-57-04-mysql-all.sql
deleting mysqlbackup/
deleting .font-unix/
deleting .XIM-unix/
deleting .X11-unix/
deleting .Test-unix/
deleting .ICE-unix/
deleting zabbix_agentd.pid
deleting zabbix_agentd.log
deleting mysql.sock.lock
deleting mysql.sock
deleting master_db.sql
deleting logseek
deleting anaconda-ks.cfg
./
test/

sent 75 bytes  received 597 bytes  1,344.00 bytes/sec
total size is 0  speedup is 0.00
[root@server ~]# 
//运行完成后,在目标服务器上查看,在/tmp目录下有test目录,说明数据同步成功
[root@localhost ~]# ls /tmp/
test

/写同步脚本,此步乃最最重要的一步,请慎之又慎。让脚本自动去检测我们制定的目录下 \
//文件发生的变化,然后再执行rsync的命令把它同步到我们的服务器端去
[root@server ~]# cd /scripts/
[root@server scripts]# ls
check_httpd.sh  mysql_slvae.sh
[root@server scripts]# rm -rf *
[root@server scripts]# ls
[root@server scripts]# touch inotify.sh
[root@server scripts]# chmod +x inotify.sh 
[root@server scripts]# ll
总用量 0
-rwxr-xr-x 1 root root 0 10月 11 04:27 inotify.sh
[root@server scripts]# vi inotify.sh 
[root@server scripts]# cat inotify.sh 
host=192.168.72.135
src=/etc        
des=etc_from_client   
password=/etc/rsync.pass    
user=admin         
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files;do
    rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
    echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
[root@server scripts]# 

//启动脚本
[root@server scripts]# nohup /scripts/inotify.sh &
[1] 95916
[root@server scripts]# nohup: 忽略输入并把输出追加到'nohup.out'

[root@server scripts]# ps -ef|grep inotify.sh
root       95916    1897  0 04:36 pts/0    00:00:00 /bin/sh /scripts/inotify.sh
root       95918   95916  0 04:36 pts/0    00:00:00 /bin/sh /scripts/inotify.sh
root       98168    1897  0 04:37 pts/0    00:00:00 grep --color=auto inotify.sh
[root@server scripts]# 


//在源服务器上生成一个新文件
[root@server ~]# mkdir /etc/xiongke
[root@server ~]# 

//查看inotify生成的日志
[root@server ~]# mkdir /etc/xiongke
[root@server ~]# tail /tmp/rsync.log
20211011 04:41 /etc/xiongkeCREATE,ISDIR was rsynced
[root@server ~]# 
//从日志上可以看到,我们生成了一个test文件,并且添加了内容到其里面

设置脚本开机自动启动:

[root@server ~]# chmod +x /etc/rc.d/rc.local 
[root@server ~]# vim /etc/rc.d/rc.local 
[root@server ~]# tail -3 /etc/rc.d/rc.local 
nohup /scripts/inotify.sh &
touch /var/lock/subsys/local


到目标服务器上去查看是否把新生成的文件自动传上去了:

[root@localhost ~]# ls /tmp/
etc  test

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值