第1章 rsync服务及搭建备份服务器
1.1 什么是Rsync
Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据复制(拷贝)的优秀工具。
1.2 全量和增量
全量 | 全部备份 |
---|---|
增量 | 差异化备份,对更新的那一部分进行备份 |
1.3 Rsync的作用
工作中的定时/实时数据备份、本地服务器目录、不同机器、不同机房之间的数据备份都可以使用Rsync完成。
1.4 Rsync的功能特性
- 支持拷贝普通文件与特殊文件,如链接文件,设备文件等。
- 支持排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
- 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变。
- 可实现增量复制,既只复制发生变化的数据,因此数据传输效率很高。
- 可以使用rcp,rsh,ssh等方式来配合进行隧道加密传输文件(rsync本身不对数据加密)。
- 可以通过socket(进程方式)传输文件和数据(服务端和客户端)。
- 支持匿名或认证(无需系统用户)进程模式传输,安全的进行数据备份及镜像
1.5 增量复制原理
使用quick check算法,只对增量的部分复制,根据大小属性的变化进行复制。
版本 | 复制原理 |
---|---|
Rsync 2.x | 比对完所有内容后,对差异的内容进行复制 |
Rsync 3.x | 一边比对文本内容,一边对差异进行复制。 |
1.6 Rsync三种工作模式介绍
1.6.1 本地(local)
在本地使用,rsync就是一个命令。
语法格式:
rsync | [OPTION...] | SRC... | [DEST] |
---|---|---|---|
rsync命令 | 参数选项 | [源目录或文件] | 目的目录或文件 |
命令作用:
- 把数据从一个地方复制到另一个地方(仅在一台机器增量),相当于cp命令。
- 通过加参数实现删除功能,相当于rm命令。
- 查看属性信息功能,相当于ls命令。
拷贝实践:
1.一般复制:
[root@backup ~]$ ls /opt <===查看目录为空目录
[root@backup ~]$ rsync /etc/hosts /opt <===拷贝文件hosts
[root@backup ~]$ ls /opt <===查看结果
hosts
2.保持属性复制:
[root@backup ~]$ rsync -zrtopg /etc/hosts /opt/ <===复制文件
[root@backup ~]$ ls -l /opt/hosts /etc/hosts <===查看属性
-rw-r--r-- 1 root root 332 4月 12 11:25 /etc/hosts
-rw-r--r-- 1 root root 332 4月 12 11:25 /opt/hosts
删除实践:
1.删除文件内容:
[root@backup ~]$ touch /null.txt <===创建空文件
[root@backup ~]$ cat /opt/hosts <===查看原文件内容
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web01
172.16.1.8 web02
172.16.1.9 web03
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.51 db01 db01.etiantian.org
172.16.1.61 m01
[root@backup ~]$ rsync -r --delete /null.txt /opt/hosts <===让后面的hosts和前面的null.txt一样
[root@backup ~]$ cat /opt/hosts <===查看是否清空
2.删除目录下所有内容:
[root@backup ~]$ mkdir /null <===创建空目录
[root@backup ~]$ rsync -r --delete /null/ /opt/ <===让后面opt和前面null目录内容保持一致
[root@backup ~]$ ls /opt/
查看属性:
[root@backup ~]$ rsync /etc/hosts
-rw-r--r-- 332 2019/04/12 11:25:32 hosts
重点:只适合rsync
目录 | 区别 |
---|---|
null | 目录和目录下的内容 |
null/ | 只是目录下的内容,不含本身 |
1.6.2 远程shell模式
借助类似ssh隧道传输数据,适合不同的机器之间的异地拷贝,相当于scp,但是scp是远程全量拷贝。
远程拷贝的两种模式:
1、pull(拉):从远端拉取到本地
语法格式:
rsync | [OPTION...] | [USER@]HOST:SRC... | [DEST] |
---|---|---|---|
rsync命令 | 参数选项 | [认证用户]@[主机地址]:[源路径] | 本地路径 |
2、push(推):从本地推到远端
语法格式:
rsync | [OPTION...] | SRC... | [USER@]HOST:[DEST] |
---|---|---|---|
rsync命令 | 参数选项 | 本地路径 | [认证用户]@[主机地址]:[目标路径] |
示例:
[root@nfs01 ~]$ rsync -avz /etc/hosts [email protected]:/opt/ <===加密传输。
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.41' (ECDSA) to the list of known hosts.
[email protected]'s password:
sending incremental file list
hosts
sent 219 bytes received 35 bytes 14.51 bytes/sec
total size is 332 speedup is 1.31
检查:
[root@backup ~]$ cd /opt/
[root@backup /opt]$ ls
hosts
以下两条命令是等价的。其中:
参数 | 含义 |
---|---|
-e ssh | 指定使用ssh通道 |
-p 22 | 指定使用22端口 |
rsync -avz /etc/hosts [email protected]:/opt/
rsync -avz /etc/hosts -e "ssh -p 22" [email protected]:/opt/
示例:
[root@nfs01 ~]# rsync -avz /etc/hosts -e "ssh -p 22" [email protected]:/opt/
[email protected]'s password:
sending incremental file list
sent 44 bytes received 12 bytes 22.40 bytes/sec
total size is 332 speedup is 5.93
pull(拉)的命令:
rsync -avz [email protected]:/opt/hosts /opt
rsync -avz -e "ssh -p 22" [email protected]:/opt/hosts /opt
1.6.3 rsync守护进程模式
rsync服务模式:开启后台进程,接受别人访问。
守护进程模式首先要搭建rsync服务端(即守护进程),然后才能在客户端实现推拉数据。守护进程模式是企业运维的一个重要的模式。
1.7 rsync命令参数
参数 | 说明 |
---|---|
-v | --verbose 显示输出过程 |
-z | --compress 压缩 |
-a | --archive 多参数集合(-rtopgDl) |
-r | --recursive 递归 |
-t | --times 保持修改时间属性 |
-o | --owner 保持属主不变 |
-p | --perms 保持权限不变 |
-g | --group 保持用户组不变 |
-l | --links 保持拷贝软连接 |
-q | --quiet 安静的拷贝 |
-e | 指定传输通道 |
--bwlimit=KBPS | 限制I/O带宽,KBytes per second。 |
--delete | 删除 |
--exclude | 排除 |
--exclude-from | 从文件中排除 |
企业常用参数组合: -avz或者-vzrtopg
1.8 rsync守护进程模式应用实践
1.8.1 以下操作都是在backup服务器
1.8.1.1 安装rsync命令,若已安装,可以忽略
[root@backup ~]$ rsync --version <===查看rsync版本
rsync version 3.1.2 protocol version 31
[root@backup ~]$ yum install rsync <===安装rsync
1.8.1.2 配置配置文件
备份:
cp /etc/rsyncd.conf{,.ori}
修改文件信息:
cat -n /etc/rsyncd.conf
1 #rsync_config_______________start
2 #created by oldboy
3 #site: http://www.oldboyedu.com
4 uid = rsync --->管理备份目录的用户
5 gid = rsync --->管理备份目录的用户组
6 use chroot = no --->安全功能,数据是否锁定到备份目录
7 fake super = yes --->不用root用户也可以存储文件的完整属性
8 max connections = 200 --->最大并发连接数(同时多少客户端访问)
9 timeout = 600 --->超时时间
10 pid file = /var/run/rsyncd.pid --->进程号所在文件
11 lock file = /var/run/rsync.lock --->锁文件
12 log file = /var/log/rsyncd.log --->日志文件,查看报错等信息*****
13 ignore errors --->忽略错误
14 read only = false --->可写
15 list = false --->不允许列表
16 hosts allow = 172.16.1.0/24 --->授权哪些主机可以访问
17 hosts deny = 0.0.0.0/32 --->哪些主机不允许访问
18 auth users = rsync_backup --->远程虚拟连接用户
19 secrets file = /etc/rsync.password --->存放密码的文件(格式为(用户名:密码) 权限:必须为600)
20 [backup] --->[模块名]远程访问一般使用模块名访问
21 comment = welcome to oldboyedu backup! --->说明,注释
22 path = /backup/ --->服务端用户备份的目录(用户和组,rsync.rsync)
创建用户和备份目录:
[root@backup ~]$ useradd rsync <===创建用户
[root@backup ~]$ id rsync
uid=1001(rsync) gid=1001(rsync) 组=1001(rsync)
[root@backup ~]$ mkdir -p /backup <===创建目录
[root@backup ~]$ chown -R rsync.rsync /backup/ <===修改用户和用户组
[root@backup ~]$ ls -ld /backup/
drwxr-xr-x 2 rsync rsync 6 4月 15 12:12 /backup/
1.8.1.3 启动和检查rsyncd服务
启动:
c6及以前:
rsync --daemon
c7:
systemctl start rsyncd <===开启服务
systemctl enable rsyncd <===开启开机自启动
systemctl status rsyncd <===检查服务状态
检查进程和端口:
[root@backup ~]$ ps -ef|grep sync|grep -v grep <===检查进程
root 7521 1 0 11:39 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@backup ~]$ netstat -lntup|grep 873 <===检查端口
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7521/rsync
tcp6 0 0 :::873 :::* LISTEN 7521/rsync
[root@backup ~]$ lsof -i :873 <===检查端口
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 7521 root 3u IPv4 41439 0t0 TCP *:rsync (LISTEN)
rsync 7521 root 5u IPv6 41440 0t0 TCP *:rsync (LISTEN)
1.8.1.4 配置密码文件
[root@backup ~]$ echo "rsync_backup:oldboy" > /etc/rsync.password
[root@backup ~]$ chmod 600 /etc/rsync.password
[root@backup ~]$ cat /etc/rsync.password
rsync_backup:oldboy
[root@backup ~]$ ll /etc/rsync.password
-rw------- 1 root root 20 4月 15 11:52 /etc/rsync.password
到这里rsync服务端已配置完成
1.8.2 以下操作在客户端服务器
在客户端认证密码,有两种方法:(可以二选一)
方法1:认证密码文件
[root@nfs01 ~]$ echo "oldboy" > /etc/rsync.password
[root@nfs01 ~]$ chmod 600 /etc/rsync.password
[root@nfs01 ~]$ cat /etc/rsync.password
oldboy
[root@nfs01 ~]$ ll /etc/rsync.password
-rw------- 1 root root 7 4月 15 11:55 /etc/rsync.password
方法2:配置特殊变量$RSYNC_PASSWORD
[root@nfs01 ~]$ echo ' export RSYNC_PASSWORD=oldboy' >>/etc/bashrc
[root@nfs01 ~]$ tail -1 /etc/bashrc
export RSYNC_PASSWORD=oldboy
[root@nfs01 ~]$ . /etc/bashrc
[root@nfs01 ~]$ echo $RSYNC_PASSWORD
oldboy
到这里rsync客户端 nfs01 配置完成
1.8.3 守护进程模式,客户端rsync的命令语法
配置服务器端守护进程,实现数据传输:
- 服务器端守护进程。
- 客户端执行命令。
1.8.3.1 Pull(拉):从远端拉取到本地。
语法1(常用):
rsync | [OPTION...] | [USER@]HOST::SRC... | [DEST] |
---|---|---|---|
rsync命令 | 参数选项 | [虚拟用户]@[主机地址]::[模块名] | 本地路径 |
语法2:
rsync | [OPTION...] | rsync://[USER@]HOST::SRC... | [DEST] |
---|---|---|---|
rsync命令 | 参数选项 | rsync://[虚拟用户]@[主机地址]/[模块名] | 本地路径 |
1.8.3.2 Push(推):从本地推到远端。
语法1(常用):
rsync | [OPTION...] | [DEST] | [USER@]HOST::SRC... |
---|---|---|---|
rsync命令 | 参数选项 | 本地路径 | [虚拟用户]@[主机地址]::[模块名] |
语法2:
rsync | [OPTION...] | [DEST] | rsync://[USER@]HOST::SRC... |
---|---|---|---|
rsync命令 | 参数选项 | 本地路径 | rsync://[虚拟用户]@[主机地址]/[模块名] |
1.8.4 测试成果与报错解决方法
报错1:
[root@nfs01 ~]$ rsync -avz /etc/hosts [email protected]::backup --password-file=/etc/rsync.password
@ERROR: invalid uid rsync
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
原因分析:无效的UID:rsync,需要添加用户rsync,并且发现没有/backup目录,需要创建目录,并将用户和用户组都改为rsync。
解答:
[root@backup ~]$ useradd rsync
[root@backup ~]$ id rsync
uid=1001(rsync) gid=1001(rsync) 组=1001(rsync)
[root@backup ~]$ mkdir -p /backup
[root@backup ~]$ chown -R rsync.rsync /backup/
[root@backup ~]$ ls -ld /backup/
drwxr-xr-x 2 rsync rsync 6 4月 15 12:12 /backup/
报错2:
[root@nfs01 ~]$ rsync -avz /etc/hosts [email protected]::backup --password-file=/etc/rsync.password
sending incremental file list
hosts
rsync: chgrp ".hosts.YDuTjO" (in backup) failed: Operation not permitted (1)
sent 223 bytes received 124 bytes 694.00 bytes/sec
total size is 332 speedup is 0.96
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
原因分析:/etc/rsyncd.conf文件内缺少参数,导致文件的存储属性不完整。
解答:增加如下参数到/etc/rsyncd.conf
fake super = yes <===增加的参数:不用root用户也可以存储文件的完整属性。
This allows the full attributes of a file to be stored without having to have the daemon actually running as root.
[root@backup ~]$ grep fake /etc/rsyncd.conf
fake super = yes
改完配置,要重启服务:
[root@backup ~]$ systemctl restart rsyncd
参数添加完后再测试:结果成功,没有报错
[root@nfs01 ~]$ rsync -avz /etc/hosts [email protected]::backup --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 89 bytes received 49 bytes 276.00 bytes/sec
total size is 332 speedup is 2.41
服务端检查结果:
[root@backup ~]$ ls /backup/
hosts
如果客户端按照环境变量的方式配置,则可以忽略--password-file=/etc/rsync.password参数。
[root@nfs01 ~]$ rsync -avz /etc [email protected]::backup
sending incremental file list
sent 52,071 bytes received 644 bytes 105,430.00 bytes/sec
total size is 31,244,350 speedup is 592.70
测试增量
[root@nfs01 ~]$ touch /etc/oldboy.txt
[root@nfs01 ~]$ rsync -avz /etc [email protected]::backup
sending incremental file list
etc/oldboy.txt
sent 52,098 bytes received 655 bytes 105,506.00 bytes/sec
total size is 31,244,350 speedup is 592.28
第二种语法:
[root@nfs01 ~]$ rsync -avz /etc rsync://[email protected]/backup
sending incremental file list
sent 52,070 bytes received 644 bytes 105,428.00 bytes/sec
total size is 31,244,350 speedup is 592.71