第十六课----Rsync数据同步工具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十六课----Rsync数据同步工具相关的知识,希望对你有一定的参考价值。

1.1.1 什么是Rsync?
Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具。Rsync软件适用于unix/linux/windows等多种操作系统平台。
1.1.2 Rsync简介
? Rsync英文全称Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像,远程备份的功能,这个功能类似ssh带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,Rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
小提示:利用Rsync还可以实现删除文件何目录的功能,这又相当于rm命令!
? 一个rsync相当于scp,cp,rm,但是还优于他们每一个命令。
? 在同步备份数据时,默认情况下,Rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限,属主等属性的变化同步,但需要指定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可以实现快速的同步备份数据。
提示:传统的cp,scp工具拷贝每次均为完整的拷贝,而rsync除了可以完整拷贝外,还具备增量拷贝的功能,因此,从同步数据的性能及效率上,Rsync工具更胜一筹。
1.3 Rsync的特性
Rsync的特性如下:
? 支持拷贝特殊文件如链接文件,设备等
? 可以有排除(tar?find?)指定文件或目录同步的功能,相当于打包命令tar的排除功能
? 可以做到保持原文件或目录的权限,时间,软硬链接,属主,组等属性均不改变-p
? 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)
? 可以使用rcp,rsh,ssh等方式来配合传输文件(rsync本身不对数据加密)
? 可以通过socket(进程方式)传输文件和数据(服务端和客户端)
? 支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像
1.2 Rsync的工作方式
为了方便同学学习,我从实际的使用功能上进行了一下划分。一般来说,Rsync大致使用三种主要的传输数据的方式。分别为:
? 单个主机本地之间的数据传输(此时类似于cp命令的功能)
? 借助rcp,ssh等通道来传输数据(此时类似于scp命令的功能)
? 以守护进程(socket)的方式传输数据(这个是rsync自身的重要功能) --工作中最重要的 (在远程做推拉)
以上的几种rsync的工作方式,我们可以通过man rsync帮助或查看官方的手册获得:
1.2.1 本地数据传输模式(local-only mode)
Rsync本地传输模式的语法为:
rsync [OPTION...] SRC...[DEST]
语法说明:
1)Rsync为同步的命令;
2)[OPTION]为同步时的参数选项
3)SRC为源,即待拷的分区,文件或目录等;
4)[DEST]为目的分区,文件或目录等;
直接本地同步:相当于cp
rsync /etc/hosts /tmp/

安装Rsync 工具

[[email protected] ~]# yum -y install rsync

查看安装包
[[email protected] ~]# rpm -qa | grep rsync

启动服务
[[email protected] ~]# rsync --daemon
查看Rsync服务端口
[[email protected] ~]# netstat -lnt
技术分享图片
使用工具Rsync同步
[[email protected] ~]# rsync -azvP /var/ /backup
技术分享图片

删除功能,相当于rm 命令
[[email protected] ~]# rsync -avz --delete /root/allen/ /backup
(原则就是 前面有啥 后面有啥 前面是空 后面就是空)

1.2.4 保持同步目录及文件属性
这里的-avzP 相当于-vzrtopgDIP(还多了DI功能),生产环境常用的参数选项为-avzP或-vzrtopgP如果是放入脚本中,也可以把-v何-P去掉。这里的--progress可以用-P代替。
特别说明:以上参数为企业生产环境常用参数,对于初学者来说掌握上面内容已足够。
生产参数:-avz或者用-vzrtopg
1.2.5 使用rsync在本地备份传输数据

1.3 借助ssh通道在不同主机之间传输数据
示例1:推送:将当前主机内容推送到远程主机

[[email protected] ~]# rsync -avz -e ‘ssh -p 22‘ /backup/ [email protected]:/tmp/

技术分享图片

#命令说明
-e ‘ssh -p 22‘ 表示以ssh的方式通过22端口推送,如果不写默认22端口

查看同步到远端服务器的结果
[[email protected] ~]# ssh [email protected] "ls -la /tmp/"

技术分享图片

示例2:将远程主机内容拉取到当前主机,与推送只是把远端与本地的目录位置对换
[[email protected] ~]# rsync -avz -e ‘ssh -p 22‘ [email protected]:/tmp/ /backup/

关键语法说明:
1)-avz相当于-vzrtopgDI,表示同步时文件和目录属性不变。
2)-P显示同步的过程,可以用--progress替换。
3)-e ‘ssh -p 22’表示通过ssh通道传输数据,可省略br/>4)[email protected]:/tmp远程主机系统用户,地址,路径
5)/backup/本地的路径

1.2.2 rsync 命令常用参数选项说明:
-v,--verbose 详细模式输出,传输时的进度等信息
-z,--compress 传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩。
-a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgD1(字母1)

-r,--recursive 对子目录以递 归模式,即目录下的所有目录都同样传输,注意是小写r
-t,--times 保持文件时间信息
-o,--owner 保持文件属主信息
-p,--perms 保持文件权限
-g,--group 保持文件属组信息
-P,--progress 显示同步的过程及传输时的进度等信息
-D,--devices 保持设备文件信息
-l,--links 保留软链接
-e,--rsh=COMMAND 使用的信道协议(remote shell),指定替代rsh的shell程序。例如:ssh --exclude=PATTERN 指定排除不需要传输的文件模式(和tar参数一样)
--bwlimit=RATE limit socket I/O bandwidth
--delete 让源目录SRC和目标目录数据DST一致
技术分享图片

1.4 以守护进程(socket)的方式传输数据(重点)
1.4.1 部署前的准备工作:
1.4.2 部署环境
操作系统:
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
内核版本:
[[email protected] ~]# uname -r
3.10.0-862.el7.x86_64

[[email protected] ~]# uname -ra
Linux ServerRsync 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

主机网络参数设置:
主机名 网卡eth0 用途 代号
计算机名1 10.1.3.229 rsync客户端 B-Server
计算机名2 10.1.3.231 rsync服务端 A-Server

1.4.3 具体要求
要求在A-Server上以rsync守护进程的方式部署rsync服务,使得所有rsync节点客户端主机,可以把本地数据通过rsync的方式备份到数据备份服务器A-Server上。本例的客户端仅以B-Server,C-Server为例。
技术分享图片
1.5 开始部署rsync服务--Rsync服务器端A-Server操作过程:
1.5.1 配置rsyncd.conf
首先确认软件是否安装:
[[email protected] ~]# rpm -qa rsync
rsync-3.1.2-4.el7.x86_64
然后创建rsyncd.conf文件,并添加如下内容(文件默认不存在)
[[email protected] ~]# cat /etc/rsyncd.conf
备份配置文件
[[email protected] ~]# cp -a /etc/rsyncd.conf /etc/rsyncd.conf.bak

备份文件说明:

用户

uid = rsync

gid = rsync

程序安全设置

use chroot = no

客户端连接数

max connections = 200

超时时间

timeout = 300

进程号文件位置

pid file = /var/run/rsyncd.pid1

进程锁

lock file = /var/run/rsync.lock

日志文件位置

log file = /var/log/rsyncd.log
##########################################
[backup]

使用目录

path = /backup/

有错误时忽略

ignore errors

可读可写(true或false)

read only = false

阻止远程列表(不让通过远程方式看服务端有啥)

list=false

允许IP

hosts allow = 192.168.197.0/24

禁止IP

hosts deny = 0.0.0.0/32

虚拟用户

auth users = rsync_backup

存放用户和密码的文件

secrets file = /etc/rsync.password

技术分享图片
修改配置文件后重启服务
启动: rsync --daemon (873端口)

1.5.2 创建共享目录及添加rsync程序用户
创建rsync用户
[[email protected] ~]# useradd -M -s /sbin/nologin rsync
创建共享目录
[[email protected] ~]# mkdir /backup/
指定用户目录属性
[[email protected] ~]# chown - R rsync:rsyns /backup/

1.5.3 启动服务:rsync --daemon

[[email protected] ~]# rsync --daemon
[[email protected] ~]# netstat -antup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0: LISTEN 11784/rsync
tcp6 0 0 :::873 :::
LISTEN

1.5.4 将A-Server上的/backup文件夹更改属主rsync

chown -R rsync /backup

1.5.5 创建rsync虚拟账户名和密码
[[email protected] ~]# echo "rsync_backup:123456" > /etc/rsync.password
[[email protected] ~]# cat /etc/rsync.password
rsync_backup:123456

1.5.6 将账户密码文件的权限设置为600(必须否则失败)

[[email protected] ~]# chmod 600 /etc/rsync.password

关闭防火墙
[[email protected] ~]# systemctl stop firewall
[[email protected] ~]# iptbales -F
[[email protected] ~]# setenforce 0

1.6.5 Rsync同步测试

拉取命令

[[email protected] ~]# rsync -avz [email protected]::backup /backup

--password-file=/etc/rsync.password:免密码的操作,指定密码文件位置,如果不写,则会要求用户交互式输入密码。(如果想挂定时任务,必须得非交互式)

1.6.5.1 推送测试1:将客户端指定目录内容推送到服务器端rsync指定目录下。
测试命令:

rsync -avzP /backup/ [email protected]::backup --password-file=/etc/rsync.password

命令说明:
-avz:保持稳健各项属性不变,-v显示同步信息 -P显示具体同步过程
/backup/:要推送的内容所在目录
rsync_backup:服务器端rsync服务的同步的用户名(非Linux用户)
10.1.3.231:rsync服务器IP地址
backup:rsync服务器配置文件里的模块名
--password-file=/etc/rsync.password:免密码的操作,指定密码文件位置,如果不写,则会要求用户交互式输入密码。(如果想挂定时任务,必须得非交互式)
命令说明:
拉取和推送相比,只是两个目录换了个位置。
技术分享图片

1.6.5.5 拉取测试3: 将rsync服务器端指定目录下的全部内容排除某目录或文件后,同步到客户端

说明:
a,b,c,d,e为文件,10.1.3.231是目录。目录下有1,2,3,4,5文件
方法一:通过命令行实现排除
测试命令:
[[email protected] ~]#rsync -avz --exclude=a --exclude=thinkmo/3 --exclude=thinkmo/4 [email protected]::backup /backup/ --password-file=/etc/rsync.password
命令说明:
--exlude=文件名 :排除的文件

方法二:通过列表文件实现排除
创建排除列表文件
[[email protected] ~]# cat /root/exclude.txt
1
3
5
a
c
g
[[email protected] ~]#
测试命令:
rsync -avz --exclude-from=/root/exclude.txt [email protected]::backup /backup/ --password-file=/etc/rsync.password

命令说明:
--exclude-from=文件的绝对路径 :引用一个排除列表,列表里只需要输入排除的文件名即可

1.6.5.6 rsync同步拉取测试:让rsync客户端指定目录内容始终和rsync服务器共享目录内容保持一致
1)和rsync服务器目录内容始终保持一致
始终保持一致的意思是说,当Rsync服务器共享目录增加文件,那么客户端指定目录也增加,服务器端共享目录删除文件,那么客户端指定目录也删除文件
测试命令:
rsync -avz --delete [email protected]::backup /backup/ --password-file=/etc/rsync.password

命令说明:
--delete :表示同步增,删,改(文件内容出现变化,也会同步的)
命令说明:
--delete :表示同步增,删,改(文件内容出现变化,也会同步的)
与同步拉取相比:只是客户端目录放在了服务器端的前边。

命令说明:
--delete :表示同步增,删,改(文件内容出现变化,也会同步的)

【Rsync项目实战】备份全网服务器数据生产架构方案案例模型(必做)
【企业案例】:
某公司里有一台Web服务器,里面的数据很重要,但是如果硬盘坏了,数据就会丢失,现在领导要求你把数据在其他机器上做一个周期性定时备份。要求如下:
每天晚上00电整在Web服务器A上打包备份网站程序目录并通过rsync命令推送到服务器B上备份保存(备份思路可以是先在本地按日期打包,然后再利用rsync推送到备份服务器上)。
具体要求如下:
1)NFS服务器nfs01和备份服务器backup的备份目录必须都为/backup
2)NFS服务器站点目录假定为(/var/www/
html
3)NFS服务器本地仅保留7天内的备份。
4)备份服务器上检查备份结果是否正常,并将每天的备份结果发给管理员信箱。
5)备份服务器上每周六的数据都保留,其他备份仅保留180天备份。
附录1: rsyncd.conf配置文件常用参数说明:
rsyncd.conf参数 参数说明
uid=rsync #rsync使用的用户。
gid=rsync #rsync使用的用户组(用户所在的组)
use chroot=no #如果为true,daemon会在客户端传输文件前“chroot to the path”。这是一种安全配置,因为我们大多数都在内网,所以不配也没关系
max connections=200 #设置最大连接数,默认0,意思无限制,负值为关闭这个模块
timeout=400 #默认为0,表示no timeout,建议300-600(5-10分钟)
pid file #rsync daemon启动后将其进程pid写入此文件。如果这个文件存在,rsync不会覆盖该文件,而是会终止
lock file #指定lock文件用来支持“max connections”参数,使得总连接数不会超过限制
log file #不设或者设置错误,rsync会使用rsyslog输出相关日志信息
ignore errors #忽略I/O错误
read only=false #指定客户端是否可以上传文件,默认对所有模块为true
list=false #是否允许客户端可以查看可用模块列表,默认为可以
hosts allow #指定可以联系的客户端主机名或和ip地址或地址段,默认情况没有此参数,即都可以连接
hosts deny #指定不可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接
auth users #指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在。默认为所有用户无密码访问
secrets file #指定用户名和密码存放的文件,格式;用户名;密码,密码不超过8位
[backup] #这里就是模块名称,需用中括号扩起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护
path #这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题
特别说明:
1)模块中的参数项可以拿到全局配置中使用
2)以上配置文件中的参数,为生产中经常使用的参数,初学者掌握这些足够了。
3)以上配置文件中没有提到的参数请参考man rsyncd.conf查看

附录2: 开发rsync服务启动脚本
#!/bin/bash
#author:Mr.thinkmo

chkconfig:35 13 91

description:This is Rsync service management shell script

Source function library

. /etc/rc.d/init.d/functions

start(){
rsync --daemon
if [ $? -eq 0 -a ps -ef|grep -v grep|grep rsync|wc -l -gt 0 ];then
action "Starting Rsync:" /bin/true
sleep 1
else
action "Starting Rsync:" /bin/false
sleep 1
fi
}

stop(){
pkill rsync;sleep 1;pkill rsync
if [ ps -ef|grep -v grep|grep "rsync --daemon"|wc -l lt 1 ];then
action "Stopping Rsync: ps -ef|grep -v grep|grep rsync|wc -l" /bin/true
sleep 1
else
action "Stopping Rsync:ps -ef|grep -v grep | grep "rsync --daemon"|wc -l" /bin/true
sleep 1
fi
}

case "$1" in
start)
start;
;;
stop)
stop;
;;
restart|reload)
$0 stop;
$0 start;
;;
*)
echo $"Usage: $0 {start|stop|restart|reload}"
;;
esac
保存成rsyncd,放到/etc/init.d/rsyncd
[[email protected] ~]# cp rsync /etc/init.d/rsyncd
[[email protected] ~]# chmod +x /etc/init.d/rsyncd
[[email protected] ~]# /etc/init.d/rsyncd stop
已终止
[[email protected] ~]# /etc/init.d/rsyncd start
Starting Rsync: [确定]


以上是关于第十六课----Rsync数据同步工具的主要内容,如果未能解决你的问题,请参考以下文章

Golang✔️走进 Go 语言✔️ 第十六课 协程 & 通道

Golang✔️走进 Go 语言✔️ 第十六课 协程 & 通道

Linux云自动化运维第十六课

linux就该这么学 第十六课

Python第十六课(模块3)

wxWidgets第十六课 wxTimer没有调用stop导致崩溃的问题分析