rsync数据同步简介与实战

admin 2022年10月20日 560次浏览

1、Rsync概述

1.1、数据同步分类

  • sync

    数据同步,是强制性将缓存中的数据写入到硬盘中,也就是数据修改后立即保存数据,一般用于实时性要求较高的场景

  • async

    数据异步,先将数据写入缓存,然后再周期性的去将数据同步到硬盘,该方法一般适用于大批量数据同步的场景

  • rsync

    远程数据同步

1.2、 rsync的特点

  • 可以镜像保存整个目录树和文件系统
  • 可以保留文件原有的所有信息,包括权限、属主、属组、时间、软硬连接等等
  • 传输效率高,使用同步算法,进行增量备份
  • 支持匿名传输,方便网站镜像;也可以做验证,加强安全

1.3、rsync与scp的区别

  • 二者都可以做数据同步,但 rsync 功能相对更强大
  • rsync 支持增量备份,scp 不支持
  • rsync 做数据同步时,可以保持文件的所有属性,scp 不支持

2、rsync的简单使用

2.1、基本使用语法

  • 本地同步

    rsync [OPTION...] SRC... [DEST]
    
  • 使用shell远程同步

    # 上传到备份服务器
    rsync [OPTION...] SRC... [USER@]HOST:DEST
    
    # 从备份服务器下载到本地
    rsync [OPTION...] [USER@]HOST:SRC... [DEST]
    
  • 常用选项

    -a:归档模式,递归方式传输文件,并保持文件的属性(常用)

    -v:显示详细信息(常用)

2.2、本地文件同步

  • 常用同步方法

    [root@centos7_11 ~]# mkdir {data,data_bak}
    [root@centos7_11 ~]# ls /etc > data/doc1
    [root@centos7_11 ~]# ls data
    doc1
    [root@centos7_11 ~]# rsync -av data/* data_bak/
    sending incremental file list
    doc1
    
    sent 1,842 bytes  received 35 bytes  3,754.00 bytes/sec
    total size is 1,752  speedup is 0.93
    [root@centos7_11 ~]# ls data_bak/
    doc1
    [root@centos7_11 ~]# echo '1234567890' > data/doc2
    [root@centos7_11 ~]# ls data
    doc1  doc2
    [root@centos7_11 ~]# rsync -av data/* data_bak/
    sending incremental file list
    doc2
    
    sent 118 bytes  received 35 bytes  306.00 bytes/sec
    total size is 1,763  speedup is 11.52
    

    注意: 在同步文件时,需要注意源路径 /data 与 /data/ 的区别,前者会将自身目录一起复制到备份路径下,而后者只会复制源路径下的文件

  • 删除目标路径下的多余文件

    我们可以使用 --delete 选项,将目标路径下的多余文件删除,保证目标路径下的文件和源路径下的文件相同

    [root@centos7_11 ~]# ls /etc/ > data_bak/doc3
    [root@centos7_11 ~]# ls data data_bak/
    data:
    doc1  doc2
    
    data_bak/:
    doc1  doc2  doc3
    
    [root@centos7_11 ~]# rsync -av --delete data/ data_bak/
    sending incremental file list
    deleting doc3
    ./
    
    sent 87 bytes  received 27 bytes  228.00 bytes/sec
    total size is 1,763  speedup is 15.46
    [root@centos7_11 ~]# ls data data_bak/
    data:
    doc1  doc2
    
    data_bak/:
    doc1  doc2
    

2.3、远程文件同步

  • 服务器端:192.168.137.12
  • 客户端:192.168.137.10

2.3.1、服务器端安全配置  

  • SELinux设置

    # 永久关闭
    [root@centos_12 ~]# vim /etc/selinux/config
    SELINUX=disabled
    
    # 临时关闭
    [root@centos_12 ~]# setenforce 0
    
  • 防火墙配置

    # 开通873端口
    [root@centos_12 ~]# firewall-cmd --zone=public --add-port=873/tcp --permanent
    success
    
    # 重载firewalld配置
    [root@centos_12 ~]# firewall-cmd --reload
    success
    
    # 重启firewalld服务
    [root@centos_12 ~]# systemctl restart firewalld
    

2.3.2、上传文件到服务器

[root@centos7_11 ~]# rsync -av data/* root@192.168.137.12:/data_bak
root@192.168.137.12's password: 
sending incremental file list
created directory /data_bak
doc1
doc2

sent 1,913 bytes  received 86 bytes  571.14 bytes/sec
total size is 1,763  speedup is 0.88

2.3.3、从服务器下载数据到本地

[root@centos7_11 ~]# rsync -av root@192.168.137.12:/data_bak/* /data/
receiving incremental file list
created directory /data
doc1
doc2

sent 62 bytes  received 1,913 bytes  3,950.00 bytes/sec
total size is 1,763  speedup is 0.8
[root@centos7_11 ~]# ls /data/
doc1  doc2

2.3.4、配置免密进行数据同步

配置 SSH RSA 登录认证即可

[root@centos7_11 ~]# ssh-keygen -t rsa -P ""
[root@centos7_11 ~]# ssh-copy-id root@192.168.137.12

2.3.5、与ssh使用非默认端口的服务器进行数据同步

[root@centos7_11 ~]# rsync -e "ssh -p 2001" -av /data/* root@192.168.137.12:/data_bak/

3、把rsync作为系统服务

3.1、配置远程备份服务器

3.1.1、服务器端安全配置

参见:2.3.1、服务器端安全配置

3.1.2、创建用于数据备份的系统用户

[root@centos_12 ~]# useradd -M -s /sbin/nologin rsync

3.1.3、创建rsync认证文件

认证文件内容格式 用户名:密码

[root@centos_12 ~]# echo 'user01:1234' > /etc/rsyncd.secrets
[root@centos_12 ~]# chmod 600 /etc/rsyncd.secrets

3.1.4、创建用于备份的目录

[root@centos_12 ~]# mkdir /root/data_bak/
[root@centos_12 ~]# chown -R rsync:rsync /root/data_bak/

3.1.5、创建rsyncd.conf配置文件

[root@centos_12 ~]# vim /etc/rsyncd.conf
# 全局配置
uid = rsync
gid = rsync
port = 873
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
exclude = lost+found/
timeout = 600
transfer logging = yes
ignore nonreadable = yes
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
fake super = yes
ignore errors
read only = false
list = false
auth users = user01,user02
secrets file = /etc/rsyncd.secrets
log file = /var/log/rsyncd.log

# 模块配置
[data_bak]
comment = data backup directory
path = /root/data_bak/

配置参数:

  • uid:所属用户

  • gid:所属用户组

  • port:监听端口

  • use chroot:禁止切换目录

  • pid file:pid文件路径

  • exclude:忽略的目录

  • transfer logging:是否记录日志

  • ignore nonreadable:忽略不可读的文件

  • dont compress:不压缩的文件类型

  • fake super:是否允许使用非root用户运行守护程序

  • max connections:最大连接数

  • timeout:超时时间

  • ignore errors:忽略错误信息

  • read only:只读模式

  • list:是否允许查看模块信息

  • auth users:指定允许登录的客户端认证用户清单,多个用户使用逗号分隔,且必须是secrets file文件中配置的用户,该参数可以在全局中配置,也可以在模块中配置,在模块中配置仅对该模块生效

  • secrets file:rsync客户端用户认证的密码文件,配合 “auth users” 参数使用,该参数可以在全局中配置,也可以在模块中配置,在模块中配置仅对该模块生效

  • log file:日志文件

  • [NAME]:模块名称

  • comment:模块说明

  • path:模块路径

3.2、客户端操作

3.2.1、测试服务器连接

前提是需要设置参数: list = yes

[root@centos_11 ~]# rsync -a root@192.168.137.12::
# 模块名称        模块说明
data_bak        data backup directory

3.2.2、同步数据到服务端

[root@centos_11 ~]# rsync -av /data/* user01@192.168.137.12::data_bak
Password:
sending incremental file list
doc1

sent 929 bytes  received 43 bytes  648.00 bytes/sec
total size is 1,738  speedup is 1.79
[root@centos_11 ~]# echo '1234567890' > /data/test.txt
[root@centos_11 ~]# rsync -av /data/* user01@192.168.137.12::data_bak
Password:
sending incremental file list
test.txt

sent 152 bytes  received 43 bytes  55.71 bytes/sec
total size is 1,781  speedup is 9.13

3.2.3、配置自动添加密码同步

# 创建user01的用户密码
[root@centos_11 ~]# echo '1234' > /etc/user01.passwd
# 修改密码文件权限
[root@centos_11 ~]# chmod 600 /etc/user01.passwd
# 同步文件
[root@centos_11 ~]# rsync -av /data/* user01@192.168.137.12::data_bak --password-file=/etc/user01.passwd
sending incremental file list

sent 69 bytes  received 20 bytes  178.00 bytes/sec
total size is 1,781  speedup is 20.01

3.2.4、配置rsync实时数据同步

一般情况下我们使用定时任务来执行 rsync 数据同步,如果需要实时的对数据监控,并进行实时数据同步,那么可以使用 rsync 配合 inotify-tools 的方式实现。inotify-tools 主要用于对指定的文件或目录进行实时监控,如果被监控目标出现变化,就可以触发命令的执行

  • 安装依赖包

    [root@centos_11 ~]# yum install autotools-dev  automake libtool -y
    
  • 安装inotify-tools

    inotify-tools 项目地址:https://github.com/inotify-tools/inotify-tools

    [root@centos_11 ~]# tar -xf inotify-tools-3.22.6.0.tar.gz
    [root@centos_11 ~]# cd inotify-tools-3.22.6.0
    [root@centos_11 ~]# ./autogen.sh && ./configure --prefix=/usr && make && make install
    
  • 创建任务脚本

    [root@centos_11 ~]# vim inotify.sh
    #!/usr/bin/bash
    # fine_name:inotify.sh
    
    /usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /data | while read events
    do
        rsync -av --delete /data/ root@192.168.137.12::data_bak
        echo "`date +%F\ %T` 发生事件:$events" >> /var/log/rsync.log
    done
    
  • 后台执行任务

    [root@centos_11 ~]# nohup ./inotify.sh &
    
  • 查看后台任务

    [root@centos_11 ~]# jobs
    [1]+  运行中               nohup ./inotify.sh &
    
  • 将后台任务放到前台运行

    [root@centos_11 ~]# fg 1
    

注意:如果在执行脚本时,出现 /usr/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory 请执行 ln -s /usr/lib/libinotifytools.so.0 /usr/lib64/