rsync同步数据

安装rsync

OS声明: Centos7

# 安装rsync
yum -y install rsync  

# 设置服务开机自启并现在启动
## 守护进程模式适合使用rsync独立用户名和密码 认证
## ssh免密传输可以不需要守护进程
systemctl enable --now rsyncd.service

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

配置服务端

vim /etc/rsyncd.conf

基本配置方案

# 设置运行rsync 进程的用户
uid = root                              
gid = root

# 指定非标准端口,默认TCP/873
# port = 874

# 将指定的目录作为根目录,限制了进程的访问范围
# 默认为true,修改为no,增加对目录文件软连接的备份 
use chroot = no
# 指定允许的最大连接数,0为不限制
max connections = 4

# 同步过程中忽略出现的错误
ignore errors = yes

# 同步过程中忽略不可读的文件,并继续执行同步操作
ignore nonreadable = yes     

# 要排除的文件或目录
## 排除lost+found/
## lost+found/是自动生成的损坏文件和目录的碎片
exclude = lost+found/

# 指定日志文件
log file = /var/log/rsyncd.log     

# CentOS7中yum安装不需指定pid file 否则报错
# pid file = /var/run/rsyncd.pid        

# 此文件定义完成后系统会自动创建
lock file=/var/run/rsyncd.lock
# 反向DNS查询
reverse lookup = no
# 启用传输日志记录
transfer logging = yes
# 指定 rsync 连接的超时时间(s)
timeout = 900

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

# ************安全配置***********
# 指定允许访问 rsync 服务器的主机或网段
hosts allow = 10.0.0.0/24
# 不允许哪些主机或网段连接
hosts deny = 0.0.0.0/24
# 列出rsync模块列表
## false 禁止列出模块列表
list = false

# 每个模块名称对应一个不通的path目录,如果名称重复,后一个生效
[backup]
# 对备份模块的注释或说明
comment = mysql数据备份
# 指定要备份的路径
path = /data/mysql/backup

# 是否只读(默认yes)
read only = no

# 只授权指定用户访问backup模块
# 认证的用户名与系统帐户无关,在认证文件做配置
## 默认没有这行则表明是匿名用户访问rsync服务器
auth users = rsyncuser

# 指定密码认证文件,格式(虚拟用户名:密码)
secrets file = /etc/rsync.pas

指定了用户后要手动创建用户

如果手动指定uidgid检查本地是否存在该用户不存在则需要手动创建用户

# 创建rsync用户
## -s 指定用户的shell
## -M 不要自动建立用户的登入目录。
useradd -s /sbin/nologin rsync -M

在这里插入图片描述


生成rsync认证文件

# 创建认证用户
## 账号和密码以:隔开
echo "rsyncuser:pas123" > /etc/rsync.pas

# 设置600权限--必须修改权限
chmod 600 /etc/rsync.pas

修改完配置重启服务端

# 设置服务器配置文件600权限
chmod 600 /etc/rsyncd.conf

# 重启服务端
systemctl restart rsync

配置客户端

# 创建认证用户
## 账号和密码以:隔开
echo "rsyncuser:pas123" > /etc/rsync.pas

# 设置600权限--必须修改权限
chmod 600 /etc/rsync.pas

客户端测试访问

# 查看远程rsync服务器的模块信息
## 如果带有密码,需要账号密码写入:/etc/rsync.pas
rsync rsync://${rsync服务器ip}

在这里插入图片描述

# 查看带密码验证的远程rsync服务器的模块内容
rsync rsync://${rsync用户名}@${rsync服务器ip}/${模块名}

在这里插入图片描述


非交互式查看共享目录

# 手动指定密码文件
rsync --password-file=/etc/rsync.pas rsync://${rsync用户名}@${rsync服务器ip}/${模块名}

rsync客户端测试同步数据

# 本地目录同步到远程rsync服务器
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## --delete 删除那些接收端还有而发送端已经不存在的文件
rsync -avz --delete --password-file=/etc/rsync.pas /localdata/www/ ${rsync用户名}@${rsync服务器ip}::${模块名}

# 将远程rsync服务器上的模块同步到本地目录 
rsync -avz --delete --password-file=/etc/rsync.pas ${rsync用户名}@${rsync服务器ip}::${模块名} /localdata/www/

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

建议先设置ssh免密

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

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-b --backup:当有变化时,对目标目录中的旧版文件进行备份
-v, --verbose 详细模式输出
-r, --recursive 对子目录以递归模式处理。同步目录的时候要加上这个参数
-u, update 只同步源文件中更新时间较新的文件
–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错误也进行删除,忽略错误


rsync常用操作


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

-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/ /要清空的目录/

清除目标目录的文件–将空目录备份到目标目录

注意:$srcDir结尾不要使用/$desDir结尾要使用/

## -a 以归档模式同步文件,等同于-r、-l、-p、-t、-g、-o选项的组合
## -v 显示详情
## -z 使用压缩
rsync -avz $srcDir $desDir/

Linux删除大文件

# 重定向到 Null 来清空文件内容
> access.log

# 将空字符串的内容重定向到文件
echo > access.log

# 将文件的大小设定为0
truncate -s 0 access.log

# 设定文件大小为26M
# truncate -s 26M access.log

同步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脚本内容如下:

项目地址:https://github.com/omaidb/qiaofei_notes/blob/main/shell_code/other/xsync

# 下载最新脚本
wget -c https://raw.githubusercontent.com/omaidb/qiaofei_notes/main/shell_code/other/xsync

需要两端机器安装rsync,否则会报错。

#!/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/
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值