Rsync数据同步工具
1.1Rsync介绍
1.1.1什么是Rsync?
Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具。Rsync软件适用于unix/linux/windows等多种操作系统平台。
1.1.2Rsync简介
- Rsync英文全称Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像,远程备份的功能,这个功能类似ssh带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,Rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
小提示:利用Rsync还可以实现删除文件和目录的功能,这又相当于rm命令!
- 一个rsync相当于scp,cp,rm,但是还优于他们每一个命令。
- 在同步备份数据时,默认情况下,Rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限,属主等属性的变化同步,但需要指定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可以实现快速的同步备份数据。
提示:传统的cp,scp工具拷贝每次均为完整的拷贝,而rsync除了可以完整拷贝外,还具备增量拷贝的功能,因此,从同步数据的性能及效率上,Rsync工具更胜一筹。
- CentOS5,rsync2.x比对方法,把所有的文件比对一遍,然后进行同步。
- CentOS6,rsync3.x比对方法,一边比对差异,一边对差异的部分进行同步。
1.1.3Rsync的特性
Rsync的特性如下:
- 支持拷贝特殊文件如链接文件,设备等。
- 可以有排除(tar?find?)指定文件或目录同步的功能,相当于打包命令tar的排除功能。
- 可以做到保持原文件或目录的权限,时间,软硬链接,属主,组等属性均不改变-p
- 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)
- 可以使用rcp,rsh,ssh等方式来配合传输文件(rsync本身不对数据加密)
- 可以通过socket(进程方式)传输文件和数据(服务端和客户端)
- 支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像
1.1.4Rsync的企业工作场景说明
1.1.4.1两台服务器之间数据同步(定时任务+备份数据)即crond+rsync
生产场景集群架构服务器备份方案项目
借助crond+rsync把所有客户服务器数据同步到备份服务器
项目经验:
全网服务器数据备份解决方案提出及负责实施
1)针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案
2)通过本地打包备份,然后rsync结合inotify应用把全网数据统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果
3)定期将IDC机房的数据备份到公司的内部服务器,防止机房地震及火灾问题导致数据丢失。
1.1.4.2实时同步(解决存储服务器等的单点问题)
利用rsync结合inotify的功能做实时的数据同步,根据存储服务器上目录的变化,把变化的数据通过inotify或sersync集合rsync命令实时同步到备份服务器,还可以通过drbd方案以及双写的方案实现双机数据同步。
1.2Rsync的工作方式
从实际的使用功能上进行划分。一般来说,Rsync大致使用三种主要的传输数据的方式。分别为:
- 单个主机本地之间的数据传输(此时类似于cp命令的功能)
- 借助rcp,ssh等通道来传输数据(此时类似于scp命令的功能)
- 以守护进程(socket)的方式传输数据(这个是rsync自身的重要功能)
以上的几种rsync的工作方式,我们可以通过man rsync帮助或查看官方的手册获得:
rsync(1) rsync(1) NAME rsync - a fast, versatile, remote (and local) file-copying tool SYNOPSIS Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 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 Usages with just one SRC arg and no DEST arg will list the source files instead of copying.
1.2.1本地数据传输模式(local-only mode)
Rsync本地传输模式的语法为:
rsync [OPTION...] SRC... [DEST]
语法说明:
1)Rsync为同步命令;
2)[OPTION]为同步时的参数选项;
3)SRC为源,即待拷的分区,文件或目录等;
4)[DEST]为目的分区,文件或目录等;
直接本地同步:相当于cp
rsync /etc/hosts /tmp/
示例1-1 实例1:把系统的hosts文件同步到/opt目录
[root@RSYNC ~]# rsync /etc/hosts /opt/ [root@RSYNC ~]# cat /opt/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
示例1-2 实例2:把opt目录拷贝到/mnt下
[root@RSYNC ~]# rsync -avz /opt/ /mnt/ #相当于cp -ap /opt /mnt sending incremental file list ./ hosts sent 161 bytes received 38 bytes 398.00 bytes/sec total size is 158 speedup is 0.79 [root@RSYNC ~]# ll /mnt/ total 4 -rw-r--r-- 1 root root 158 Sep 12 14:19 hosts
删除功能,相当于rm命令
[root@RSYNC ~]# ls /tmp/ test.txt vmware-root_667-3980363901 [root@RSYNC ~]# mkdir /old [root@RSYNC ~]# rsync -avz --delete /old/ /tmp/ sending incremental file list deleting vmware-root_667-3980363901/ deleting .font-unix/ deleting .XIM-unix/ deleting .X11-unix/ deleting .Test-unix/ deleting .ICE-unix/ deleting test.txt ./ sent 43 bytes received 134 bytes 354.00 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC ~]# ll /tmp/ total 0 [root@RSYNC ~]# ls /tmp/
1.2.2 rsync 命令常用参数选项说明:
-v,--verbose 详细模式输出,传输时的进度等信息。
-z,--compress 传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩。
-a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgD1(字母1)
-r,--recursive | 对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r |
-t,--times | 保持文件时间信息 |
-o,--owner | 保持文件属主信息 |
-p,--perms | 保持文件权限 |
-g,--group | 保持文件属组信息 |
-P,--progress | 显示同步的过程及传输时的进度等信息 |
-D, --devices | 保持设备文件信息 |
-l,--links | 保留软链接 |
-e,--rsh=COMMAND | 使用的信道协议(remote shell),指定替代rsh的shell程序。例如:ssh --exclude=PATTERN指定排除不需要传输的文件模式(和tar参数一样) |
--bwlimit=RATE | limit socket I/O bandwidth |
--delete | 让源目录SRC和目标目录数据DST一致 |
1.2.3 案例:某DBA做数据同步,带宽沾满,导致用户无法访问网站。
[root@RSYNC ~]# rsync -avz dbfile 10.0.0.46:/backup #没有给带宽做限制 [root@RSYNC ~]# rsync -avz --bwlimit=100 dbfile 172.16.1.48:/backup #限定了带宽
1.2.4 保持同步目录及文件属性
这里的-avzP相当于-vzrtopgDIP(还多了DI功能),生产环境常用的参数选项为-avzP或-vzrtopgP如果是放入脚本中,也可以把-v和-P去掉。这里的--progress可以用-P代替。
生产参数:-avz或者用-vzrtopg
1.2.5 使用rsync在本地备份传输数据
实例1:测试本地rsync同步,rsync -avz /opt /tmp
[root@RSYNC ~]# cd /opt/ #进入目录 [root@RSYNC opt]# ls hosts [root@RSYNC opt]# mkdir rsynctest #创建目录 [root@RSYNC opt]# touch rsynctest/test.txt #创建文件 [root@RSYNC opt]# chmod -R 700 rsynctest #递归授权700 [root@RSYNC opt]# ls -l #查看目录权限700 total 4 -rw-r--r-- 1 root root 158 Sep 12 14:19 hosts drwx------ 2 root root 22 Sep 12 15:05 rsynctest [root@RSYNC opt]# ls -l rsynctest/ #查看文件权限700 total 0 -rwx------ 1 root root 0 Sep 12 15:05 test.txt [root@RSYNC opt]# rsync -avz /opt/ /tmp/ #通过rsync执行本地同步操作 sending incremental file list ./ hosts rsynctest/ rsynctest/test.txt sent 272 bytes received 65 bytes 674.00 bytes/sec total size is 158 speedup is 0.47 [root@RSYNC opt]# tree /tmp/ #目录文件完全同步过去了 /tmp/ ├── hosts └── rsynctest └── test.txt 1 directory, 2 files [root@RSYNC opt]# ll /tmp/ #文件夹权限700,保持一致 total 4 -rw-r--r-- 1 root root 158 Sep 12 14:19 hosts drwx------ 2 root root 22 Sep 12 15:05 rsynctest [root@RSYNC opt]# ll /tmp/rsynctest/ #文件权限700保持一致 total 0 -rwx------ 1 root root 0 Sep 12 15:05 test.txt
上例演示了将本地/opt目录下的文件(不包含opt本身)同步到/tmp下其中-avz就是保持目录或文件的相关属性的参数
特别提示:请注意一下两条命令的差别:
1)rsync -avz /opt/ /tmp/
2)rsync -avz /opt /tmp/
1)中/opt/的意思是,仅把/opt/目录里面的内容同步过来,opt目录本身并不同步;而后者2)中/opt表示把opt本身及其内部内容全都同步到/tmp下,仅一个/(斜线之差),意义大不相同;2)在通过远程shell进行数据传输的内容也会有类似的问题。
当本地的不同目录之间需要数据传输,特别是经常需要增量传输时,这个案例命令可以替代cp等命令,为你提升拷贝的效率。
实例2:将/etc下全部内容(包括/etc目录本身)备份到/tmp目录下
[root@RSYNC ~]# rsync -avz /etc /tmp/ sending incremental file list etc/ etc/.pwd.lock etc/.updated etc/DIR_COLORS etc/DIR_COLORS.256color etc/DIR_COLORS.lightbgcolor etc/GREP_COLORS etc/adjtime etc/aliases etc/aliases.db etc/anacrontab etc/asound.conf etc/bashrc etc/centos-release etc/centos-release-upstream etc/cron.deny etc/crontab etc/crypttab 下面的输出内容省略... [root@RSYNC ~]# ll /tmp/ #同步完成 total 16 drwxr-xr-x 78 root root 8192 Sep 12 14:08 etc
第一次运行命令会由于需要扫描并同步所有文件及目录,因此时间会长一些。如果再次备份就会进行快速对比,忽略通过的文件,速度更快,如下文:
[root@RSYNC ~]# rsync -avz /etc /tmp/ sending incremental file list sent 46,835 bytes received 634 bytes 94,938.00 bytes/sec total size is 27,633,673 speedup is 582.14
我们可以看到立刻就同步完成,要传输的数据也少了。因为rsync会比对所有文件和目录,仅同步有变化(内容,修改时间等各种属性)的文件或目录。如果换做cp命令,那么还会重新执行完整的拷贝,浪费系统资源和时间。当然本地备份同步不仅仅备份目录,还可以同步单个文件,设备等。
特别提示:
在传输数据时,rsync命令也需要有对同步目录拥有权限如此才可以实现正常传输数据。
1.3借助ssh通道在不同主机之间传输数据
示例1:推送:将当前主机内容推送到远程主机
[root@RSYNC ~]# rsync -avzP -e 'ssh -p 22' /etc/ root@192.168.200.70:/tmp/
[root@RSYNC ~]# rsync -avzP -e 'ssh -p 22' /etc/ root@192.168.200.70:/tmp/ #开始同步 root@192.168.200.70's password: sending incremental file list ./ .pwd.lock 0 100% 0.00kB/s 0:00:00 (xfr#1, ir-chk=1180/1182) .updated 163 100% 0.00kB/s 0:00:00 (xfr#2, ir-chk=1179/1182) DIR_COLORS 5,090 100% 4.85MB/s 0:00:00 (xfr#3, ir-chk=1178/1182) DIR_COLORS.256color 5,725 100% 5.46MB/s 0:00:00 (xfr#4, ir-chk=1177/1182) DIR_COLORS.lightbgcolor 4,669 100% 4.45MB/s 0:00:00 (xfr#5, ir-chk=1176/1182) GREP_COLORS 94 100% 91.80kB/s 0:00:00 (xfr#6, ir-chk=1175/1182) adjtime 16 100% 15.62kB/s 0:00:00 (xfr#7, ir-chk=1174/1182)
以下内容省略...
#命令说明
-e 'ssh -p 22'表示以ssh的方式通过22端口推送,如果不写默认22端口
[root@RSYNC ~]# ssh root@192.168.200.70 "ls -l /tmp" #查看同步结果
root@192.168.200.70's password:
total 1056
-rw-r--r-- 1 root root 16 Feb 7 2020 adjtime
-rw-r--r-- 1 root root 1518 Jun 7 2013 aliases
-rw-r--r-- 1 root root 12288 Feb 7 2020 aliases.db
drwxr-xr-x 2 root root 236 Feb 7 2020 alternatives
-rw------- 1 root root 541 Aug 9 2019 anacrontab
-rw-r--r-- 1 root root 55 Aug 8 2019 asound.conf
drwxr-x--- 3 root root 43 Feb 7 2020 audisp
drwxr-x--- 3 root root 83 Feb 7 2020 audit
drwxr-xr-x 2 root root 22 Feb 7 2020 bash_completion.d
-rw-r--r-- 1 root root 2853 Oct 31 2018 bashrc
drwxr-xr-x 2 root root 6 Aug 8 2019 binfmt.d
-rw-r--r-- 1 root root 37 Sep 5 2019 centos-release
-rw-r--r-- 1 root root 51 Sep 5 2019 centos-release-upstream
drwxr-xr-x 2 root root 6 Aug 4 2017 chkconfig.d
drwxr-xr-x 2 root root 21 Feb 7 2020 cron.d
以下省略若干内容...
#命令说明:
ssh root@192.168.200.70的意思是,以ssh的方式进行连接,通过root账户来登录192.168.200.70的这台主机。
也可以ssh root@RSYNC01,意思是,以ssh的方式进行连接,通过root账户来登录主机名为RSYNC01的这台主机。
ssh root@RSYNC01 + 命令,可以将命令的结果反馈回来。
RSYNC01是当前主机下的一个hosts映射,/etc/hosts里面添加:IP地址 主机名 即作为映射对应。当输入主机名时,系统自动通过hosts解析出对应IP地址。例如 ssh root@RSYNC01 <==> ssh root@192.168.200.70
示例2:将远程主机内容拉取到当前主机
[root@RSYNC ~]# rsync -avzP -e 'ssh -p 22' root@RSYNC01:/opt /tmp/
关键语法说明:
1)-avz相当于-vzrtopgDI,表示同步时文件和目录属性不变。
2)-P显示同步的过程,可以用--progress替换。
3)-e 'ssh -p 22' 表示通过ssh通道传输数据,可省略。
4)root@RSYNC01:/opt 远程主机系统用户,地址,路径
5)/tmp 本地路径
实践演示:通过root用户从192.168.200.70的/opt目录(包含目录本身)把数据拉到本地的/tmp目录下
[root@RSYNC ~]# rsync -avzP -e 'ssh -p 22' root@RSYNC01:/opt /tmp/ root@rsync01's password: receiving incremental file list opt/ opt/rsync01.test.txt 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/2) sent 47 bytes received 126 bytes 49.43 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC ~]# ll /tmp/ total 16 drwxr-xr-x 78 root root 8192 Sep 12 14:08 etc -rw-r--r-- 1 root root 158 Sep 12 14:19 hosts drwxr-xr-x 2 root root 30 Sep 12 17:07 opt
也可以去掉-e 'ssh -p 22' (默认22端口)
[root@RSYNC ~]# rsync -avzP root@RSYNC01:/opt /tmp/ root@rsync01's password: receiving incremental file list sent 25 bytes received 87 bytes 32.00 bytes/sec total size is 0 speedup is 0.00
也可以通过映射好的主机名:(/etc/hosts)
[root@RSYNC ~]# tail -1 /etc/hosts 192.168.200.70 RSYNC01 [root@RSYNC ~]# rsync -avzP root@RSYNC01:/opt /tmp/ root@rsync01's password: receiving incremental file list sent 25 bytes received 87 bytes 32.00 bytes/sec total size is 0 speedup is 0.00
1.4 以守护进程(socket)的方式传输数据
1.4.1 部署前的准备工作:
1.4.2 部署环境
操作系统:
[root@RSYNC ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core)
内核版本:
[root@RSYNC ~]# uname -r 3.10.0-1062.el7.x86_64
主机网络参数设置:
主机名 | 网卡ens32 | 用途 | 代号 |
RSYNC | 192.168.200.51 | rsync客户端 | B-Server |
RSYNC01 | 192.168.200.70 | rsync服务端 | A-Server |
无特殊说明,子网掩码均为255.255.255.0
1.4.3具体要求
要求在A-Server上以rsync守护进程的方式部署rsync服务,使得所有rsync节点客户端主机,可以把本地数据通过rsync方式备份到数据备份服务器A-Server上。本例的客户端仅以B-Server,C-Server为例。
1.5 开始部署rsync服务--Rsync服务器端A-Server操作过程:
1.5.1 配置rsync.conf
首先确认软件是否安装:
[root@RSYNC ~]# rpm -qa rsync rsync-3.1.2-11.el7_9.x86_64
修改rsyncd.conf文件,添加如下内容:
[root@RSYNC01 ~]# cat /etc/rsyncd.conf # /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: # 用户 uid = rsync # 组 gid = rsync # 程序安全设置 use chroot = no # 客户端连接数 max connections = 200 # 进程号文件位置 pid file = /var/run/rsyncd.pid # 进程锁 lock file = /var/run/rsync.lock # 日志文件位置 log file = /var/log/rsyncd.log # exclude = lost+found/ # transfer logging = yes # 超时时间 timeout = 300 # ignore nonreadable = yes # dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 [backup] # 使用目录 path = /backup/ # 有错误时忽略 ignore errors # 可读可写(true或false) read only = false # 阻止远程列表(不让通过远程方式看服务端有啥) list = false # 允许IP hosts allow = 192.168.200.0/24 # 禁止IP hosts deny = 0.0.0.0/32 # 虚拟用户 auth users = rsync_backup # 存放用户和密码的文件 secrets file = /etc/rsync.password # [ftp] # path = /home/ftp # comment = ftp export area
1.5.2 创建共享目录及添加rsync程序用户
[root@RSYNC01 ~]# useradd -M -s /sbin/nologin rsync #创建rsync用户 [root@RSYNC01 ~]# cat /etc/passwd | grep rsync rsync:x:1000:1000::/home/rsync:/sbin/nologin [root@RSYNC01 ~]# cat /etc/group | grep rsync rsync:x:1000: [root@RSYNC01 ~]# mkdir /backup #创建共享目录
1.5.3 启动服务:rsync --daemon
[root@RSYNC01 ~]# rsync --daemon [root@RSYNC01 ~]# netstat -antup | grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 12409/rsync tcp6 0 0 :::873 :::* LISTEN 12409/rsync
1.5.4 将A-Server上的/backup文件夹更改属主rsync
[root@RSYNC01 ~]# chown -R rsync /backup/ [root@RSYNC01 ~]# ls -ld /backup/ drwxr-xr-x 2 rsync root 6 Sep 12 21:07 /backup/
1.5.5 创建rsync虚拟账户名和密码
[root@RSYNC01 ~]# echo "rsync_backup:123456" > /etc/rsync.password [root@RSYNC01 ~]# cat /etc/rsync.password rsync_backup:123456
1.5.6 将账户密码文件的权限设置为600(必须否则失败)
[root@RSYNC01 ~]# chmod 600 /etc/rsync.password [root@RSYNC01 ~]# ll /etc/rsync.password -rw------- 1 root root 20 Sep 12 21:20 /etc/rsync.password
1.5.7 加入开机启动
[root@RSYNC01 ~]# echo "rsync --daemon" >> /etc/rc.local [root@RSYNC01 ~]# tail -1 /etc/rc.local rsync --daemon
如何重启rsync服务?
pkill rsync #关闭rsync服务
rsync --daemon #启动rsync服务
1.5.8 另一种方式的启动
因之前使用rsync --daemon启动过,所以
#注释掉/etc/rsyncd.conf配置文件中:
#pid file = /var/run/rsyncd.pid [root@RSYNC01 ~]# systemctl start rsyncd [root@RSYNC01 ~]# systemctl enable rsyncd Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service. [root@RSYNC01 ~]# systemctl status rsyncd ● rsyncd.service - fast remote file copy program daemon Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-09-12 21:28:09 CST; 40min ago Main PID: 12481 (rsync) CGroup: /system.slice/rsyncd.service └─12481 /usr/bin/rsync --daemon --no-detach Sep 12 21:28:09 RSYNC01 systemd[1]: Started fast remote file copy program daemon. [root@RSYNC01 ~]# netstat -antup | grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 12481/rsync tcp6 0 0 :::873 :::* LISTEN 12481/rsync
至此rsync服务端A-Server配置完毕
1.6 开始部署rsync服务--Rsync客户端B-Server
1.6.1 只需要创建密码文件
[root@RSYNC ~]# rpm -qa rsync rsync-3.1.2-11.el7_9.x86_64 [root@RSYNC ~]# echo "123456" > /etc/rsync.password
1.6.2 将密码文件的权限设置为600(必须否则失败)
[root@RSYNC ~]# chmod 600 /etc/rsync.password [root@RSYNC ~]# ls -ld /etc/rsync.password -rw------- 1 root root 7 Sep 12 22:15 /etc/rsync.password
至此rsync客户端B-Server配置完毕。
1.6.3 Rsync同步测试
1.6.3.1 推送测试1:将客户端指定目录内容推送到服务器端rsync指定目录下。
测试命令:
[root@RSYNC ~]# rsync -avz /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password sending incremental file list ./ RSYNC.test.txt rsync: chgrp ".RSYNC.test.txt.4ZJw2o" (in backup) failed: Operation not permitted (1) sent 114 bytes received 136 bytes 500.00 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2] #报错,这是由于A-Server配置文件中没有加fake super = yes,以前的版本里面不需要,现在版本需要,配置文件添加后重启服务,再次测试 [root@RSYNC ~]# rsync -avz /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password sending incremental file list ./ RSYNC.test.txt sent 114 bytes received 46 bytes 320.00 bytes/sec total size is 0 speedup is 0.00
#命令说明:
-avz:保持稳健各项属性不变,-v显示同步信息 -P显示具体同步过程
/backup/:要推送的内容所在目录
rsync_backup:服务器端rsync服务的同步的用户名(非Linux用户)
192.168.200.70:rsync服务器IP地址
backup:rsync服务器配置文件里的模块名
--password-file=/etc/rsync.password:免密码的操作,指定密码文件位置,如果不写,则会要求用户交互式输入密码。(如果想挂定时任务,必须得非交互式)
演示:
[root@RSYNC backup]# ls opt.tar.gz [root@RSYNC backup]# rsync -avzP /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password #同步测试 sending incremental file list ./ opt.tar.gz 1,480 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/2) sent 1,196 bytes received 46 bytes 2,484.00 bytes/sec total size is 1,480 speedup is 1.19 [root@RSYNC backup]# ssh root@RSYNC01 "ls -l /backup" #查看同步结果 root@rsync01's password: total 4 -rw-r--r-- 1 rsync rsync 1480 Sep 12 22:47 opt.tar.gz -rw-r--r-- 1 rsync rsync 0 Sep 12 22:25 RSYNC.test.txt
1.6.3.2 推送测试2:将客户端任意目录推送到rsync服务器端指定目录下
测试命令:
[root@RSYNC backup]# rsync -avzP /tmp/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password
演示过程:
[root@RSYNC backup]# rsync -avzP /tmp/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password sending incremental file list ./ hosts 158 100% 0.00kB/s 0:00:00 (xfr#1, ir-chk=1004/1006) etc/ etc/.pwd.lock 0 100% 0.00kB/s 0:00:00 (xfr#2, ir-chk=1180/1186) etc/.updated 163 100% 0.42kB/s 0:00:00 (xfr#3, ir-chk=1179/1186) etc/DIR_COLORS 5,090 100% 13.22kB/s 0:00:00 (xfr#4, ir-chk=1178/1186) etc/DIR_COLORS.256color 5,725 100% 14.87kB/s 0:00:00 (xfr#5, ir-chk=1177/1186) etc/DIR_COLORS.lightbgcolor 4,669 100% 12.09kB/s 0:00:00 (xfr#6, ir-chk=1176/1186) etc/GREP_COLORS 94 100% 0.24kB/s 0:00:00 (xfr#7, ir-chk=1175/1186) etc/adjtime #以下内容省略... [root@RSYNC backup]# ssh root@RSYNC01 "ls /backup" #看一眼结果 root@rsync01's password: etc hosts opt opt.tar.gz rsynctest RSYNC.test.txt
1.6.3.3 拉取测试1:将rsync服务器端指定目录全部内容同步到客户端
测试命令:
[root@RSYNC backup]# rsync -avzP rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password 命令说明: 和推送相比,只是两个目录换了个位置。
演示过程:
[root@RSYNC backup]# ls [root@RSYNC backup]# rsync -avzP rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password receiving incremental file list ./ RSYNC.test.txt 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6) hosts 158 100% 154.30kB/s 0:00:00 (xfr#2, to-chk=3/6) opt.tar.gz 1,480 100% 1.41MB/s 0:00:00 (xfr#3, to-chk=2/6) rsynctest/ rsynctest/test.txt 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=0/6) sent 115 bytes received 1,498 bytes 3,226.00 bytes/sec total size is 1,638 speedup is 1.02 [root@RSYNC backup]# ls hosts opt.tar.gz rsynctest RSYNC.test.txt
1.6.3.4 拉取测试2:将rsync服务器端指定目录下的指定内容同步到客户端
测试命令:
[root@RSYNC backup]# rsync -avzP rsync_backup@192.168.200.70::backup/opt.tar.gz /backup/ --password-file=/etc/rsync.password
演示过程:
[root@RSYNC backup]# ls [root@RSYNC backup]# rsync -avzP rsync_backup@192.168.200.70::backup/opt.tar.gz /backup/ --password-file=/etc/rsync.password receiving incremental file list opt.tar.gz 1,480 100% 1.41MB/s 0:00:00 (xfr#1, to-chk=0/1) sent 43 bytes received 1,585 bytes 3,256.00 bytes/sec total size is 1,480 speedup is 0.91 [root@RSYNC backup]# ls opt.tar.gz
1.6.3.5 拉取测试3:将rsync服务器端指定目录下的全部内容排除某目录或文件后,同步到客户端
环境准备
我们在rsync服务器端指定目录下创建如下文件结构
[root@RSYNC01 backup]# ls a b c d e test [root@RSYNC01 backup]# ls test/ 1 2 3 4 5 说明: a,b,c,d,e为文件,test是目录。目录下有1,2,3,4,5文件
方法一:通过命令行实现排除
测试命令:
[root@RSYNC backup]# rsync -avz --exclude=a --exclude=test/3 --exclude=test/4 rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password 命令说明: --exclude=文件名:排除的文件
演示过程:
[root@RSYNC backup]# rsync -avz --exclude=a --exclude=test/3 --exclude=test/4 rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password receiving incremental file list ./ b c d e test/ test/1 test/2 test/5 sent 203 bytes received 444 bytes 1,294.00 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC backup]# ls b c d e test [root@RSYNC backup]# ls test/ 1 2 5
方法二:通过列表文件实现排除
创建排除列表文件
[root@RSYNC backup]# cat /root/exclude.txt 1 3 5 b e
测试命令:
[root@RSYNC backup]# rsync -avz --exclude-from=/root/exclude.txt rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password 命令说明: --exclude-from=文件的绝对路径:引用一个排除列表,列表里只需要输入排除的文件名即可
[root@RSYNC backup]# cat /root/exclude.txt 1 3 5 b e [root@RSYNC backup]# rsync -avz --exclude-from=/root/exclude.txt rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password receiving incremental file list ./ a c d test/ test/2 test/4 sent 173 bytes received 355 bytes 1,056.00 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC backup]# ls a c d test [root@RSYNC backup]# ls test/ 2 4
1.6.3.6 rsync同步拉取测试:rsync客户端指定目录内容始终和rsync服务器共享目录内容保持一致
1)和rsync服务器目录内容始终保持一致
始终保持一致的意思是说,当Rsync服务器共享目录增加文件,那么客户端指定目录也增加,服务器端共享目录删除文件,那么客户端指定目录也删除文件
测试命令:
[root@RSYNC backup]# rsync -avz --delete rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password 命令说明: --delete:表示同步增,删,改(文件内容出现变化,也会同步的)
演示过程:
[root@RSYNC backup]# rsync -avz --delete rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password #进行第一次同步 receiving incremental file list ./ a b c d e test/ test/1 test/2 test/3 test/4 test/5 sent 229 bytes received 602 bytes 1,662.00 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC backup]# ls #查看同步后的文件 a b c d e test [root@RSYNC backup]# ssh root@RSYNC01 "rm -rf /backup/a" #远程删除Rsync服务器共享目录下的文件a root@rsync01's password: [root@RSYNC backup]# rsync -avz --delete rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password #进行第二次同步 receiving incremental file list deleting a #可以看到同步过程中进行了一次delete同步 ./ sent 28 bytes received 212 bytes 480.00 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC backup]# ls #查看同步结果,文件a消失了。 b c d e test [root@RSYNC backup]# ssh root@RSYNC01 "echo 1111 > /backup/test2" #远程在rsync服务器端共享目录下创建一个有内容的文件test2 root@rsync01's password: [root@RSYNC backup]# rsync -avz --delete rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password #进行第三次同步 receiving incremental file list ./ test2 #新增了test2文件 sent 51 bytes received 282 bytes 666.00 bytes/sec total size is 5 speedup is 0.02 [root@RSYNC backup]# cat test2 #查看同步后的文件内容 1111 [root@RSYNC backup]# ssh root@RSYNC01 "echo 2222 >> /backup/test2" #远程对rsync服务器端共享目录下的test2文件增加一行内容。 root@rsync01's password: [root@RSYNC backup]# rsync -avz --delete rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password #进行第四次同步 receiving incremental file list test2 #修改后的文件也被同步了 sent 54 bytes received 278 bytes 664.00 bytes/sec total size is 10 speedup is 0.03 [root@RSYNC backup]# cat test2 #查看同步后文件内容 1111 2222
2)排除某文件后,再和服务器进行同步
测试命令:
[root@RSYNC backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password 命令说明: --exclude=c:同步时不考虑文件名为c的文件
演示过程:
[root@RSYNC backup]# ls #查看目录下内容 b c d e test test2 [root@RSYNC backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password #第一次同步 receiving incremental file list sent 32 bytes received 213 bytes 490.00 bytes/sec total size is 10 speedup is 0.04 [root@RSYNC backup]# ssh root@RSYNC01 "rm -rf /backup/c" #远程删除服务器端c文件 root@rsync01's password: [root@RSYNC backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password #第二次同步 receiving incremental file list ./ #没有同步到任何东西 sent 35 bytes received 220 bytes 510.00 bytes/sec total size is 10 speedup is 0.04 [root@RSYNC backup]# ssh root@RSYNC01 "touch /backup/c" #远程创建c文件 root@rsync01's password: [root@RSYNC backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password #第三次同步 receiving incremental file list ./ #还是没有同步到任何东西 sent 35 bytes received 220 bytes 510.00 bytes/sec total size is 10 speedup is 0.04 [root@RSYNC backup]# ssh root@RSYNC01 "echo 111 >> /backup/c" #远程修改c文件 root@rsync01's password: [root@RSYNC backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password #第四次同步 receiving incremental file list #仍旧没有同步到任何东西 sent 32 bytes received 213 bytes 490.00 bytes/sec total size is 10 speedup is 0.04
1.6.3.7 rsync同步推送测试:让Rsync服务器端共享目录始终和rsync客户端指定目录内容一致。
1)和rsync客户端目录内容始终保持一致
始终保持一致的意思是说,当Rsync客户端指定目录增加文件,那么服务器端共享目录也增加,客户端指定目录删除文件,那么服务器端共享目录也删除文件
测试命令:
[root@RSYNC backup]# rsync -avz --delete /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password 命令说明: --delete:表示同步增,删,改(文件内容出现变化,也会同步的) 与同步拉取相比:只是客户端目录放在了服务器端的前边。
演示过程:
[root@RSYNC backup]# ls a b c d e test [root@RSYNC backup]# rsync -avz --delete /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password #第一次同步 sending incremental file list deleting test2 ./ a c sent 297 bytes received 81 bytes 252.00 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC backup]# rm a #客户端删除文件a rm: remove regular empty file ‘a’? y [root@RSYNC backup]# rsync -avz --delete /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password #第二次同步 sending incremental file list deleting a #同步了删除文件a的过程 ./ sent 211 bytes received 33 bytes 488.00 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC backup]# touch a #创建文件a [root@RSYNC backup]# rsync -avz --delete /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password #第三次同步 sending incremental file list ./ a #推送了a文件到服务器 sent 263 bytes received 47 bytes 620.00 bytes/sec total size is 0 speedup is 0.00 [root@RSYNC backup]# echo 1111 >> a #修改文件a [root@RSYNC backup]# cat a 1111 [root@RSYNC backup]# rsync -avz --delete /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password #第四次同步 sending incremental file list a #同步了修改后的文件a到服务器端 sent 269 bytes received 44 bytes 626.00 bytes/sec total size is 5 speedup is 0.02 [root@RSYNC backup]# ssh root@RSYNC01 "cat /backup/a" #远程查看一下服务器端共享目录下的文件a的内容 root@rsync01's password: 1111
2)--exclude=文件名。排除某文件后,再和服务器进行同步
和同步拉取排除完全一致,只是目录换个位置,在此不在多费篇幅。
1.6.4 Rsync企业应用之风险提示
特别说明:
执行--delete参数从rsync服务器端往rsync客户端拉取数据时,一定要小心,最好不用,它比从rsync客户端带--delete参数往rsync服务端推送危险的多。客户端带--delete参数往服务端推送仅删除服务端模块下的数据,而前者有能力删除rsync客户端本地的所有数据包括跟下的所有目录。
rsync推送企业工作场景:
1)备份 --delete 风险
本地有啥,远端就有啥,本地没有的远端有也要删除。服务器端的目录数据可能丢失。
rsync拉取企业工作场景:
1)代码发布,下载。 --delete风险
远端有啥,本地(客户端)就有啥,远端没有的本地有也要删除。本地的目录数据可能丢失。
1.6.5 rsync无差异同步的生产场景应用
一般是有需要两台服务器之间,必须要求数据一致,且时时性又不是很高的情况下,如两台负载均衡下面web服务器之间的同步,或者高可用双机配置之间的同步等,rsync无差异同步非常的危险,而且,有很多的替代方案,因此,生产场景没有特殊的需求,应避免使用。切记,有很多朋友都已经有了血的教训。
1.7 Rsync 优缺点
1.7.1 rsync优点:
1,增量备份,支持socket(daemon),集中备份(支持推拉,都是以客户端为参照物)。
2,远程SHELL通道模式还可以加密(SSH)传输,socket(daemon)需要加密传输,可以利用vpn服务或ipsec服务
1.7.2 rsync缺点:
1,大量小文件同步的时候,比对时间较长,有的时候,同步过程中,rsync进程可能会停止,僵死了。
2,同步大文件,10G这样的大文件有时也会出问题,中断。未完整同步前,是隐藏文件,可以通过续传(--partial)等参数实现传输
3,一次性远程拷贝可以用scp,大量小文件要打成一个包再拷贝。(重要)
1.8 排错必备思想
- 部署流程步骤熟练
- rsync原理理解
- 学会看日志,rsync命令行输出,日志文件/var/log/rsyncd.log
1.9 Rsync守护进程服务传输数据排错思路:
1.9.1 Rsync服务端排错思路
1.查看rsync服务配置文件路径是否正确,正确的默认路径为:/etc/rsyncd.conf
2.查看配置文件里host allow,host deny,允许的IP网段是否是允许客户端访问的ip网段
3.查看配置文件中path参数里的路径是否存在,权限是否正确(正常应为配置文件中的UID参数对应的属主和组)
4.查看rsync服务是否启动。查看命令为:ps -ef | grep rsync 。端口是否存在netstat -antup | grep 873
5.查看iptables防火墙和selinux是否开启允许rsync服务通过,也可以考虑关闭。
6.查看服务端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,正确格式为:用户名:密码,文件路径和配置文件里的secrect files参数对应。
7.如果是推送数据,要查看下,配置rsyncd.conf文件中用户是否对模块下目录有可读写的权限。
1.9.2 Rsync客户端排错思路
1.查看客户端rsync配置的密码文件是否600的权限,密码文件格式是否正确,注意:仅需要有密码,并且和服务器端的密码保持一致。
2.用telnet连接rsync服务器ip地址873端口,查看服务是否启动(可测试服务端防火墙是否阻挡) telnet 192.168.200.70 873
3.客户端执行命令时:rsync -avzP rsync_backup@192.168.200.70::backup /backup/ --password-file=/etc/rsync.password
4.此命令的细节要记清楚,尤其192.168.200.70:backup 处的双冒号及其后的backup为模块名称
附录1: rsyncd.cong配置文件常用参数说明:
rsyncd.conf参数 | 参数说明 |
uid=rsync | rsync使用用户 |
gid=rsync | rsync使用的用户组(用户所在的组) |
use chroot=no | 如果为true,daemon会在客户端传输文件前“chroot to the path”。这是一种安全配置,因为我们大多数都在内网,所有不配也没关系 |
max connections=200 | 设置最大连接数,默认0,意思无限制,负值为关闭这个模块 |
timeout=400 | 默认为0,表示no timeout,建议300-600(5-10分钟) |
pid file | rsync daemon启动后将其进程pid写入此文件。如果这个文件存在,rsync不会覆盖该文件,而是会终止 |
lock file | 指定lock文件用来支持“max connections”参数,使得总连接数不会超过限制 |
log file | 不设或者设置错误,rsync会使用rsyslog输出相关日志信息 |
ignore errors | 忽略I/O错误 |
read only=false | 指定客户端是否可以上传文件,默认对所有模块为true |
list=false | 是否允许客户端可以查看可用模块列表,默认为可以 |
hosts allow | 指定可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接 |
hosts deny | 指定不可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接 |
auth users | 指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在。默认为所有用户无密码访问 |
secrets file | 指定用户名和密码存放的文件,格式;用户名;密码,密码不超过8位 |
[backup] | 这里就是模块名称,需要中括号扩起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护 |
path | 这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题 |
特别说明:
1)模块中的参数项可以拿到全局配置中使用
2)以上配置文件中的参数,为生产中经常使用的参数。
3)以上配置文件中没有提到的参数请参考man rsyncd.conf查看
附录2:开发rsync服务启动脚本
#!/bin/bash # chkconfig:35 13 91 # description:This is Rsync service management shell script # Source function library . /etc/rc.d/init.d/functions start(){ rsync --daemon if [ $? -eq 0 -a `ps -ef | grep -v grep | grep rsync | wc -l` =gt 0 ];then action "Starting Rsync:" /bin/true sleep 1 else action "Starting Rsync:" /bin/false sleep 1 fi } stop(){ pkill rsync;sleep 1;pkill rsync if [ `ps -ef | grep -v grep | grep "rsync --daemon" | wc -l` -lt 1 ];then action "Stopping Rsync:" /bin/true sleep 1 else action "Stopping Rsync:" /bin/false sleep 1 fi } case "$1" in start) start; ;; stop) stop; ;; restart|reload) stop; start; ;; *) echo $"Usage: $0 {start|stop|restart|reload}" ;; easc
保存成rsyncd,放到/etc/init.d/rsyncd
[root@RSYNC01 ~]# cp rsyncd /etc/init.d/rsyncd [root@RSYNC01 ~]# chmod +x /etc/init.d/rsyncd [root@RSYNC01 ~]# /etc/init.d/rsyncd stop Stopping rsyncd (via systemctl): [ OK ] [root@RSYNC01 ~]# netstat -antup | grep rsync [root@RSYNC01 ~]# /etc/init.d/rsyncd start Starting rsyncd (via systemctl): [ OK ] [root@RSYNC01 ~]# netstat -antup | grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1420/rsync tcp6 0 0 :::873 :::* LISTEN 1420/rsync
错误汇总
1)Rsync服务器没有打开联通的端口(最可能是防火墙阻挡)
[root@RSYNC ~]# rsync -avz /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password rsync: failed to connect to 192.168.200.70 (192.168.200.70): No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(126) [sender=3.1.2]
2)共享文件夹是只读的(将共享文件夹属主换成rsync)
[root@RSYNC ~]# rsync -avz /backup/ rsync_backup@192.168.200.70::backup --password-file=/etc/rsync.password sending incremental file list rsync: ERROR: cannot stat destination "." (in backup): Permission denied (13) rsync error: errors selecting input/output files, dirs (code 3) at main.c(634) [Receiver=3.1.2]