第十九章 同步工具之rsync
一、rsync基础
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 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-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(相当于-vzrtopgDl)
(3)参数使用演示
a、使用--bwlimit参数限制带宽
rsync -avz --bwlimit=100 -e 'ssh' a.log oldboy@192.168.58.85:/wddg/log/
b、使用-avz参数
rsync -avz -e 'ssh' a.logoldboy@192.168.58.85:/wddg/log/
6、rsync的工作方式
一般来说,rsync大致使用3种主要的传输数据方式。
(1)单个主机本地之间的数据传输(此时类似于cp命令的功能)
a、语法
rsync [选项] 源文件或目录 目标文件或目录
b、实例1:普通拷贝
rsync /etc/hosts /tmp/ 等价于 cp /etc/hosts /tmp/
c、实例2:保持文件属性
rsync –avz /etc/hosts /tmp/ 等价于cp -dpr /etc/hosts /tmp/ #-dpr=-a
d、实例3:删除文件
rsync删除文件或目录的实质还是拷贝,就是将源目录去替换目标目录。源目录中是什么,目标目录中就是什么,目标目录中原有的文件均被删除
(i)首先,创建一个空目录做为源目录
mkdir /srcnull
(ii)在目标目录中创建文件
touch /data/a{1,2,3}.txt
ll /data
-rw-r--r-- 1 root root 0 Feb 20 02:45 a1.txt
-rw-r--r-- 1 root root 0 Feb 20 02:45 a2.txt
-rw-r--r-- 1 root root 0 Feb 20 02:45 a3.txt
(iii)删除时,源目录后不带/
rsync –r -–delete /srcnull /data/ #srcnull后没有加/,删除不成功,没能删除/data下的文件
ll /data
-rw-r--r-- 1 root root 0 Feb 20 02:45 a1.txt
-rw-r--r-- 1 root root 0 Feb 20 02:45 a2.txt
-rw-r--r-- 1 root root 0 Feb 20 02:45 a3.txt
(iv)删除时,源目录后带/
rsync –r –-delete /srcnull/ /data/ #srcnull后加/,删除成功,删除了/data下的文件
ll data/
total 0
(v)原因:如果src目录后不带斜杠,那么是将src目录复制到dest中,包含了src目录,带斜杠是把src目录下的文件同步到dest中,不包含src目录,会把目标目录下所有文件删除,再同步。
(vi)源目录中存在文件
touch /srcnull/ddd.txt
touch /data/a{1,2,3}.txt
ll /data
-rw-r--r-- 1 root root 0 Feb 20 02:45 a1.txt
-rw-r--r-- 1 root root 0 Feb 20 02:45 a2.txt
-rw-r--r-- 1 root root 0 Feb 20 02:45 a3.txt
ll srcnull/
-rw-r--r-- 1 root root 0 Feb 20 02:49 ddd.txt
(vii)删除,源目录中的文件同步到目标目录中了,目标目录中的原有文件全部被删除
rsync –r –delete /srcnull/ /data/
ll /data
-rw-r--r-- 1 root root 0 Feb 20 02:50 ddd.txt
(2)借助rcp、ssh等通道来传输数据(此时类似于scp命令的功能)
a、传统scp传输方式
(i)推送方式
scp -rp -P9080 /etc/hosts test@192.168.1.8:/tmp
(ii)拉取方式
scp -rp -P9080 test@192.168.1.8:/tmp /etc/hosts
b、rsync传输方式
(i)推送方式
rsync -avz -e 'ssh' a.log oldboy@192.168.58.85:/wddg/log/
(ii)拉取方式
rsync -avz -e 'ssh' oldboy@192.168.1.8:/tmp /etc/hosts
(3)以守护进程(socket)的方式传输数据(这是rsync本身的重要功能)
a、演示环境
主机名 |
IP |
用途 |
操作系统 |
linuxDelivery |
192.168.58.238 |
服务端A_备份服务器 |
CentOS6.8 |
StudyLinux |
192.168.58.85 |
客户端B_发送服务器 |
CentOS6.8 |
LS-B16175 |
192.168.16.75 |
客户端C_发送服务器 |
RedHat6.4 |
b、服务端A_生成rsync配置文件/etc/rsyncd.conf(需手动生成)
vi /etc/rsyncd.conf
#rsync-config------------------------start
#create by Study rsync 13:11 2017-02-21
##rsyncd.conf start##
uid = rsync #指定rsync服务进程的属主
gid = rsync #指定rsync服务进程的属组
use chroot = no #安全方面的参数,首先chroot到path参数指定的目录下。
max connections = 200 #允许的最大连接数
timeout = 300 #超时日间
pid file = /var/run/rsyncd.pid #指定rsync的pid文件
lock file = /var/run/rsync.lock #锁文件
log file = /var/log/rsyncd.log #日志文件
[StudyRsync] #[]表示模块,模块名就是rsync客户端看到的目录名
path = /wddg/rsync/ #rsync在服务端的路径
ignore errors #忽略错误
read only = false #指定目录可读可写(rw)
list = false #不允许客户端对共享目录进行列表操作
hosts allow = 192.168.0.0/16 #允许访问的主机。可以是IP,也可以是网段
hosts deny = 0.0.0.0/32 #拒绝访问的主机
auth users = rsync_backup #空格或逗号分隔的用户列表,为虚拟用户,列表中的用户才能连接该模块。
secrets file = /etc/rsync.password #虚拟用户的密码文件.格式为用户名:密码
#rsync-config------------------------end
c、服务端A_以守护进程方式启动rsync
rsync --daemon
d、服务端A_查看是否启动成功(rsync的监听端口为873)
netstat -lntup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 3747/rsync
tcp 0 0 :::873 :::* LISTEN 3747/rsync
cat /var/log/rsyncd.log
2017/02/21 14:01:39 [3747] rsyncd version 3.0.6 starting, listeningon port 873
e、服务端A_新建rsync用户
useradd rsync -s /sbin/nologin
id rsync
uid=503(rsync) gid=503(rsync) groups=503(rsync)
f、服务端A_新建rsync共享目录
mkdir /wddg/rsync/
g、服务端A_将rsync共享目录属主(组)改为rysnc
chown -R rsync.rsync /wddg/rsync
h、服务端A_新建rsync密码文件
echo "rsync_backup:mypassword" > /etc/rsync.password
i、服务端A_降低rsync密码文件的权限,保证安全
chmod 600 /etc/rsync.password
j、客户端B_创建rsync密码文件(只需密码,不需用户)
echo "mypassword" > /etc/rsync.password
k、客户端B _降低rsync密码文件的权限,保证安全
chmod 600 /etc/rsync.password
l、客户端C_创建rsync密码文件(只需密码,不需用户)
echo "mypassword" > /etc/rsync.password
m、客户端C _降低rsync密码文件的权限,保证安全
chmod 600 /etc/rsync.password
n、客户端B_拉取方式获取服务端A数据(需密碼)
rsync 参数 虚拟用户 IP 模块名 本地目录
rsync -avz rsync_backup@192.168.58.238::StudyRsync /wddg/share/ #需密碼
o、客户端B_拉取方式获取服务端A数据(指定密碼文件方式,無需密碼)
rsync -avz rsync_backup@192.168.58.238::StudyRsync/wddg/share/ --password-file=/etc/rsync.password #指定密碼文件,無需密碼,自動傳輸
p、客户端B_推送方式获取服务端A数据(指定密碼文件方式,無需密碼)
touch /wddg/share/{1..10}
rsync -avz /wddg/share/ rsync_backup@192.168.58.238::StudyRsync--password-file=/etc/rsync.password
说明:推送时,没有/时(/wddg/share)表示推送目录share,有/时(/wddg/share/)表示推送share下的所有文件.
q、客户端B_再推一次數据到服务端A(rsync不会推送同样的数据了)
rsync -avz /wddg/share/ rsync_backup@192.168.58.238::StudyRsync--password-file=/etc/rsync.password
显示结果为:total sizeis o speedup is 0.00
r、客户端C_拉取方式获取服务端A数据(指定rsync协议)
rsync -avz rsync://