linux运维笔记:Rsync数据同步工具
1-Rsync简介
Rsync英文全称是Remote synchronization,Rsync具有可以使本地和远程两台主机之间的数据快速复制和同步镜像、远程备份的功能,这个类似ssh带scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而Rsync可以增量拷贝。当然,Rsync还可以在本地的不同分区或目录之间全量及增量的复制数据,这又类似于cp命令,但同样优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
小提示:利用rsync还可以实现删除文件和目录的功能,这有相当于rm命令!
一个rsync相当于scp,cp,rm,但是又优于每一个命令。
2-Rsync特性
1、支持拷贝特殊文件如链接文件,设备等。
2、可以排除指定文件或目录同步功能,相当于打包命令tar排除功能。
3、可以做到保持源文件或目录属性、时间、软硬链接、属主、组等所有属性均不修改-p。
4、可以实现增量同步,即只同步发生变化的数据,因此数据传输效率很高(tar-N)。
5、可以使用rcp,rsh,ssh等方式来配合传输文件(Rsync本身不对数据进行加密)。
6、可以通过socket(进程方式)传输文件和数据(服务端和客户端)。
7、支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像。
3-rsync 软件功能介绍
类似于 cp 命令 -- 实现本地备份传输数据
类似于scp 命令 -- 远程备份传输数据
类似于 rm 命令 -- 实现无差异同步备份
类似于 ls 命令 -- 本地文件信息查看
1- rsync == cp
[root@backup ~]# cp -a /etc/hosts /tmp/
[root@backup ~]# ls /tmp/
hosts
[root@backup ~]# \rm /tmp/hosts
[root@backup ~]# ls /tmp/
[root@backup ~]# rsync /etc/hosts /tmp/
[root@backup ~]# ls /tmp/
hosts
2- rsync == scp
1)使用scp实现
#检查对端服务器目标位置上是否有该文件
[root@nfs01 ~]# ls /tmp/
#从本地拷贝到远端服务器上
[root@backup ~]# scp -rp /etc/hosts 10.0.0.31:/tmp/
The authenticity of host '10.0.0.31 (10.0.0.31)' can't be established.
RSA key fingerprint is 69:0a:7e:7d:c4:45:80:f3:c1:9c:75:21:cb:56:84:12.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.31' (RSA) to the list of known hosts.
root@10.0.0.31's password:
hosts 100% 313 0.3KB/s 00:00
#检查远端服务器上的结果
[root@nfs01 ~]# ls /tmp/
hosts
2)使用rsync 实现
[root@backup ~]# rsync -rp /etc/hosts 10.0.0.31:/tmp/
root@10.0.0.31's password:
3- rsync == rm
1)rm删除
[root@backup ~]# ls /tmp/
hosts
[root@backup ~]# mkdir /ning
[root@backup ~]# cp /tmp/* /ning/
[root@backup ~]# ls /ning/
hosts
[root@backup ~]# rm -rf /ning/*
[root@backup ~]# ls /ning/
2)rsync删除
[root@backup ~]# cp /tmp/* /ning/
[root@backup ~]# ls /ning/
hosts
[root@backup ~]# mkdir /null
[root@backup ~]# ls /ning/
hosts
[root@backup ~]# rsync -a --delete /null/ /ning/
[root@backup ~]# ls /ning/
[root@backup ~]#
4- rsync == ls -l
[root@backup ~]# ls -l /etc/hosts
-rw-r--r--. 2 root root 313 Apr 13 08:27 /etc/hosts
[root@backup ~]# rsync /etc/hosts
-rw-r--r-- 313 2018/04/13 08:27:40 hosts
4-Rsync的工作模式
1-单个主机本地之间的数据传输(此时类似于cp命令的功能)
2-借助ssh通道在不同主机之间传输数据(此时类似于scp命令的功能)
3-以守护进程(socket)的方式传输数据(这个是rsync自身的重要功能),即daemon 模式,内网不需要,加密会对性能有损失(rsync+inotify;rsync+sersync 等)
1-单个主机本地之间的数据传输(此时类似于cp命令的功能)
实例1:把系统的hosts文件同步到/tmp目录
直接本地同步:相当于cp,rsync /etc/hosts /tmp/
实例2:把/opt目录拷贝到/mnt下,rsync -avz /opt /mnt
常用选项参数说明
-a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于rtopgDl
-v,--verbose 详细模式输出,传输时的进度等信息
-z,--compress 传输时进行压缩以提高传输速率,--compress-level=NUM可按级别压缩。
====================================================================
-r,-recursive对子目录以递归模式,即目录下的所有目录同样传输,注意是小写r
-t,--times保持文件时间信息
-o,--owner保持文件属主信息
-p,--perms保持文件权限
-g,--group保持文件属组信息
-P,--Progress显示同步的过程及传输时的进度信息
-D,--device保持设备文件信息
-l,--links保持软连接
-e,--rsh=COMMAND使用的信道协议,指定替代rsh的shell程序,例如ssh
--exclude=PATTERN指定排除不需要传输的文件模式(和tar参数一样)
--exclude-from=file(文件名所在目录文件)
--bwlimit=RATE limit socket I/O bandwidth,rsync scp ftp都有限速的功能
--delete 让目标目录和源目录数据一致。
保持同步目录及文件属性
本地有什么,远端也有什么,进行同步。本地没有的,远端也不能有。
这里的-avzP相当于-vzrtopgDlP(还多了Dl功能),生产环境中常用的参数选项为-avzP或-vzrtopgP如果放入脚本中,也可以把-v和-P去掉。
avz相当于vzrtopgDl
生产参数:-avz或-vzrtopg
实际案例:某DBA做数据同步,带宽占满,导致用户无法访问网站。
rsync -avz dbfile 10.0.0.41:/backup #没有给带宽做限制
rsync -avz --bwlimit=100 dbfile 172.16.1.41:/backup #限定了带宽
特别提示:请注意以下两条命令的差别:
1)rsync -avz /opt/ /tmp/
2)rsync -avz /opt /tmp/
1)中/opt/的意思是,仅把/opt/目录里面的内容同步过来,opt目录本身并不同步;
而后者2)中/opt表示把opt本身及其内部内容全都同步到/tmp下,仅一个/(斜线之差),意义大不相同,请同学们注意使用的差别。
2)在后边要讲的通过远程shell进行数据传输的内容也会有类似的问题,请牢记。
2-借助ssh通道在不同主机之间传输数据(此时类似于scp命令的功能)
传输可以分为两种情况,其语法分别为:
拉取 pull: rsync [OPENTION...] [USER@]HOST:SRC... [DEST] 拉取别人到自己
推送 push: rsync [OPENTION...] SRC... [USER@]HOST:DEST 推送自己到别人
语法说明:
1) rsync 为同步的命令
2) [OPENTION...] 为同步时的参数选项
3) [USER@]HOST 为 rsync 同步的远程的连接用户和主机地址
4) SRC 为源,即待拷分区、文件或目录等,和 HOST 之间用一个冒号连接
5) [DEST]为目的分区、文件或目录等
其中拉取(get),表示从源端主机吧数据同步到执行命令的本地主机相应目录,拷贝()表示从本地主机执行命令把本地的数据同步到远端的主机指定目录下
拉取实例语法:
rsync -avz -e 'ssh -p 22' root@172.16.1.41:/etc/ /tmp/
表示将 172.16.1.41 机器 etc 目录下文件拷贝至本地 tmp 目录
推送实例语法:
rsync -avz -e 'ssh -p 22' /usr/ root@172.16.1.41:/home/
表示将本地 usr 目录下的文件推送至 172.16.1.41 机器的 home 目录下
关键语法说明:
1) -vzrtopg 相当于-avz,表示同步时文件和目录属性不变
2) -progress 显示同步的过程,可以用-P 替换
3) -e 'ssh -p 22',表示通过 ssh 的通道传输数据,-p 22 可省略
4) root@172.16.1.41:/home/,表示远程的主机用户,内网IP地址,目录
5) /tmp 本地的路径
提示:此种方式一般是配合 SSH key 免秘钥登录来完成数据同步的
实例:通过root用户从10.0.0.31的/tmp目录(包含目录本身)把数据拉取到本地的/null目录下
[root@nfs01 ~]# rsync -avz -e 'ssh -p 22' root@10.0.0.31:/tmp/ /null/
也可以去掉 -e 'ssh -p 22' (默认22端口)
也可以通过映射好的主机名:(/etc/hosts)
[root@nfs01 ~]# tail -1 /etc/hosts
10.0.0.31 nfs01
[root@nfs01 ~]# rsync -avz root@backup:/tmp/ /null/
推送:[root@nfs01 ~]# rsync -avz /null/ root@backup:/tmp/
3-重点:以守护进程(socket)的方式传输数据(这个是rsync自身的重要功能),即daemon 模式,内网不需要,加密会对性能有损失(rsync+inotify;rsync+sersync 等)
具体步骤如下:
操作系统:
[root@backup ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
内核版本:
[root@backup ~]# uname -r
2.6.32-696.el6.x86_64
架构类型:
[root@backup ~]# uname -m
x86_64
软件是否存在:
[root@backup ~]# rpm -qa |grep rsync
rsync-3.0.6-12.el6.x86_64
服务端配置:
1-编辑配置文件。
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync #用户远端的命令使用 rsync 访问共享目录
gid = rsync #授权的用户组
use chroot = no #安全相关
max connections = 200 #最大连接数
timeout = 300 #超时时间
pid file = /var/run/rsyncd.pid #程序进程对应的进程号文件
lock file = /var/run/rsync.lock #锁文件
log file = /var/log/rsyncd.log #日志文件
[backup] #模块名
path = /backup/ #模块设定的路径(提供访问的目录)
ignore errors #忽略错误
read only = false #只读为假(可写)
list =false #不能列表
hosts allow = 172.16.1.0/24 #允许连接的 ip 段
#host deny = 0.0.0.0/32 #拒绝连接的 ip 段
auth users = rsync_backup #授权连接的用户
secrets file = /etc/rsync.password #密码文件
复制以下即可:
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[backup]
path = /backup/
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
#host deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
2-创建本地的rsync用户。
[root@backup ~]# id rsync
id: rsync: no such user
[root@backup ~]# useradd rsync -s /sbin/nologin -M # -M,不创建家目录,不给它登录
[root@backup ~]# tail -1 /etc/passwd
rsync:x:500:500::/home/rsync:/sbin/nologin
3-创建共享目录。
[root@backup ~]# mkdir /backup
4-更改共享目录的属主和属组。
[root@backup ~]# chown -R rsync:rsync /backup/ (chown -R rsync.rsync /backup/)
[root@backup ~]# ls -ld /backup/
drwxr-xr-x. 2 rsync rsync 4096 Apr 13 11:20 /backup/
5-启动rsync服务。
[root@backup ~]# rsync --daemon
[root@backup ~]# ps -ef | grep rsync
root 3495 1 0 11:16 ? 00:00:00 rsync --daemon
root 3497 2819 0 11:17 pts/1 00:00:00 grep rsync
6-创建账号密码文件。
[root@backup ~]# echo "rsync_backup:oldboy" >/etc/rsync.password
7-设置账号密码文件的权限。
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# ls -ld /etc/rsync.password
-rw-------. 1 root root 20 Apr 13 11:28 /etc/rsync.password
8-加入开机自启动。
[root@backup ~]# echo "rsync --daemon" >>/etc/rc.local
[root@backup ~]# tail -1 /etc/rc.local
rsync --daemon
客户端配置:
1-创建密码文件。
[root@nfs01 ~]# echo "oldboy" >/etc/rsync.password
[root@nfs01 ~]# cat /etc/rsync.password
oldboy
2-设置密码文件的权限。
[root@nfs01 ~]# chmod 600 /etc/rsync.password
[root@nfs01 ~]# ll /etc/rsync.password
-rw-------. 1 root root 7 Apr 13 11:42 /etc/rsync.password
3-创建共享目录。
[root@nfs01 ~]# mkdir /ning
Rsync同步测试
推送测试1:将客户端指定目录内容推送到服务器端rsync指定目录下。
测试命令:
rsync -avz /ning/ rsync_backup@172.16.1.41::backup/ --password-file=/etc/rsync.password
命令说明:
-avz:保持稳健各项属性不变,-v显示同步信息 -P显示具体同步过程
/ning/:客户端要推送的内容所在目录
rsync_backup:服务器端rsync服务的同步的用户名(非Linux用户)
172.16.1.41:服务器端IP地址
backup:服务器端配置文件里的模块名,
即服务器端接收客户端推送文件之后,最终存放接收文件的目录名。
--password-file=/etc/rsync.password:免密码操作,指定密码文件位置,如果不写,则会要求用户交互式输入密码。(如果想挂定时任务,必须得非交互式)
1)客户端操作:推送自己的/ning到服务器端的backup/
客户端操作:
[root@nfs01 ~]# touch /ning/{001..005}
[root@nfs01 ~]# ls /ning
001 002 003 004 005
[root@nfs01 ~]# rsync -avz /ning/ rsync_backup@172.16.1.41::backup/ --password-file=/etc/rsync.password
sending incremental file list
./
001
002
003
004
005
sent 459 bytes received 201 bytes 1320.00 bytes/sec
total size is 0 speedup is 0.00
服务器端查看:
[root@backup ~]# ls /backup/
001 002 003 004 005
2)客户端操作:拉取服务器端的backup/到自己的/ning
服务器端创建文件:
[root@backup ~]# touch /backup/{001..005}
[root@backup ~]# ls /backup/
001 002 003 004 005
客户端操作:
[root@nfs01 ~]# rsync -avz rsync_backup@172.16.1.41::backup/ /ning/ --password-file=/etc/rsync.password
receiving incremental file list
./
001
002
003
004
005
sent 162 bytes received 334 bytes 992.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs01 ~]# ls /ning/
001 002 003 004 005
3)关闭 rsync 的两种方式
1) kill `cat /var/run/rsyncd.pid`
2) pkill rsync
4)排除文件
1-排除单个文件。
[root@backup ~]# ls /backup/
001 002 003 004 005
[root@nfs01 ~]# rsync -avz --exclude=005 rsync_backup@172.16.1.41::backup/ /ning/ --password-file=/etc/rsync.password
receiving incremental file list
./
001
002
003
004
sent 152 bytes received 291 bytes 886.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs01 ~]# ls /ning/
001 002 003 004
2-排除多个文件。
[root@nfs01 ~]# rsync -avz --exclude=005 --exclude=004 rsync_backup@172.16.1.41::backup/ /ning/ --password-file=/etc/rsync.password
receiving incremental file list
./
001
002
003
sent 142 bytes received 248 bytes 260.00 bytes/sec
total size is 0 speedup is 0.00
3-通过调用文件排除。
[root@nfs01 ~]# vim /root/exclude.txt
001
002
003
[root@nfs01 ~]# rsync -avz --exclude-from=/root/exclude.txt rsync_backup@172.16.1.41::backup/ /ning/ --password-file=/etc/rsync.password
receiving incremental file list
./
004
005
sent 132 bytes received 205 bytes 674.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs01 ~]# ls /ning/
004 005
5)无差异同步
推模式:我有什么,你就有什么;我没有,你也不能有
拉模式:你有什么,我就有什么;你没有,我也不能有
总结:服务端客户端数据完全一致(一模一样)
[root@backup ~]# ls /backup/
001 002 003 004 005
[root@nfs01 ~]# ls /ning/
004 005
[root@nfs01 ~]# rsync -avz --delete rsync_backup@172.16.1.41::backup/ /ning/ --password-file=/etc/rsync.password
receiving incremental file list
001
002
003
sent 121 bytes received 259 bytes 760.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs01 ~]# ls /ning/
001 002 003 004 005
rsync无差异同步的生产场景应用
一般是需要两台服务器之间,必须要求数据一致,且时时性又不是很高的情况下,如两台负载均衡下的web服务器之间的同步,或者高可用双机配置之间的同步等,rsync无差异同步非常的危险,而且,有很多的替代方案,因此,生产场景没有特殊的需求,应避免使用。切记,有很多朋友都已经有了血的教训。
Rsync总结
* Rsync 优缺点
1-rsync优点:
1)增量备份,支持socket(daemon),集中备份(支持推拉,都是以客户端为参照物)。
2)远程SHELL通道模式还可以加密(SSH)传输,socket(daemon)需要加密传输,可以利用vpn服务或ipsec服务
2-rsync缺点:
1)大量小文件同步的时候,比对时间较长,有的时候,同步过程中,rsync进程可能会停止,僵死了。
2)同步大文件,10G这样的大文件有时也会出问题,中断。未完整同步前,是隐藏文件,可以通过续传(--partial)等参数实现传输。
3)一次性远程拷贝可以用scp,大量小文件要打包后再拷贝。(重要)
* 排错必备思想
部署流程步骤熟练
rsync原理理解
学会看日志,rsync命令行输出,日志文件/var/log/rsyncd.log
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中用户是否对模块下目录有可读写的权限。
2-Rsync客户端排错思路
1)查看客户端rsync配置的密码文件是否有600的权限,密码文件格式是否正确,注意:仅需要有密码,并且和服务器端的密码保持一致。
2)用telnet连接rsync服务器ip地址873端口,查看服务是否启动(可测试服务端防火墙是否阻挡)telnet 172.16.1.41 873
3)客户端执行命令时:rsync -avz rsync_backup@172.16.1.41::backup/ /ning/ --password-file=/etc/rsync.password
此命令的细节要记清楚,尤其172.16.1.41::backup/ 处的双冒号及其后的backup为模块名称