zl程序教程

您现在的位置是:首页 >  其他

当前栏目

rsync同步数据

同步数据 Rsync
2023-09-14 09:15:54 时间

安装rsync

OS声明: Centos7

# 安装rsync
yum -y install rsync  

# 设置服务开机自启并现在启动
systemctl enable --now rsyncd.service

#检查是否已经成功启动
## rsync的服务端口是TCP/873
netstat -tunlp|grep 873

配置服务端

# 编辑配置文件
vim /etc/rsyncd.conf

基本配置方案

# 设置运行rsync 进程的用户
uid = root                              
gid = root
use chroot = no
max connections = 4
# CentOS7中yum安装不需指定pid file 否则报错
# pid file = /var/run/rsyncd.pid        

# 此文件定义完成后系统会自动创建
lock file=/var/run/rsyncd.lock
log file = /var/log/rsyncd.log     

exclude = lost+found/
transfer logging = yes
timeout = 900
# 同步时跳过没有权限的目录
ignore nonreadable = yes         

# 传输时不压缩的文件
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

修改完配置重启服务端

# 重启服务端
systemctl restart rsync

常用参数–Windows版可能不支持

建议先设置ssh免密

参考: https://www.cnblogs.com/wclwcw/p/8242695.html
https://article.itxueyuan.com/46mBPw

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-b --backup:当有变化时,对目标目录中的旧版文件进行备份
-v, --verbose 详细模式输出
-r, --recursive 对子目录以递归模式处理。同步目录的时候要加上这个参数
–copy-unsafe-links:拷贝指向SRC路径目录树以外的链接文件
–safe-links:忽略指向SRC路径目录树以外的链接文件(默认)
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
-z, --compress 对备份的文件在传输时进行压缩处理
-q ––quiet:精简输出模式
-h ––human-readable:输出文件大小使用易读的单位(如,K,M等)
-n ––dry-run:显示哪些文件将被传输
–stats 给出某些文件的传输状态
–timeout=TIME 同步过程中,IP超时时间,单位为秒
–ignore-existing:忽略那些已经存在于接收端的文件,仅备份那些新创建的文件
–exsiting:仅仅更新那些已经存在于接收端的文件,而不备份那些新创建的文件
–exclude=pattern:指定排除一个不需要传输的文件匹配模式
–exclude-from=file:从file中读取排除规则
–include=file:指定需要传输的文件匹配模式
–include-from=file:从file中读取包含规则
–backup-dir=dir:与 -b 结合使用,将备份的文件存到 DIR 目录中
–link-dest=dir:当文件未改变时基于DIR创建硬链接文件
––list-only:仅仅列出文件而不进行复制
––rsyncpath=PROGRAM:指定远程服务器上的 rsync 命令所在路径
–port=PORT 指定其他的rsync服务端口
–log-format=formAT 指定日志文件格式
––password-file=FILE:从 FILE 中读取口令,以避免在终端上输入口令,通常在 cron 中连接 rsync 服务器时使用
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-4 ––ipv4:使用 IPv4
-6 ––ipv6:使用 IPv6
–version 打印版本信息
––help:显示帮助信息


保持权限相关参数

-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-t --times 保持文件时间信息

-P: 断点续传并打印过程,等价于 ––partial ––progress
–partial:保留那些因故没有完全传输的文件,以是加快随后的再次传输
–progress 打印同步的过程

-S --sparse 将空序列变成稀疏块
-l, --links 保留软链结,加上这个参数,同步过来的文件会保持之前的软链接属性不变
-H, --hard-links 保留硬链结
-D:保持设备文件和特殊文件 (super-user only)


删除相关参数

–dirs -d 不递归传输目录
–delete 删除那些接收端还有而发送端已经不存在的文件。这个是rsync做增量方式的全备份的最佳选择方案!!!!!!
–delete-before 接收者在传输之前进行删除操作 (默认)。即先将目标目录中文件全部删除,再将源目录文件拷贝过去。这是rsync保持目标目录跟源目录一致的方案!!!
–delete-during:接收者在传输过程中进行删除操作
–delete-after 在同步操作之后做比较,删除那些目标目录中有而源目录中没有的多余文件
–delete-excluded 删除目标目录中那些被该选项指定排除的文件
–delay-updates:将正在更新的文件先保存到一个临时目录(默认为 “.tmp”),待传输完毕再更新目标文件
–ignore-errors 即使出现IO错误也进行删除,忽略错误


本机中的两个目录同步(最常用)

-a参数会保持文件权限属性
本地备份可以用-aP参数

# 本机中的两个目录进行同步
## -a 递归同步、保留符号链接、保留权限、保留时间戳、保留所有者和组
## -P:等价于 ––partial ––progress,断点续传并打印过程

rsync -aP /源目录/ /root/目的地目录/

将本地文件拷贝到远程主机

如果是内网传输,不要使用-z参数来压缩,会严重影响传输速度

# 将本机文件同步到远程机
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理 
## -P:等价于 ––partial ––progress,断点续传并打印过程
rsync -avzP local.file 192.168.1.22:/path/to/local.file

将远程主机上的文件拷贝到本地

如果是内网传输,不要使用-z参数来压缩,会严重影响传输速度

# 将远程主机上的文件同步到本地
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
rsync -avzP 192.168.1.22:/path/to/local.file /data

从远程同步到本地,并删除目标目录比源目录多余的文件

# 从远程同步到本地,并删除目标目录比源目录多余的文件
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件
## -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步 
rsync -avzP --delete -e 'ssh -p port' root@[$Remote_Host]:[$Remote_Dir] [$Local_Dir]

scp断点续传–Windows需要使用msys2

https://blog.csdn.net/omaidb/article/details/125937221

# 传输大文件到远端主机
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -r, 递归,传输目录时使用
## -t, ––times:保持文件时间信息
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件,增量备份时使用
rsync -avzrtP --delete --rsh=ssh localfile root@130.10.0.65:/tmp/

rsync快速清空目录下的大量文件

参考: https://www.361way.com/rsync-fast-del-file/4681.html
https://www.jianshu.com/p/b9519e589f62
https://juejin.cn/post/6844903766366371854
rsyncrm删除快的原因:

  • rm删除内容时,将目录的每一个条目逐个删除(unlink),需要循环重复遍历很多次;
  • rsync删除内容时,建立好新的空目录,替换掉老目录,不需要进行大量的遍历操作。

必须要有指定一个空目录

!!!不要忘记目录后的/

# 先建立一个空白目录
mkdir /tmp/empty

清除目标目录的文件–会丢失目录原权限—常用

原理是用空目录替换要删掉的目录

# 清空目录,目标目录的权限会和变成源目录的权限一样
## -d 不递归传输目录
## -v 详细输出模式
## -delete-before 接收者在传输之前进行删除操作

# rsync -dv --delete-before 空白目录/ 要清空的目录/
rsync -dv --delete-before /tmp/empty/ /要清空的目录/

清除目标目录的文件,并保持之前的目录权限

# 清除目标目录的文件,并保持之前的目录权限
## --delete 删除那些接收端还有而发送端已经不存在的文件
## -d --dirs  不递归传输目录
## -l 保持软链接
## -p 保持权限
## -t  ––times:保持文件时间信息
## -o, --owner 保持文件属主信息 
## -g, --group 保持文件属组信息
## -H, --hard-links 保留硬链结
## -D:保持设备文件和特殊文件 (super-user only)
rsync --delete -dlptogHD /tmp/empty/ /要清空的目录/

同步yum源到内网

# 开始同步Centos7的docker-ce源
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件,增量备份时使用
## --exclude=debug:指定排除不需要debug

rsync -avzP --delete --exclude=debug rsync://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/ .\7\x86_64\stable\

Windows版rsync不能使用ssh

参考: https://blog.miniasp.com/post/2021/12/15/How-to-use-Rsync-with-OpenSSH-for-Windows
Windowsrsync必须使用cwRsync內附的ssh.exe才可以传输.不知道这是一个bug,还是一个特色.
建议还是使用msys2安装rsync吧,


使用xsync脚本优化同步

xsync脚本放在~/bin目录下,并赋予可执行权限

# 创建~/bin目录
mkdir ~/bin

# 创建xsync脚本
touch ~/bin/xsync

# 赋予xsync可执行权限
chmod +x ~/bin/xsync

# 查看能否检查得到xsync命令
which xsync

在这里插入图片描述
添加要同步的主机

vim ~/xsync.txt

在这里插入图片描述

xsync脚本内容如下:

#!/usr/bin/env bash

# 0.依赖包检查
which rsync >>/dev/null 2>&1 || yum install -y rsync || apt install -y rsync
ls ~/xsync.txt &>/dev/null || touch ~/xsync.txt
# 1.判断参数个数,没有参数就会退出
## $#:获取参数个数,-lt 1:减1
if [ $# -lt 1 ]; then
    # 打印使用示例
    echo "必需有一个参数"
    echo "使用示例: xsync 目录"
    echo "意思是将指定目录同步到远程目录"
    exit
fi

# 2. 遍历所有服务器
# ******************注意:for循环这里,需要根据情况将机器列表改成相应的主机名******************

for host in $(cat ~/xsync.txt); do
    echo =======当前主机: "$host"=================
    # 3. 遍历所有目录并发送
    # $@: 获取所有参数
    echo ****************** 以列表形式显示所有的输入参数: "$@" ******************
    for file in "$@"; do
        # 4. 判断文件是否存在
        if [ -e "$file" ]; then
            # 5. 获取父目录
            pdir=$(
                cd -P $(dirname "$file") || exit
                pwd
            )
            echo ------父亲目录是: "$pdir"------
            # 6. 获取当前文件名
            fname=$(basename "$file")
            echo ----------------当前文件:"$fname"-----------
            # 在目标主机上创建父目录
            ssh "$host" "mkdir -p $pdir"               
            ## -a 表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
            ## -S 将空序列变成稀疏块
            ## -H 保留硬链结
            ## -P 断点续传并打印过程,
            rsync -aSHP "$pdir"/"$fname" "$host":"$pdir" # rsync同步文件到远程目录
        else
            echo "$file" 文件不存在!
        fi
    done
done

以调试模式运行

# 调试脚本
bash -xv ~/bin/xsync /usr/java/