Linux---rsync服务
1.rsync 简介
rsync英文称为remote synchronization,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及曾量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
在同步数据的时候,默认情况下,rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可是实现快速的同步备份数据。
rsync官方地址:https://rsync.samba.org/
rsync监听端口:873
rsync运行模式:C/S
利用rsync还可以实现删除文件和目录的功能,这又相当于rm命令,一个rsync相当于scp、cp、rm,但是还优于他们的每一个命令。
2.rsync的特性
1.高效的增量传输:rsync使用一种称为"增量复制"的算法来传输文件,只传输源文件和目标文件之间的差异部分,从而减少数据传输量。这意味着只有修改过的文件块会被传输,大大提高了传输效率。
2.支持本地和远程同步:rsync可以在本地系统上进行文件同步,也可以通过SSH协议在远程系统之间进行安全的文件同步。
3.多种同步模式:rsync支持多种同步模式,包括从源到目标的单向同步、从目标到源的反向同步以及双向同步。可以根据需求选择适合的同步模式。
4.文件属性和权限保留:rsync默认会保留文件的所有属性和权限信息,包括文件所有者、组、时间戳、权限位等。这样可以确保在目标系统上生成与源系统完全相同的文件副本。
5.支持备份和恢复:rsync可以用于创建文件和目录的备份,并支持快速的恢复操作。通过增量传输和只复制修改部分,可以节省存储空间和传输时间。
6.通用性和可定制性:rsync可以在不同的操作系统和平台上运行,并且可以通过命令行选项进行灵活的配置和定制。可以根据需求设置传输速度、忽略特定文件或目录、排除某些文件类型等。
7.压缩传输:rsync支持数据压缩,可以在传输过程中对数据进行压缩,减小传输数据量,提高传输速度。
8.安全性:rsync可以通过SSH协议进行数据传输,确保传输的安全性和加密。
3.生产场景架构集群备份方案
1.借助cron+rsync把所有客户服务器数据同步到备份服务器。
2.针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。
3.通过本地打包备份,然后rsync结合inotify应用把全网数统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果。
4.定期将IDC机房的数据 备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。
5.实时同步,解决存储服务器等的单点问题。
4.rsync传输模式
4.1.本地模式(仅作了解)
Local: rsync [OPTION...] SRC... [DEST]
# 类似cp命令
Local: rsync [OPTION...] SRC... [DEST]
本地: rsync [参数选项] 源文件 目标文件
rsync 参数 拷贝谁 拷贝到哪里去
[root@backup ~]# touch test.txt (创建文件)
[root@backup ~]# ll (查看)
total 0
-rw-r--r-- 1 root root 0 Mar 27 09:19 test.txt
[root@backup ~]# ll /opt/
total 0
[root@backup ~]# rsync -avz test.txt /opt/ (将test文件传输到opt目录下)
sending incremental file list
test.txt
sent 87 bytes received 35 bytes 244.00 bytes/sec
total size is 0 speedup is 0.00
[root@backup ~]# ll /opt/
total 0
-rw-r--r-- 1 root root 0 Mar 27 09:19 test.txt
[root@backup ~]# mkdir test01
[root@backup ~]# touch test01/{1..2}.txt
[root@backup ~]#
[root@backup ~]# ll
total 0
drwxr-xr-x 2 root root 32 Mar 27 09:21 test01
-rw-r--r-- 1 root root 0 Mar 27 09:19 test.txt
[root@backup ~]# ll test01/
total 0
-rw-r--r-- 1 root root 0 Mar 27 09:21 1.txt
-rw-r--r-- 1 root root 0 Mar 27 09:21 2.txt
[root@backup ~]# rm -rf /opt/*
[root@backup ~]# ll /opt/
total 0
[root@backup ~]# rsync -avz test01/ /opt/
sending incremental file list
./
1.txt
2.txt
sent 152 bytes received 57 bytes 418.00 bytes/sec
total size is 0 speedup is 0.00
[root@backup ~]# ll /opt/
total 0
-rw-r--r-- 1 root root 0 Mar 27 09:21 1.txt
-rw-r--r-- 1 root root 0 Mar 27 09:21 2.txt
4.2.远程访问模式
4.2.1.下载、拉取、更新
Access via remote shell: # 远程访问模式
pull: 拉取、更新
push: 推送、上传
下载网盘的什么文件到本地的哪个位置
Pull:rsync [OPTION...] [USER@]HOST:SRC... [DEST]
1.拉取: rsync -avz 用户@主机:源文件 目标文件
2.rsync: 命令
3.USER: 用户名称 远程服务器上必须存在的用户
4.@: 分隔符
5.HOST: 主机名称 IP地址 域名
6.RSC: 下载是远程主机的什么文件
7.DEST: 下载到本地的哪里
#注意:nfs做了hosts解析
[root@backup ~]# vim /etc/hosts
10.0.0.31 nfs
[root@backup ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.31 nfs
#示例1: 在41主机上下载31家目录下的31.txt到当前目录
通过hosts主机名称下载
[root@backup ~]# rsync -avz root@nfs:/root/31.txt .
通过IP地址下载
[root@backup ~]# rsync -avz root@10.0.0.31:/root/31.txt .
#示例2:在nfs服务器下载backup服务器的hosts文件到当前
[root@nfs ~]# rsync -avz backup:/etc/hosts . (没加用户默认以当前的用户访问,当前用户为root)
[test01@nfs ~]$ rsync -avz 10.0.0.41:/etc/passwd . #(当前31服务器上用户为test01,41服务器上必须也有test01,也必须有密码 )
The authenticity of host '10.0.0.41 (10.0.0.41)' can't be established.
ECDSA key fingerprint is SHA256:gwTooDqHaO0MxbuqVfNzjsrCzFoQgcNky15oCEcvxjM.
ECDSA key fingerprint is MD5:b9:8d:1a:57:ab:7b:3e:2e:73:c0:b8:f3:e5:b8:be:c6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.41' (ECDSA) to the list of known hosts.
test01@10.0.0.41's password: # 输入的是41服务器的test01的密码 41服务器上test01用户必须存在
#注意:
1.如果不加用户默认以当前的用户为远程访问用户发起请求
2.如果当前登录的为root用户 则使用的是backup的root身份下载数据
3.如果当前登录的为test01用户 则使用的是backup的test01用户身份下载数据
4.2.2.推送、上传
Push: rsync [OPTION...] SRC... [USER@]HOST: DEST
推送: rsync -avz 源文件 用户名@主机: 目标文件
#示例: 在41服务器上推送test.txt到31家目录
[root@backup ~]# rsync -avz test.txt root@10.0.0.31:/root/
root@10.0.0.31's password:
sending incremental file list
test.txt
sent 87 bytes received 35 bytes 81.33 bytes/sec
total size is 0 speedup is 0.00
#示例: 拷贝本地41服务器的目录test01到31的家目录下
[root@backup ~]# rsync -avz test01 172.16.1.31:/root/
The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
ECDSA key fingerprint is SHA256:gwTooDqHaO0MxbuqVfNzjsrCzFoQgcNky15oCEcvxjM.
ECDSA key fingerprint is MD5:b9:8d:1a:57:ab:7b:3e:2e:73:c0:b8:f3:e5:b8:be:c6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts.
root@172.16.1.31's password:
sending incremental file list
test01/
test01/2.txt
test01/3.txt
#案例: 拷贝31的1.txt到41的家目录改名为bakcup.txt
[root@nfs ~]# rsync -avz 1.txt 172.16.1.41:/root/backup.txt (在backup服务器操作此命令)
4.3.守护进程模式
4.3.1.安装服务
1.第一步: 安装服务
[root@backup ~]# yum -y install rsync
2.第二步: 配置服务rsync
#先将/etc/rsyncd.conf里面的初始文件清空,然后保存退出,然后重新vim进入此文件 输入:set paste回车 按a进入编辑模式然后复制下面的文件内容
uid = www
gid = www
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]
path = /backup
#配置文件解析
rsync配置文件: /etc/rsyncd.conf
[root@backup ~]# cat /etc/rsyncd.conf
uid = www #运行进程的用户 (名称可以自定义)
gid = www #运行进程的用户组 (名称可以自定义)
port = 873 #监听端口
fake super = yes #无需让www以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服务用户连接认证密码文件路径 (名称可以自定义)
log file = /var/log/rsyncd.log
#####################################
[backup] #定义模块信息 (名称可以自定义)
path = /backup #定义接收备份数据目录 (目录名称可以自定义)
3.第三步: 根据配置文件创建必要的数据信息
#1)创建虚拟用户www
[root@backup ~]# useradd -M -s /sbin/nologin www
[root@backup ~]# id www
uid=1000(www) gid=1000(www) groups=1000(www)
#2)创建虚拟用户的密码文件 权限为600
[root@backup ~]# vim /etc/rsync.passwd
rsync_backup:123456
[root@backup ~]# chmod 600 /etc/rsync.passwd
[root@backup ~]# ll /etc/rsync.passwd
-rw------- 1 root root 20 Mar 27 10:44 /etc/rsync.passwd
#3)创建用户的上传数据的目录/backup 并且属主属组为www
[root@backup ~]# mkdir /backup
[root@backup ~]# ll -d /backup
drwxr-xr-x 2 root root 6 Mar 27 10:45 /backup
[root@backup ~]# ll /backup
total 0
[root@backup ~]# ll -d /backup
drwxr-xr-x 2 root root 6 Mar 27 10:45 /backup
[root@backup ~]# chown www.www /backup/
[root@backup ~]# ll -d /backup/
drwxr-xr-x 2 www www 6 Mar 27 10:45 /backup/
4.第四步: 启动服务rsync
[root@backup ~]# systemctl start rsyncd
加入开机自动运行
[root@backup ~]# systemctl enable rsyncd
# 查看端口是否启动
[root@backup ~]# netstat -tnulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1273/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1407/master
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4494/rsync
4.3.2.客户端使用
客户端使用:
Push: rsync [OPTION...] SRC... [USER@]HOST :: DEST
#上传: rsync -avz test.txt root@172.16.1.41 :: backup
#示例: 在31客户端上传/etc/hosts文件到backup模块下
[root@nfs ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
hosts
sent 159 bytes received 43 bytes 57.71 bytes/sec
total size is 177 speedup is 0.88
Access via rsync daemon: # 守护进程模式 C/S架构
Pull: rsync [OPTION...] [USER@]HOST ::SRC... [DEST]
#下载: rsync -avz root@172.16.1.41 ::模块名称 下载到本地的哪个目录
示例: 下载backup模块下的hosts到本地的/opt目录下 (在31NFS服务器上执行命令)
[root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup/hosts /opt/
注意: 如果只有模块则默认下载全部文件
[root@nfs opt]# rsync -avz rsync_backup@backup::backup .
Password:
receiving incremental file list
./
hosts
test01/
test01/2.txt
test01/3.txt
5.rsync密码管理
#密码管理:
客户端不需要每次输入密码,指定密码文件
第一种方案: 指定密码文件
第一步创建密码文件并且授权为600
[root@nfs ~]# vim /etc/rsync.pass #(密码文件名称可以自定义)
123456
[root@nfs ~]# chmod 600 /etc/rsync.pass
[root@nfs ~]# ll /etc/rsync.pass
-rw------- 1 root root 7 Mar 27 11:28 /etc/rsync.pass
第二步: 执行命令指定密码文件
rsync -avz /etc/passwd rsync_backup@backup::backup --password-file=/etc/rsync.pass
第二种方案: 使用rsync内置变量
RSYNC_PASSWORD 在客户端输入密码时候rsync会先读取此变量,如果有则使用此密码,如果没有则提示用户输入密码
[root@nfs ~]# export RSYNC_PASSWORD=123456
[root@nfs ~]# rsync -avz /etc/passwd rsync_backup@backup::backup
sending incremental file list
写入脚本:
vim test.sh
export RSYNC_PASSWORD=123456
rsync -avz /etc/passwd rsync_backup@backup::backup
[root@nfs ~]# cat test.sh
export RSYNC_PASSWORD=123456
rsync -avz /etc/passwd rsync_backup@backup::backup