• Rsync数据备份工具


    Rsync数据备份工具

    1、Rsync基本概述

    rsync是一款开源的备份工具,可以在不同主机之间进行同步(windows和Linux之间 Mac和 Linux Linux和Linux),可实现全量备份与增量备份,因此非常适合用于架构集中式备份或异地等应用。

    rsync官方地址https://rsync.samba.org/

    rsync监听端口:873

    rsync运行架构:
    C/S Client/Server
    B/S Browser/Server

    rsync常见的两种备份方式

    • 完全备份
      • 将数据全部备份
    • 增量备份
      • 基于上一次备份,新增部分的数据备份

    示例:

    假设客户端上有file1 file2 file3文件,服务端上有file1文件,现要将客户端上的数据备份至服务端

    img

    完全备份,将客户端所有的数据内容file1、file2、file3全部备份至服务端 (效率低下, 占用空间)

    img

    增量备份,将客户端的file2、file3增量备份至服务端 (提高备份效率,节省空间, 适合异地备份 )

    2、Rsync应用场景

    2.1 数据推送(上传)

    所有主机推送本地数据至Rsync备份服务器,这样会导致数据同步缓慢(适合少量数据备份)

    img

    2.2 数据拉取(下载)

    rsync备份服务端拉取所有主机上的数据,这样操作会导致备份服务器压力比较大(适合较少服务器场景)

    img

    2.3 大量服务器备份场景

    img

    2.4 异地备份实现思路

    img

    3、Rsync传输模式

    Rsync大致使用三种主要的数据传输方式

    本地方式
    远程方式
    守护进程

    3.1 rsync命令选项

    -a	//归档模式传输,等于-tropglD
    -v	//详细模式输出,显示速率,文件数量等
    -z	//传输时进行压缩,提高效率
    -r	//递归传输,传输目录,传输目录时目录名称后加"/"表示传输目录下的所有文件
    -t	//保持文件时间信息
    -o	//保持文件属主信息
    -g	//保持文件属组信息
    -p	//保持文件权限
    -l	//保留软链接
    -D	//保持设备文件信息
    -P	//显示同步的过程及传输时的进度等信息
    -L	//保留软连接指向的目标文件
    --delete		//让目标目录和源目录数据保持一致
    --bwlimit		//限速传输
    --exclude=PATTERN	//指定排除不需要传输的文件模式
    --exclude-from=FILE	//排除FILE中指定模式的文件
    

    3.2 本地模式

    适用单个主机之间的数据传输(类似于cp命令)

    具体用法如下:

    Local: rsync [OPTION...] SRC... [DEST]
    
    rsync [选项] 源文件.. 目标路径
    

    3.3 远程模式

    基于ssh通道传输(类似scp命令)

    注意:rsync借助ssh协议同步数据存在一些缺陷问题

    • 使用系统用户(不安全)
    • 使用普通用户(会导致权限不足的情况)

    具体用法如下:

    Access via remote shell:
    Pull: 拉 rsync [OPTION...] [USER@]HOST:SRC... [DEST]
    Push: 推 rsync [OPTION...] SRC... [USER@]HOST:DEST
    
    拉:rsync [选项] [用户@]主机IP:文件路径 本机目录
    推:rsync [选项] 本机文件 [用户@]主机IP:目录
    

    3.4 守护进程模式

    Access via rsync daemon:
    Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
    Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
    
    拉:rsync [选项..] [用户名@]主机IP::配置文件中的模块名 本机目录
    推:rsync [选项..] 本机文件 [用户名@]主机IP::配置文件中的模块名
    

    4、Rsync服务实践

    主机名 IP 角色
    server 192.168.111.30 rsync服务端
    client 192.168.111.40 rsync客户端

    4.1 服务端配置

    # 1.安装rsync
    [root@server ~]# yum install -y rsync
    
    # 2.修改服务配置文件/etc/rsyncd.conf
    [root@server ~]# vim /etc/rsyncd.conf
    uid = rsync		        #运行服务的用户
    gid = rsync		        #运行服务的组
    port = 873		        #服务监听端口
    fake super = yes		#服务无需使用root用户身份,即可接收文件的完整属性
    use chroot = no			#禁锢目录,不允许获取root权限
    max connections = 4	        #最大连接数,最多能有多少个客户端跟服务端的873端口建立连接
    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]		                # 模块名
    comment = welcome to oldboyedu backup!	# 模块的描述信息
    path = /backup		                # 数据存放目录
    
    # 3.创建用户以及数据存放目录
    [root@server ~]# useradd -r -M -s /sbin/nologin rsync
    [root@server ~]# mkdir /backup
    [root@server ~]# chown -R rsync.rsync /backup
    
    # 4.创建虚拟用户密码文件并设置权限
    [root@server ~]# vim /etc/rsync.passwd
    rsync_backup:passwd123
    [root@server ~]# chmod 600 /etc/rsync.passwd
    
    # 5.关闭防火墙、selinux
    [root@server ~]#systemctl status firewalld.service 
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
       Active: inactive (dead)
         Docs: man:firewalld(1)
    
    # 6.重启服务并设置服务开机自启
    [root@server ~]# systemctl restart rsyncd
    [root@server ~]# systemctl enable rsyncd
    
    # 7.检查服务端口是否开启
    [root@server ~]# ss -anltup | grep "rsync"
    tcp   LISTEN 0      5            0.0.0.0:873       0.0.0.0:*    users:(("rsync",pid=2320,fd=3))
    tcp   LISTEN 0      5               [::]:873          [::]:*    users:(("rsync",pid=2320,fd=5))
    

    4.2 客户端配置

    # 1.安装rsync
    [root@client ~]# yum -y install rsync
    
    # 2.配置传输密码
    ---方法1:将密码写入文件
    [root@client ~]# echo 'passwd123' > /etc/rsync.pass
    [root@client ~]# cat /etc/rsync.pass
    passwd123
    [root@client ~]# chmod 600 /etc/rsync.pass
    
    --测试收发数据:
    [root@client ~]#rsync -avz --password-file=/etc/rsync.pass /root/file1 rsync_backup@192.168.111.30::backup
    sending incremental file list
    file1
    
    sent 87 bytes  received 43 bytes  260.00 bytes/sec
    total size is 0  speedup is 0.00
    
    [root@server ~]# ls /backup/
    file1
    
    ---方法2:使用密码环境变量RSYNC_PASSWORD
    [root@client ~]# export RSYNC_PASSWORD='passwd123'
    
    --测试收发数据:
    [root@client ~]# touch file2
    [root@client ~]#rsync -avz /root/file2 rsync_backup@192.168.111.30::backup
    sending incremental file list
    file2
    
    sent 88 bytes  received 43 bytes  87.33 bytes/sec
    total size is 0  speedup is 0.00
    
    [root@server ~]# ls /backup/
    file1 file2
    

    4.3 设置systemctl 管理 rsync 服务

    # 1.创建/etc/sysconfig/rsyncd 文件
    [root@server ~]#vim /etc/sysconfig/rsyncd 
    OPTIONS=""
    
    # 2. 创建rsyncd.service 文件
    [root@server ~]#vim /lib/systemd/system/rsyncd.service
    [Unit]
    Description=fast remote file copy program daemon
    
    [Service]
    EnvironmentFile=/etc/sysconfig/rsyncd
    ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf --no-detach
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=30s
    
    [Install]
    WantedBy=multi-user.target
    

    4.4 报错信息

    # 用户密码认证失败
    [root@client ~]#rsync -avz --password-file=/etc/rsync.pass /root/file1 rsync_hzz@192.168.111.30::backup
    @ERROR: auth failed on module backup
    rsync error: error starting client-server protocol (code 5) at main.c(1661) [sender=3.1.3]
    ## 原因:
    1.用户输入错误
    2.密码输入错误
    3.密码文件的权限不是600
    4.传输的文件不存在
    
    [root@client ~]# rsync -avz /etc/passwd rsync_backup@192.168.111.30::backup
    rsync: failed to connect to 192.168.111.30 (192.168.111.30): No route to host (113)
    rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.3]
    无法和192.168.111.30rsync服务建立连接
    ## 原因:
    1.防火墙
    2.selinux
    3.服务没启动
    4.服务的端口改了
    

    4.5 排错思路

    ## 服务端
    # 1.检查配置文件
    [root@server ~]# cat /etc/rsyncd.conf
    
    # 2.检查密码文件的权限
    [root@server ~]#ll /etc/rsync.passwd
    -rw-------. 1 root root 23 9月   2 16:30 /etc/rsync.passwd
    
    # 3.检查密码文件中的内容
    检查用户名是否和配置文件中的用户名一致
    
    # 4.检查模块目录的权限
    模块目录的权限,必须是rsync配置文件中指定的uid和gid的权限
    
    ## 客户端
    # 1.检查命令用户名
    命令中的用户名要跟服务端配置文件和密码文件中的用户名一致 rsync_backup
    
    # 2.检查命令模块名
    命令中的模块名要跟服务端配置文件中的模块名一致 backup
    
    # 3.如果有密码文件,检查权限
    600 root root
    
    # 4.检查密码文件内容
    只需要写密码
    
    # 5.检查环境变量中的密码
    [root@server ~]# echo $RSYNC_PASSWORD
    passwd123
    

    5、Rsync企业级备份案例

    环境准备

    主机名 IP 角色
    server 192.168.111.30 rsync服务端
    client 192.168.111.40 rsync客户端

    客户端需求

    • 客户端每天凌晨3点备份/etc目录至/backup下以"主机名_IP地址_当前时间命名"的目录中
    • 客户端推送/backup目录下数据备份目录至Rsync备份服务器
    • 客户端只保留最近七天的备份数据,避免浪费磁盘空间

    服务端需求

    • 服务端部署rsync服务,用于接收用户的备份数据
    • 服务端每天校验客户端推送过来的数据是否完整,并将结果以邮件的方式发送给管理员
    • 服务端仅保留6个月的备份数据

    注意:所有服务器的备份目录均为/backup,所有脚本存放目录均为/scripts。

    服务端部署rsync服务

    [root@server ~]# mkdir /scripts
    [root@server ~]# vim /scripts/rsync_server.sh
    #!/bin/bash
    #安装rsync服务
    yum -y install rsync
    #修改服务配置文件
    cat > /etc/rsyncd.conf << EOF
    uid = rsync
    gid = rsync
    port = 873
    fake super = yes
    use chroot = no
    max connections = 4
    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]
    comment = welcome to oldboyedu backup!
    path = /backup
    EOF
    #创建服务用户,创建数据备份目录并设置权限
    useradd -r -M -s /sbin/nologin rsync
    mkdir /backup
    chown -R rsync.rsync /backup
    #生成数据传输用户密码文件并设置权限
    echo "rsync_backup:passwd123" > /etc/rsync.passwd
    chmod 600 /etc/rsync.passwd
    #关闭防火墙和selinux
    systemctl stop firewalld
    setenforce 0
    #设置服务开机自启,并重启服务
    systemctl enable rsyncd
    systemctl restart rsyncd
    
    [root@server ~]# chmod +x /scripts/rsync_server.sh 
    
    [root@server ~]# /scripts/rsync_server.sh 
    

    客户端备份数据并推送至rsync服务器

    [root@client ~]# mkdir /scripts
    [root@client ~]# vim /scripts/etc_backup.sh
    #!/bin/bash
    #客户端安装rsync
    yum -y install rsync
    #配置rsync客户端虚拟用户密码
    export RSYNC_PASSWORD='passwd123'
    #创建备份目录
    mkdir -p /backup/$(hostname)_$(ifconfig  | awk 'NR==2{print $2}')_$(date "+%F")
    #打包备份/etc目录下的数据至备份目录中
    tar -zcf /backup/$(hostname)_$(ifconfig  | awk 'NR==2{print $2}')_$(date "+%F")/etc_backup.tar.gz /etc/
    #计算备份文件的校验值
    md5sum /backup/$(hostname)_$(ifconfig  | awk 'NR==2{print $2}')_$(date "+%F")/etc_backup.tar.gz > /backup/$(hostname)_$(ifconfig  | awk 'NR==2{print $2}')_$(date "+%F")/checksum.txt
    #将打包备份好的数据推送到rsync备份服务器
    rsync -az /backup/$(hostname)_$(ifconfig  | awk 'NR==2{print $2}')_$(date "+%F") rsync_backup@192.168.111.30::backup
    #删除七天前的备份文件
    find /backup/ -mtime +7 | xargs rm -rf
    
    [root@client ~]# chmod +x /scripts/etc_backup.sh
    
    [root@client ~]# crontab -e
    0 3 * * * /scripts/etc_backup.sh
    

    服务端校验数据并将结果以邮件发送给管理员:

    #配置邮件服务
    [root@server ~]# yum -y install mailx
    [root@server ~]# cat > /etc/mail.rc << EOF
    # 发送的邮件地址
    set from=483607723@qq.com
    # 发送邮件服务器
    set smtp=smtps://smtp.qq.com:465
    # 发件人账号,一般情况下为邮件地址
    set smtp-auth-user=483607723@qq.com
    # 发件邮箱的授权码
    set smtp-auth-password=xxxxxxxxxx
    # 认证方式
    set smtp-auth=login
    # 忽略证书警告
    set ssl-verify=ignore
    # 证书所在目录
    set nss-config-dir=/etc/pki/nssdb/
    EOF
    
    #配置脚本校验数据并将结果发送给管理员
    [root@server ~]# vim /scripts/checksum.sh
    #!/bin/bash
    #校验备份数据并将结果发送给管理员
    md5sum -c /backup/client_192.168.111.30_$(date "+%F")/checksum.txt | mail -s "/backup/client_192.168.111.30_$(date "+%F")" 483607723@qq.com
    #删除6个月以前的备份数据
    find /backup/ -mtime +180 | xargs rm -rf
    
    [root@server ~]# chmod +x /scripts/checksum.sh
    
    [root@server ~]# crontab -e
    0 5 * * * /scripts/checksum.sh
    

    QQ邮箱的授权码获取

    进入邮箱后–>设置–>账户,开启下图中的SMTP,点击生成授权码

  • 相关阅读:
    【后端】python2和python3的语法差异
    TiDB简述及TiKV的数据结构与存储
    UE5——动画混合
    2023-09-12 LeetCode每日一题(课程表 IV)
    Advanced .Net Debugging 7:托管堆与垃圾收集
    场景应用:键盘敲入字母a时,期间发生了什么?
    [附源码]计算机毕业设计JAVA成都团结石材城商家协作系统
    【无标题】
    【嵌入式设计与实现】1 Keil MDKS TM32 CubeMX 的开发环境建立及Proteus仿真运行
    android 手机获取root权限_获取刷入模块_MIUI_android7~android12实践(redmi note11 T pro root)
  • 原文地址:https://www.cnblogs.com/Alone-8712/p/16650964.html