备份服务-rsync
备份服务-rsync
1. 什么是rsync
Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的 "Rsync算法" 来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
Rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时Rsync server会打开一个873端口,等待客户端去连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。
Rsync的基本特点如下:
- 可以镜像保存整个目录树和文件系统;
- 可以很容易做到保持原来文件的权限、时间、软硬链接等;
- 无须特殊权限即可安装;
- 优化的流程,文件传输效率高;
- 可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接;
- 支持匿名传输。
2. rsync的基本说明
rsync的目的是实现本地主机和远程主机上的文件同步,包括本地推到远程,远程拉到本地两种同步方式,也可以实现本地不同路径下文件的同步。
Tips:不能实现远程路径1到远程路径2之间的同步
在文件同步过程中,肯定会面临这些问题,例如是否要删除源主机上没有但目标上多出来的文件,目标文件比源文件更新时是否仍要保持同步,遇到软链接时是拷贝软链接本身还是拷贝软链接所指向的文件,目标文件已存在时是否要先对其做个备份等等。
rsync同步过程中由两部分模式组成:决定哪些文件需要同步的检查模式以及文件同步时的同步模式。
检查模式是指按照指定规则来检查哪些文件需要被同步,例如哪些文件是明确被排除不传输的。默认情况下,rsync使用"quick check"算法快速检查源文件和目标文件的大小、mtime(修改时间)是否一致,如果不一致则需要传输。当然,也可以通过在rsync命令行中指定某些选项来改变quick check的检查模式,比如"--size-only"选项表示"quick check"将仅检查文件大小不同的文件作为待传输文件。rsync支持非常多的选项,其中检查模式的自定义性是非常有弹性的。
同步模式是指在文件确定要被同步后,在同步过程发生之前要做哪些额外工作。例如上文所说的是否要先删除源主机上没有但目标主机上有的文件,是否要先备份已存在的目标文件,是否要追踪链接文件等额外操作。rsync也提供非常多的选项使得同步模式变得更具弹性。
相对来说,为rsync手动指定同步模式的选项更常见一些,只有在有特殊需求时才指定检查模式,因为大多数检查模式选项都可能会影响rsync的性能。
3. rsync的三种工作模式
3.1 本地模式
本地模式的rsync相当于cp命令
rsync change_ip.sh /tmp/ #单纯的复制
3.2 远程shell模式
借助于ssh隧道传输,适用于不同的机器,和scp类似。
拉:rsync 用户@IP地址:源路径 本地路径 # 就是意思是把远程备份服务器的文件拉下来到自己的服务器
[root@backup /test]# rsync root@10.0.0.31:/rsync/456.txt /test/
推:rsync 本地路径 用户@IP地址:目标路径 # 意思就是把本地路径的文件推到远程的备份服务器
[root@backup /test]# rsync /test/test.txt root@10.0.0.31:/rsync/
3.3 守护进程模式
则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。默认主机是已经安装了的,配置文件 /etc/rsyncd.conf,根据需求去修改配置文件,自定义功能。
4. rsync的使用
其中,第一个路径参数一定是源文件路径,即作为同步基准的一方,可以同时指定多个源文件路径。最后一个路径参数则是目标文件路径,也就是待同步方。
路径的格式可以是本地路径,也可以是使用user@host:path或user@host::path的远程路径,如果主机和path路径之间使用单个冒号隔开,表示使用的是远程shell通信方式,而使用双冒号隔开的则表示的是连接rsync daemon。另外,连接rsync daemon时,还提供了URL格式的路径表述方式rsync://user@host/path。
Tips:源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身。
rsync -a /etc /tmp
rsync -a /etc/ /tmp第一个命令会在/tmp目录下创建etc目录,而第二个命令不会在/tmp目录下创建etc目录,源路径/etc/中的所有文件都直接放在/tmp目录下。
4.1 选项与说明
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。
4.2 使用示例
4.2.1 传输单个文件
将本地主机的/test目录下的test.txt推送到远程主机/rsync目录下
[root@backup /test]# rsync /test/test.txt root@10.0.0.31:/rsync/
4.2.2 传输多个文件
将本地主机的/etc目录下的hosts、hostname文件推送到远程主机/rsync目录下
[root@backup /test]# rsync /etc/hosts /etc/hostname root@10.0.0.31:/rsync/
4.2.3 传输整个目录下的文件(会创建目录)
将本地主机的/root目录(包括所有文件)推送到远程主机/rsync目录下
[root@backup /test]# rsync -r /root root@10.0.0.31:/rsync/
#远程主机查看
[root@nfs01 /rsync]# ll #创建了root目录
total 4
dr-xr-x--- 15 root root 4096 Feb 10 09:16 root
[root@nfs01 /rsync]# ll root/
total 12
-rw------- 1 root root 1776 Feb 10 09:16 anaconda-ks.cfg
-rw-r--r-- 1 root root 359 Feb 10 09:16 change_ip.sh
drwxr-xr-x 2 root root 6 Feb 10 09:16 Desktop
drwxr-xr-x 2 root root 6 Feb 10 09:16 Documents
drwxr-xr-x 2 root root 6 Feb 10 09:16 Downloads
-rw-r--r-- 1 root root 1824 Feb 10 09:16 initial-setup-ks.cfg
drwxr-xr-x 2 root root 6 Feb 10 09:16 Music
drwxr-xr-x 2 root root 6 Feb 10 09:16 Pictures
drwxr-xr-x 2 root root 6 Feb 10 09:16 Public
drwxr-xr-x 2 root root 6 Feb 10 09:16 Templates
drwxr-xr-x 2 root root 6 Feb 10 09:16 Videos
#记得rm -rf /rsync/root 以便后续测试
4.2.3 传输整个目录下的文件(不会创建root目录)
将本地主机的/root目录下的所有文件推送到远程主机/rsync目录下
[root@backup /test]# rsync -r /root/ root@10.0.0.31:/rsync/
#远程主机查看
[root@nfs01 /rsync]# ll #直接处在/rsync目录下
total 15
-rw------- 1 root root 1776 Feb 10 09:18 anaconda-ks.cfg
-rw-r--r-- 1 root root 359 Feb 10 09:18 change_ip.sh
drwxr-xr-x 2 root root 6 Feb 10 09:18 Desktop
drwxr-xr-x 2 root root 6 Feb 10 09:18 Documents
drwxr-xr-x 2 root root 6 Feb 10 09:18 Downloads
-rw-r--r-- 1 root root 1824 Feb 10 09:18 initial-setup-ks.cfg
drwxr-xr-x 2 root root 6 Feb 10 09:18 Music
drwxr-xr-x 2 root root 6 Feb 10 09:18 Pictures
drwxr-xr-x 2 root root 6 Feb 10 09:18 Public
drwxr-xr-x 2 root root 6 Feb 10 09:18 Templates
drwxr-xr-x 2 root root 6 Feb 10 09:18 Videos
4.2.4 拉取远程主机文件
将/etc/hosts文件拉取到本地主机/test目录
[root@backup /test]# rsync root@10.0.0.31:/etc/hosts /test/
4.2.5 使用相对路径(-R)
将/etc/cron.d目录推送有远程主机/rsync下,在/rsync下也生成etc子目录。
[root@backup /test]# rsync -R -r /etc/cron.d root@10.0.0.31:/rsync/
#远程主机查看
[root@nfs01 /rsync]# tree
.
└── etc
└── cron.d
├── 0hourly
├── raid-check
└── sysstat
2 directories, 3 files
如果要推送的源路径较长,但只想在目标主机上保留一部分目录结构,例如要推送/var/log/anaconda/*到远程主机/rsync下,但只想在远程主机/rsync下保留从log开始的目录,如何操作?使用一个点代表相对路径的起始位置即可,也就是将长目录进行划分。
[root@backup /test]# rsync -R -r /var/./log/anaconda/* root@10.0.0.31:/rsync
#远程主机查看
[root@nfs01 /rsync]# tree
.
└── log
└── anaconda
├── anaconda.log
├── ifcfg.log
├── journal.log
├── ks-script-5QUyxv.log
├── ks-script-7LrpEu.log
├── packaging.log
├── program.log
├── storage.log
├── syslog
└── X.log
2 directories, 10 files
#这样,从点开始的目录都是相对路径,其相对根目录为目标路径。所以对于上面的示例,将在目标上创建/rsync/log/anaconda/*。
4.2.6 复制目录,保持属性不变(-a)
执行-a就相当于执行 -rlptgoD
[root@backup /test]# rsync -a /root root@10.0.0.31:/rsync/
4.2.7 显示执行过程(-v)
将/etc/cron.d目录推送有远程主机/rsync下,在/rsync下也生成etc子目录,同时显示执行的过程。
[root@backup /test]# rsync -R -r -v /etc/cron.d root@10.0.0.31:/rsync/
root@10.0.0.31's password:
sending incremental file list
/etc/
/etc/cron.d/
/etc/cron.d/0hourly
/etc/cron.d/raid-check
/etc/cron.d/sysstat
sent 753 bytes received 85 bytes 335.20 bytes/sec
total size is 471 speedup is 0.56
4.2.8 对数据进行压缩、限速并显示传输速度(-z -P --bwlimit)
-z 数据压缩
-P 显示传输速度
--bwlimit 默认为kb,可以M、G定义
由于备份的时候rsync不限速,如果备份大文件他会把整个服务器带宽占满,整个时候可能会影响到别的业务所以要进行限速,并且在流量低峰的时候来备份。
现在本地主机使用dd命令进行创建大文件dd if=/dev/zero of=/test/big-file bs=1M count=500
[root@backup /test]# rsync -av -P --bwlimit=100 /test/big-file root@10.0.0.31:/rsync/
root@10.0.0.31's password:
sending incremental file list
big-file
2,392,064 0% 100.04kB/s 1:26:56
[root@backup /test]# rsync -av -P --bwlimit=1M /test/big-file root@10.0.0.31:/rsync/
root@10.0.0.31's password:
sending incremental file list
big-file
5,275,648 1% 1.00MB/s 0:08:26
[root@backup /test]# rsync -av -P --bwlimit=1G /test/big-file root@10.0.0.31:/rsync/
root@10.0.0.31's password:
sending incremental file list
big-file
524,288,000 100% 78.25MB/s 0:00:06 (xfr#1, to-chk=0/1)
sent 524,416,087 bytes received 35 bytes 55,201,697.05 bytes/sec
total size is 524,288,000 speedup is 1.00
4.2.9 同步传输(--delete)
以源主机为主,对目的主机进行同步。多则删之,少则补之。
#目的主机,目前只有一个文件
[root@nfs01 /rsync]# touch nfs01.txt
[root@nfs01 /rsync]# ll
total 0
-rw-r--r-- 1 root root 0 Feb 10 10:11 nfs01.txt
#源主机执行推送/etc/cron.d/*中所有文件
[root@backup /test]# rsync -av --delete /etc/cron.d/ root@10.0.0.31:/rsync/
root@10.0.0.31's password:
sending incremental file list
#执行过程如下,删了nfs01.txt,然后将/etc/cron.d/*下的文件推送
deleting nfs01.txt
./
0hourly
raid-check
sysstat
sent 710 bytes received 89 bytes 319.60 bytes/sec
total size is 471 speedup is 0.59
#在/etc/cron.d/目录下创建test.txt文件
[root@backup /test]# touch /etc/cron.d/test.txt
#再次推送,只传送了test.txt
[root@backup /test]# rsync -av --delete /etc/cron.d/ root@10.0.0.31:/rsync/
root@10.0.0.31's password:
sending incremental file list
./
test.txt
sent 176 bytes received 38 bytes 85.60 bytes/sec
total size is 471 speedup is 2.20
#目标主机查看
[root@nfs01 /rsync]# ll
total 12
-rw-r--r-- 1 root root 128 Aug 8 2019 0hourly
-rw-r--r-- 1 root root 108 Sep 30 2020 raid-check
-rw------- 1 root root 235 Dec 15 11:20 sysstat
-rw-r--r-- 1 root root 0 Feb 10 10:15 test.txt
5. 守护进程模式
5.1 模式概述
守护进程:持续运行的进程,也可以叫做服务。
服务一般分为:服务端与客户端。
服务端:linux服务器上运行的各种服务软件。
客户端:linux中的客户端可能是一个命令,也可能是app,小程序等等。
5.2 一般流程和其他模式的区别
守护进程模式的一般流程图,客户端统一推送到服务端。
rsync守护进程模式与rsync远程模式区别
1.远程模式
- 用户每次输入用户名密码
- 需要系统存在的可登陆用户
- 每个用户都可以使用
- 一般用于临时传输数据(scp/rsync)
2.守护进程模式
- 通过配置文件设置密码
- 通过配置文件设置用户和密码
- 可以通过配置控制ip、网段
- 可以与定时任务配合定时传输数据
5.3 rsync守护进程模式快速实战指南
主机 | IP |
---|---|
服务端backup | 10.0.0.41 |
客户端nfs01 | 10.0.0.31 |
5.3.1 配置服务端
5.3.1.1 修改rsync.conf配置文件
选项注释
#以下为全局配置
fake super = yes #如果不开启,则C7传输报错
uid = rsync #rsync运行用户(虚拟用户)
gid = rsync
use chroot = no
max connections = 200 #最大连接数
timeout = 300 #连接超时时间
pid file = /var/run/rsyncd.pid #存放服务的pid号
lock file = /var/run/rsync.lock #进程/服务的锁文件,防止重复运行
log file = /var/log/rsyncd.log #rsync服务端日志
ignore errors #忽略错误
read only = false #可以进行读写
list = false #关闭rsync服务端列表功能
#hosts allow = 172.16.1.0/24 #只允许哪些ip或者网段访问,白名单
#hosts deny = 0.0.0.0/32 #拒绝哪些ip或者网段访问
auth users = rsync_backup #rsync服务端进行验证用户,用户名
secrets file = /etc/rsync.password #rsync服务端用于验证:密码文件
#局部(模块)
[data] #模块名字,用户访问客户端的时候指定
comment = "backup dir by yinjay" #注释说明
path = /data #模块对应的目录
无选项注释,直接可复制到文件去
fake super = yes
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
ignore errors
read only = false
list = false
#hosts allow = 172.16.1.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[data]
comment = "backup dir by yinjay"
path = /data
5.3.1.2 创建虚拟用户
[root@backup ~]# useradd -s /sbin/nologin -M rsync
[root@backup ~]# id rsync
uid=1001(rsync) gid=1001(rsync) groups=1001(rsync)
5.3.1.3 创建密码文件
#创建密码文件
[root@backup ~]# echo 'rsync_backup:1' > /etc/rsync.password
#修改权限
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# ll /etc/rsync.password
-rw------- 1 root root 15 Feb 10 22:35 /etc/rsync.password
5.3.1.4 创建模块目录
#创建目录
[root@backup ~]# mkdir -p /data
#修改所有者
[root@backup ~]# chown rsync.rsync /data/
[root@backup ~]# ll -d /data/
drwxr-xr-x 2 rsync rsync 6 Feb 10 22:37 /data/
5.3.1.5 查看服务并启动
#查看服务状态
[root@backup ~]# systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
#启动rsync服务
[root@backup ~]# systemctl start rsyncd
#再次查看服务状态
[root@backup ~]# systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2023-02-10 22:40:22 EST; 1s ago
Main PID: 29764 (rsync)
Tasks: 1
CGroup: /system.slice/rsyncd.service
└─29764 /usr/bin/rsync --daemon --no-detach
Feb 10 22:40:22 backup systemd[1]: Started fast remote file copy program daemon.
#设置开机自启动
[root@backup ~]# systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
#检查进程,端口
[root@backup ~]# ps -ef | grep rsync
root 29764 1 0 11:40 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
root 32165 21826 0 11:47 pts/2 00:00:00 grep --color=auto rsync
[root@backup ~]# ss -lntup | grep rsync
tcp LISTEN 0 5 *:873 *:* users:(("rsync",pid=29764,fd=3))
tcp LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=29764,fd=5))
5.3.1.6 测试服务端
#rsync -avz 文件/目录 验证用户@ip::模块名字
[root@backup ~]# rsync -avz /etc/hostname rsync_backup@10.0.0.41::data
Password:
sending incremental file list
hostname
sent 102 bytes received 43 bytes 96.67 bytes/sec
total size is 7 speedup is 0.05
#查看是否传送成功,Ok!
[root@backup ~]# ll /data/
total 4
-rw-r--r-- 1 rsync rsync 7 Feb 10 16:25 hostname
5.3.1.7 故障排错
1.看命令行提示,大概定位问题。
2.查看/var/log/rsyncd.log,/var/log/messages是否有相关错误日志,重点关键字看error、err、failed
3.找不出,再排查流程与搭建流程一致,重新检查每一个步骤。
常见错误:https://blog.csdn.net/qq_38483583/article/details/123608484
5.3.2 配置客户端
5.3.2.1 测试客户端传送到服务端
#测试在客户端是否能传送到服务端
[root@nfs01 ~]# echo test > test_rsync.txt
[root@nfs01 ~]# cat test_rsync.txt
test
[root@nfs01 ~]# rsync -avz test_rsync.txt rsync_backup@10.0.0.41::data
Password:
sending incremental file list
test_rsync.txt
sent 106 bytes received 43 bytes 99.33 bytes/sec
total size is 5 speedup is 0.03
#服务端data模块定义的路径为/data,查看没有问题!
[root@backup ~]# ll /data/
total 8
-rw-r--r-- 1 rsync rsync 7 Feb 10 16:25 hostname
-rw-r--r-- 1 rsync rsync 5 Feb 11 12:52 test_rsync.txt
[root@backup ~]# cat /data/test_rsync.txt
test
5.3.2.2 配置密码文件
配置密码文件主要是用于不用再次手动输入密码
#创建密码文件并赋予权限
[root@nfs01 ~]# echo '1' >/etc/rsync.pass
[root@nfs01 ~]# chmod 600 /etc/rsync.pass
[root@nfs01 ~]# cat /etc/rsync.pass
1
[root@nfs01 ~]# ll /etc/rsync.pass
-rw------- 1 root root 2 Feb 11 12:57 /etc/rsync.pass
#使用密码文件链接rsync服务端,不会提示输入密码
[root@nfs01 ~]# rsync -avz /var/log/messages rsync_backup@10.0.0.41::data --password-file=/etc/rsync.pass
sending incremental file list
messages
sent 113,536 bytes received 43 bytes 75,719.33 bytes/sec
total size is 815,242 speedup is 7.18