远程同步rsync
主机架构
克隆两台机器
主机角色 外网IP(NAT) 内网IP(LAN) 主机名称
Rsync服务端 10.0.0.41 172.16.1.41 backup
Rsync客户端 10.0.0.31 172.16.1.31 nfs
一、备份含义
1.什么是备份?
1)把重要的数据或者文件再次复制一份并保存下来
2.为什么要做备份?
1)数据的重要性
2)为了出现故障,恢复数据
3.能不能不备份?
1)重要的数据一定要备份
2)不重要的可以不备份
4.备份的常用工具
1)cp
2)scp
3)rsync
二、Rsync简介
1.简介
rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的
数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,
而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令。
但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
在同步数据的时候,默认情况下,rsync通过其独特的“quick check”算法,它仅同步大小或者
最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,
甚至可以实现只同步一个文件里有变化的内容部分,所以,可是实现快速的同步备份数据。
rsync简称远程同步
不同主机之间传递数据:
Linux ---> windows linux ---> linux windows ---> linux linux ---> mac
2.rsync特性
支持拷贝特殊文件,如连接文件、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。
可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。
3.rsync生产场景
1)借助cron+rsync把所有客户端服务器数据同步到备份服务器。
2)针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。
3)通过本地打包备份,然后rsync结合inotify应用把全网数统一备份到一个固定存储服务器,
然后在存储服务器上通过脚本检查并报警管理员备份结果。
4)定期将IDC机房的数据 备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。
5)实时同步,解决存储服务器等的单点问题。
4.备份类型
1)全备:将数据从头备份一次

2)增备:对于新增加的数据进行备份

3)差异备份:针对上一次全备之后更新的数据进行备份

三、rsync的应用场景
1.rsync传输方式
1)push 推
客户端将数据传输到服务端

2)pull 拉
客户端将数据下载下来

2.问题
1)push 推
当客户端数量多,容易造成推送数据阻塞
2)pull 拉
如果客户端数量过多,会对服务端造成很大压力
3.大量服务器备份场景
#假设:像现在有20台机器要备份到一台机器
使用推和拉结合的方式

4.异地备份场景

四、rsync传输模式
1.本地方式
2.远程方式
3.守护进程方式
五、本地方式(类似于cp)
1.概述
类似于cp命令,但是cp是全量复制,每次都提示替换
rsync是增量,只要文件属性没有更改就不会替换
2.语法
#本地拷贝数据命令
命令 选项 源文件 目标
rsync [OPTION...] SRC... [DEST]
3.示例
[root@backup ~]# rsync -avz 1.txt /tmp/
sending incremental file list
sent 44 bytes received 12 bytes 112.00 bytes/sec
total size is 0 speedup is 0.00
[root@backup ~]# rsync -avz 1.txt /tmp/
#命令拆分
rsync #命令
-avz #选项
1.txt #源文件
/tmp/ #目标地址
六、远程方式(类似于scp)
1.pull拉取数据
#语法:
命令 选项 用户 @ 主机:源文件 目标地址
rsync [OPTION...] [USER@]HOST:SRC... [DEST] #如果用户不写,则以当前用户去连接远程机器
#示例
[root@nfs ~]# rsync -avz root@172.16.1.41:/root/1.txt ./
receiving incremental file list
1.txt
sent 43 bytes received 84 bytes 28.22 bytes/sec
total size is 0 speedup is 0.00
#拆分语句
rsync #命令
-avz #选项
root #用户
@ #分隔符
172.16.1.41: #主机地址
/root/1.txt #源文件,要拉取得文件
./ #拉取到的目录地址
#注意:
#拉取远程服务器目录及目录下的文件
[root@nfs ~]# rsync -avz root@172.16.1.41:/tmp ./
#拉取远程服务器目录下的文件,不包含目录本身
[root@nfs ~]# rsync -avz root@172.16.1.41:/tmp/ ./
2.push推送数据
#语法:
rsync [OPTION...] SRC... [USER@]HOST:DEST
#示例:
[root@nfs ~]# rsync -avz file1 root@172.16.1.41:/root/
root@172.16.1.41's password:
sending incremental file list
file1
sent 83 bytes received 35 bytes 78.67 bytes/sec
total size is 0 speedup is 0.00
#命令拆分
rsync #命令
-avz #选项
file1 #源文件
root #用户
@ #分隔符
172.16.1.41: #主机
/root/ #目标地址
七、守护进程模式
1.为什么使用守护进程模式?
1)rsync远程传输时需要使用系统用户及密码
2)如果使用普通用户,又会出现权限不足的情况
2.守护进程传输模式语法
#语法
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
八、搭建服务端守护进程模式
1.环境准备
| 主机 | IP | 身份 |
|---|---|---|
| backup | 172.16.1.41 | rsync服务端 |
| nfs | 172.16.1.31 | rsync客户端 |
2.安装rsync(做备份的服务器都安装)
[root@backup ~]# yum install -y rsync
[root@backup ~]# rpm -qc rsync #找出配置文件
/etc/rsyncd.conf #主配置文件
/etc/sysconfig/rsyncd #选项
3.服务端配置
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = welcome to oldboyedu backup!
path = /backup
--- 配置详解
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync # 运行进程的用户
gid = rsync # 运行进程的用户组
port = 873 # 监听端口
fake super = yes # 无需让rsync以root身份运行,允许接收文件的完整属性
use chroot = no # 禁锢推送的数据至某个目录, 不允许跳出该目录
max connections = 200 # 最大连接数
timeout = 600 # 超时时间
ignore errors # 忽略错误信息
read only = false # 对备份数据可读写
list = false # 不允许查看模块信息
auth users = rsync_backup # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd # 定义rsync服务用户连接认证密码文件路径
[backup] # 定义模块信息
comment = commit # 模块注释信息
path = /backup # 定义接收备份数据目录
4.服务端创建用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M
5.服务端创建密码文件
[root@backup ~]# vim /etc/rsync.passwd
rsync_backup:123456
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.passwd
#授权
[root@backup ~]# chmod 600 /etc/rsync.passwd
6.服务端创建真实文件目录
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/
7.服务端启动服务
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
#验证启动
[root@backup ~]# netstat -lntp
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 18673/rsync
tcp6 0 0 :::873 :::* LISTEN 18673/rsync
[root@backup ~]# ps -ef | grep rsync
root 18673 1 0 17:01 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
root 18680 7850 0 17:02 pts/0 00:00:00 grep --color=auto rsync
九、客户端验证推送
1.输入密码的方式
#推送数据
[root@nfs ~]# rsync -avz file2 rsync_backup@172.16.1.41::backup
Password: 123456
sending incremental file list
file2
sent 87 bytes received 43 bytes 37.14 bytes/sec
total size is 0 speedup is 0.00
#拉取数据
[root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup ./
Password:
receiving incremental file list
./
qiudaodsb
sent 53 bytes received 173 bytes 64.57 bytes/sec
total size is 0 speedup is 0.00
2.指定密码文件的方式
#客户端配置密码文件
[root@nfs ~]# vim /etc/rsyncd.password
123456
[root@nfs ~]# echo "123456" > /etc/rsyncd.password
#授权
[root@nfs ~]# chmod 600 /etc/rsyncd.password
#推送数据
[root@nfs ~]# rsync -avz file3 rsync_backup@172.16.1.41::backup --password-file=/etc/rsyncd.password
sending incremental file list
file3
sent 87 bytes received 43 bytes 86.67 bytes/sec
total size is 0 speedup is 0.00
#拉取数据
[root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup ./ --password-file=/etc/rsyncd.password
receiving incremental file list
./
qiudaocsb
sent 50 bytes received 211 bytes 174.00 bytes/sec
total size is 0 speedup is 0.00
3.配置环境变量的方式
[root@nfs ~]# export RSYNC_PASSWORD=123456
#拉取数据
[root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup ./
#推送数据
[root@nfs ~]# rsync -avz file3 rsync_backup@172.16.1.41::backup
十、注意事项
注意事项:
rsync_backup:客户端通过该虚拟用户连接rsync服务
是一个虚拟用户,由服务端的配置文件中定义【auth users】
通常存放在指定的一个文件中,该文件也是有服务端配置文件定义【secrets file】
rsync:【模块对应的目录,必须授权为配置文件中定义的uid和gid的用户】
用于运行rsync服务时需要使用到的系统用户
用于将接收到的数据以自己的身份写入到对应的目录中
----------------------------------------------------------------------------------------
实现客户端与服务端无差异同步:--delete
#推送方式实现无差异,以客户端为准,客户端有什么服务端就有什么
[root@nfs ~]# rsync -avz --delete /root rsync_backup@172.16.1.41::backup
#拉取方式实现无差异,以服务端为准,服务端有什么客户端就有什么
[root@nfs ~]# rsync -avz --delete rsync_backup@172.16.1.41::backup /opt/
--------------------------------------------------------------------------------------------
对传输时候进行限速:
[root@nfs ~]# dd if=/dev/zero of=./size.disk bs=1M count=500 生成大文件
限制传输的速率为1MB
[root@nfs ~]# rsync -avzP --bwlimit=1 ./size.disk rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
size.disk
118,358,016 22% 1.01MB/s 0:06:33
取消每次传输时需要输入密码【客户端才会配置】
方式一:
[root@nfs ~]# echo "123456" > /etc/rsync.pass
[root@nfs ~]# chmod 600 /etc/rsync.pass 上该文件找123456
[root@nfs ~]# rsync -avzP --bwlimit=1 ./size.disk rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
方式二:写Shell脚本
[root@nfs ~]# export RSYNC_PASSWORD=123456
[root@nfs ~]# rsync -avzP ./size.disk rsync_backup@172.16.1.41::backup
rsync参数:-avz
-a #归档模式传输, 等于-tropgDl
-v #详细模式输出, 打印速率, 文件数量等
-z #传输时进行压缩以提高效率
-r #递归传输目录及子目录,即目录下得所有目录都同样传输。
-t #保持文件时间信息
-o #保持文件属主信息
-p #保持文件权限
-g #保持文件属组信息
-l #保留软连接
-P #显示同步的过程及传输时的进度等信息
-D #保持设备文件信息
-L #保留软连接指向的目标文件
-e #使用的信道协议,指定替代rsh的shell程序 ssh
--exclude=PATTERN #指定排除不需要传输的文件模式
--exclude-from=file #文件名所在的目录文件
--bwlimit=100 #限速传输
--partial #断点续传
--delete #让目标目录和源目录数据保持一致
十一、rsync服务报错总结
1 客户端的错误现象:No route to host
rsync服务端开启的iptables防火墙
[root@NFS01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
rsync: failed to connect to 172.16.1.41: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]
异常问题解决:
关闭rsync服务端的防火墙服务(iptables)
[root@backup mnt]# /etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@backup mnt]# /etc/init.d/iptables status
iptables: Firewall is not running.
2 ERROR: The remote path must start with a module name not a /
rsync客户端执行rsync命令错误:
客户端的错误现象:
[root@NFS01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::/backup
ERROR: The remote path must start with a module name not a /
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
rsync命令语法理解错误,::/backup是错误的语法,应该为::backup(rsync模块)
3. @ERROR: auth failed on module backup
客户端的错误现象:
[root@NFS01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
1. 密码真的输入错误,用户名真的错误
2. secrets file = /etc/rsync.password指定的密码文件和实际密码文件名称不一致
3. /etc/rsync.password文件权限不是600
4. rsync_backup:123456密码配置文件后面注意不要有空格
5. rsync客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称
4. Unknown module 'backup'
[root@NFS01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
1、 /etc/rsyncd.conf配置文件模块名称书写错误
2、配置文件中网段限制不对
5. Permission denied
[root@NFS01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
hosts
rsync: mkstemp ".hosts.5z3AOA" (in backup) failed: Permission denied (13)
sent 196 bytes received 27 bytes 63.71 bytes/sec
total size is 349 speedup is 1.57
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
异常问题解决:
1. 共享目录的属主和属组不正确,不是rsync
2. 共享目录的权限不正确,不是755
==============================================================================================
6 chdir failed
[root@NFS01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
1. 备份存储目录没有建立
2. 建立的备份存储目录和配置文件定义不一致
[root@backup backup]# /etc/init.d/xinetd restart
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
Stopping xinetd: [ OK ]
Starting xinetd: shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
[ OK ]
说明:如果没有备份存储目录,xinetd服务都不能正确启动
==============================================================================================
7 invalid uid rsync
[root@NFS01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
@ERROR: invalid uid rsync
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
rsync服务对应rsync虚拟用户不存在了
==============================================================================================
8 客户端已经配置了密码文件,但免秘钥登录方式,依旧需要输入密码
password file must not be other-accessible
[root@NFS01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
password file must not be other-accessible
continuing without password file
Password:
sending incremental file list
sent 26 bytes received 8 bytes 5.23 bytes/sec
total size is 349 speedup is 10.26
异常问题解决:
rsync客户端的秘钥文件也必须是600权限
==============================================================================================
9 rsync客户端连接慢问题
错误日志输出
2017/03/08 20:14:43 [3422] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors
2017/03/08 20:14:43 [3422] name lookup failed for 172.16.1.31: Name or service not known
2017/03/08 20:14:43 [3422] connect from UNKNOWN (172.16.1.31)
2017/03/08 20:14:43 [3422] rsync to backup/ from rsync_backup@unknown (172.16.1.31)
2017/03/08 20:14:43 [3422] receiving file list
2017/03/08 20:14:43 [3422] sent 76 bytes received 83 bytes total size 349
正确日志输出
2017/03/08 20:16:45 [3443] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors
2017/03/08 20:16:45 [3443] connect from NFS02 (172.16.1.31)
2017/03/08 20:16:45 [3443] rsync to backup/ from rsync_backup@NFS02 (172.16.1.31)
2017/03/08 20:16:45 [3443] receiving file list
2017/03/08 20:16:45 [3443] sent 76 bytes received 83 bytes total size 349
异常问题解决:
查看日志进行分析
==============================================================================================
10 rsync服务没有正确启动Connection refused (111)
[root@oldboy-muban ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
rsync: failed to connect to 172.16.1.41: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]
解决 rsync服务没开启
[root@oldboy-muban ~]# rsync --daemon
[root@oldboy-muban ~]# ss -lntup |grep rsync
tcp LISTEN 0 5 :::873 :::* users:(("rsync",1434,5))
tcp LISTEN 0 5 *:873 *:* users:(("rsync",1434,4))
[root@oldboy-muban ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
hosts
sent 196 bytes received 27 bytes 49.56 bytes/sec
total size is 349 speedup is 1.57
==============================================================================================
11 port 22: Connection refused
环境:本地服务器集群内部传输利用远程ssh报错
利用(telnet 172.16.1.31 22) 排查服务监听状态后采取的解决方法
[root@oldboy-muban ~]# rsync /etc/hosts 172.16.1.31:/tmp
ssh: connect to host 172.16.1.31 port 22: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]
排错思路:
[root@oldboy-muban ~]# ping 172.16.1.31
PING 172.16.1.31 (172.16.1.31) 56(84) bytes of data.
64 bytes from 172.16.1.31: icmp_seq=1 ttl=64 time=0.628 ms
64 bytes from 172.16.1.31: icmp_seq=2 ttl=64 time=0.393 ms
64 bytes from 172.16.1.31: icmp_seq=3 ttl=64 time=1.06 ms
64 bytes from 172.16.1.31: icmp_seq=4 ttl=64 time=0.745 ms
[root@oldboy-muban ~]# traceroute 172.16.1.31
traceroute to 172.16.1.31 (172.16.1.31), 30 hops max, 60 byte packets
1 NFS01 (172.16.1.31) 0.597 ms 0.189 ms 0.965 ms
/etc/init.d/iptables status
iptables: Firewall is not running.
[root@backup ~]#
[root@backup ~]# netstat -lntup|grep 22
p 0 0 10.0.0.31:22 0.0.0.0:* LISTEN 1187/sshd
故障原因:无法连接
telnet 172.16.1.31 22
解决方法:
[root@oldboy-backup-41]# vim /etc/ssh/sshd_config
#Port 22
#AddressFamily any
#ListenAddress 10.0.0.31 改为 0.0.0.0
#ListenAddress ::
总结:内网传输通过SSH pro 22 表明22端口链接不上
==============================================================================================
12 --passwd-file=/etc/rsync.passwd: unknown option 没有正确输入password文件名
报错:--passwd-file=/etc/rsync.passwd: unknown option
错误案例 本地rsync.password 文件要保持一致缺少字母都会报错
echo "123456">>/etc/rsync.passwd
[root@NFS01 ~]# chmod 600 /etc/rsync.passwd
[root@NFS01 ~]# ll /etc/rsync.passwd
-rw------- 1 root root 7 Mar 9 13:47 /etc/rsync.passwd
[root@NFS01 ~]# rsync -az -P /root/ rsync_backup@172.16.1.41::backup --passwd-file=/etc/rsync.passwd
rsync: --passwd-file=/etc/rsync.passwd: unknown option
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6]
正确做法:
[root@NFS01 ~]# echo "123456">>/etc/rsync.password
[root@NFS01 ~]# chmod 600 /etc/rsync.password
[root@NFS01 ~]# ll /etc/rsync.password
-rw------- 1 root root 7 Mar 9 13:49 /etc/rsync.password
rsync -az -P /server/files/secure-20161219 rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
secure-20161219
51053780 100% 14.31MB/s 0:00:03 (xfer#1, to-check=0/1)
rsync: mkstemp ".secure-20161219.lcnuWA" (in backup) failed: Permission denied (13)
sent 2210982 bytes received 27 bytes 491335.33 bytes/sec
total size is 51053780 speedup is 23.09
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
[root@backup ~]# ls /backup/
100.log cc.txt optimize-init_sys.sh
anaconda-ks.cfg
1)可能是服务没有开启
2)iptables SELinux
3)本次遇见sshd传输受限 限制了传输的ip(安全)
==============================================================================================
Rsync服务端排错思路
m 查看rsync服务配置文件路径是否正确 /etc/rsyncd.conf
m 查看配置文件例的host allow,host deny,允许的ip网段是否是允许客户端访问的ip网段
m 查看配置文件中path参数里的路径是否存在,权限是否正确(正常应为配置文件中的UUID参数对应的属主和组)
m 查看rsync服务是否启动,端口是否存在 ps -ef netstat -lntup
m 查看iptables防火墙和SELinux是否开启允许rsync服务通过,也可以关闭
m 查看服务端rsync配置文件里的密码权限是否为600 密码文件格式是否正确,正确格式(用户名:密码)文件路径和配置文件里的secrect files 参数对应
m 如果是推送数据,要查看,配置rsyncd.conf 文件中用户是否对模块下目录有可读的权限
==============================================================================================
客户端排错思路
m 查看客户端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,注意:仅需要有密码,并且和服务端的密码一致
m 用telnet链接rsync服务器ip地址873端口,查看服务是否启动(可测试服务端防火墙是否阻挡telnet10.0.0.100 873)
m 客户端执行命令是 rsync -avzP rsync_backup@10.0.0.100::backup/test/test/ --password-file=/etc/rsync.password
m 此命令要记清楚尤其10.0.0.100::backup/test/处的双引号及随后的backup为模块名称
一起动手学习吧!!!

浙公网安备 33010602011771号