rsync服务

Posted 徐中祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsync服务相关的知识,希望对你有一定的参考价值。

Rsync服务

一、备份概述

  • 什么是备份?
备份就是把重要的数据或者文件复制一份保存到另一个地方
  • 备份的工具
本地备份:cp
远程备份:scp   rsync

二、Rsync服务介绍

1、简介

rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。

rsync官方地址:https://rsync.samba.org/
rsync监听端口:873
rsync运行模式:C/S   client/server

rsync简称叫做远程同步,可以实现不同主机之间的数据同步,还支持全量和增量

2、rsync特性

支持拷贝特殊文件,如连接文件、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。

可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。

3、生产场景备份方案

1.借助cron+rsync把所有客户服务器数据同步到备份服务器。
2.针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。
3.通过本地打包备份,然后rsync结合inotify应用把全网数统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果。
4.定期将IDC机房的数据备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。
5.实时同步,解决存储服务器等的单点问题。

三、Rsync应用场景

1、备份方式

  • 全量备份
# 将数据完整的复制一份保留下了
  • 增量备份
# 备份上一次备份后新增的数据

2、rsync的传输方式

push 推:
从客户端将数据推送至服务端

pull 拉:
客户端将数据拉取到本地

3、传输存在的问题

1.推的问题:当客户端服务器数量过多,容易造成数据推送缓慢
2.拉的问题:当客户端服务器数量过多,容易造成服务端压力过大

四、Rsync传输模式

三种传输模式

1.本地方式(类似于cp,不支持推送和拉取,只是单纯的复制)
2.远程方式(类似于scp,又不同于scp)
3.守护进程方式(客户端和服务端)

1、本地方式

#语法:
rsync [OPTION]... SRC [SRC]... DEST
命令   选项        源文件       目标地址

#语法实例
[root@web01 ~]# rsync -avz rewriteip.sh /tmp/

#类似于cp,但是cp是全量复制并且会修改文件属性,rsync是增量复制,会保证文件属性不变

2、远程方式

  • pull 拉取数据的命令
#语法:
rsync [OPTION]... [USER@]HOST:SRC [DEST]

#实例:
[root@web01 ~]# rsync -avz root@172.16.1.41:/tmp/dir1 ./

#注意:
拉取过程中,如果拉取的内容加 / 则拉取的是目录下的文件
拉取过程中,如果拉取的内容不加 / 则拉取的是目录本身以及目录下的文件
  • push 推送数据命令
#语法
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

#实例
[root@web01 ~]# rsync -avz ./rewriteip.sh root@172.16.1.41:/tmp

#注意:
推送过程中,如果推送的内容加 / 则推送的是目录下的文件
推送过程中,如果推送的内容不加 / 则推送的是目录本身以及目录下的文件

3、守护进程传输模式

  • 为什么使用守护进程模式
1.rsync传输时,使用的是系统用户和系统用户的密码,非常的不安全
2.使用普通用又会出现权限问题

守护进程传输模式语法:

  • push 推送语法
#语法:
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

#实例:
[root@web01 ~]# rsync -avz rewriteip.sh rsync_backup@172.16.1.41::backup

#语法拆分
rsync 				#命令	
-avz 				#选项
rewriteip.sh 		#当前服务器的文件
rsync_backup		#rsync服务端配置的虚拟用户
@					#分隔符
172.16.1.41			#远程主机IP地址
::backup			#模块名

#推送过程中服务端目录必须是服务端配置的启动用户权限
  • pull 拉取语法
#语法:
rsync [OPTION]... [USER@]HOST::SRC [DEST]

#示例:
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup /tmp/

#语法拆分:
rsync 				#命令
-avz 				#选项
rsync_backup		#服务端定义的虚拟用户
@					#分隔符
172.16.1.41			#远程主机IP地址
::backup 			#模块名字
/tmp/				#当前主机的目录

#拉取过程中服务端目录不用设置rsync用户权限

4、守护进程模式实践

  • 环境准备统一安装rsync
主机IP主机角色
backup10.0.0.41rsync服务端
web0110.0.0.7rsync客户端
  • 服务端配置rsync

#查找配置文件
[root@backup ~]# rpm -qc rsync
/etc/rsyncd.conf

#编辑配置文件
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
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

#配置文件详解
uid = rsync							#启动服务的用户id
gid = rsync							#启动服务用户的组id
port = 873							#服务默认监听端口
fake super = yes					#无须使用root用户启动
use chroot = no						#安全机制
max connections = 200				#最大连接数
timeout = 600						#超时时间
ignore errors						#忽略错误
read only = false					#只读权限
list = false						#查看模块列表
auth users = rsync_backup			#定义虚拟用户(rsync传输过程需要验证的用户身份)
secrets file = /etc/rsync.passwd	#定义虚拟用户的密码
log file = /var/log/rsyncd.log		#日志文件
#####################################
[backup]								#模块
comment = welcome to oldboyedu backup!	#模块的备注
path = /backup							#服务器真实的路径
  • 根据配置文件进行操作
1.创建用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M

2.创建密码文件(一定不能有空格)
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.passwd
[root@backup ~]# chmod 600 /etc/rsync.passwd

3.创建备份目录
[root@backup ~]# mkdir /backup

4.授权备份目录
[root@backup ~]# chown -R rsync.rsync /backup/
  • 启动服务
[root@backup ~]# systemctl start rsyncd
#验证启动
[root@backup ~]# netstat -lntp | grep 873        
[root@backup ~]# ps -ef | grep rsync
  • 客户端推拉数据方法

方法一:

#输入密码的方式
[root@web01 ~]# rsync -avz rewriteip.sh rsync_backup@172.16.1.41::backup
Password: 123456
sending incremental file list

sent 55 bytes  received 20 bytes  21.43 bytes/sec
total size is 194  speedup is 2.59

方法二:

#指定密码文件的方式
1.创建密码文件
[root@web01 ~]# echo "123456" > /etc/rsync.passwd
[root@web01 ~]# chmod 600 /etc/rsync.passwd 

2.使用参数传输
[root@web01 ~]# rsync -avz rewriteip.sh rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
sending incremental file list
rewriteip.sh

sent 207 bytes  received 43 bytes  166.67 bytes/sec
total size is 194  speedup is 0.78

方法三:

[root@web01 ~]# export RSYNC_PASSWORD=123456
[root@web01 ~]# rsync -avz rewriteip.sh rsync_backup@172.16.1.41::backup
sending incremental file list

sent 55 bytes  received 20 bytes  50.00 bytes/sec
total size is 194  speedup is 2.59

五、Rsync常用参数

1、常用参数

-a           #归档模式传输, 等于-tropgDl    -t -r -o -p -g -D -l
-v           #详细模式输出, 打印速率, 文件数量等
-z           #传输时进行压缩以提高效率
-r           #递归传输目录及子目录,即目录下得所有目录都同样传输。
-t           #保持文件时间信息
-o           #保持文件属主信息
-p           #保持文件权限
-g           #保持文件属组信息
-l           #保留软连接
-P           #显示同步的过程及传输时的进度等信息
-D           #保持设备文件信息
-L           #保留软连接指向的目标文件
-e           #使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN   #指定排除不需要传输的文件
--exclude-from=file #文件名所在的目录文件
--bwlimit=100       #限速传输
--partial           #断点续传
--delete            #让目标目录和源目录数据保持一致
--password-file=xxx #使用密码文件
  • –exclude-from=file 排除参数
#创建多个文件
[root@web01 ~]# touch txt{1..10}
[root@web01 ~]# ll
total 0
drwxr-xr-x. 2 root root 6 Nov 19 08:44 dir
-rw-r--r--. 1 root root 0 Nov 19 08:44 file
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt1
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt10
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt2
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt3
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt4
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt5
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt6
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt7
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt8
-rw-r--r--. 1 root root 0 Nov 19 08:59 txt9

#编辑文件写入要排除的文件名字
[root@web01 ~]# vim 1.txt 
txt1
txt2
txt3
txt4

#指定排除文件推送内容
[root@web01 ~]# rsync -avz ./* rsync_backup@172.16.1.41::backup --exclude-from=1.txt
sending incremental file list
1.txt
txt10
txt5
txt6
txt7
txt8
txt9
dir/

sent 468 bytes  received 165 bytes  422.00 bytes/sec
total size is 20  speedup is 0.03
#发现没有传输1.txt中写入名字的文件
  • –bwlimit=100 限速传输
#创建一个1G的文件
[root@web01 ~]# dd if=/dev/zero of=./1.txt bs=1M count=1000

#限速1M每秒推送
[root@web01 ~]# rsync -avzP 1.txt rsync_backup@172.16.1.41::backup --bwlimit=1
sending incremental file list
1.txt
    114,130,944  10%    1.01MB/s    0:15:06

#限速10M每秒推送
[root@web01 ~]# rsync -avzP 1.txt rsync_backup@172.16.1.41::backup --bwlimit=10
sending incremental file list
1.txt
    262,078,464  24%    9.89MB/s
  • –delete 数据一致(无差异同步)
#查看客户端数据
[root@web01 ~]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt2
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt3
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt4
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt5
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt6
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt7
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt8
-rw-r--r--. 1 root root 0 Nov 19 09:17 txt9

#删除数据
[root@web01 ~]# rm -rf txt2
[root@web01 ~]# rm -rf txt3
[root@web01 ~]# rm -rf txt4

#执行数据一致同步
[root@web01 ~]# rsync -avz ./ rsync_backup@172.16.1.41::backup --delete
sending incremental file list
deleting txt4
deleting txt3
deleting txt2

#查看服务端
[root@backup backup]# ll
total 0
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt5
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt6
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt7
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt8
-rw-r--r--. 1 rsync rsync 0 Nov 19 09:17 txt9

#注意:
拉取时:客户端数据与服务端数据一致,以服务端数据为准
推送时:服务端数据与客户端数据一致,以客户端数据为准

六、Rsync备份案例

  • 准备服务器

主机IP身份
web0110.0.0.7客户端
backup10.0.0.41服务端
  • 了解需求

客户端需求:
1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行该脚本
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

服务端需求:
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除
  • 客户端

[root@web01 ~]# vim client.sh 
#!/bin/bash
#1.定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}

#2.创建表备份目录
mkdir $SRC -p

#3.打包文件
cd /var && tar zcf $SRC/conf.tar.gz ./log/messages

#4.生成校验码
md5sum $SRC/conf.tar.gz > $SRC/flag

#5.推送文件
export RSYNC_PASSWORD=123456
rsync -az $DIR/ rsync_backup@172.16.1.41::backup

#6.删除七天前数据
find $DIR/ -type d -mtime +7 | xargs rm -rf
  • 服务端

  • 校验文件

[root@backup backup]# md5sum -c /backup/*_$(date +%F)/flag_2020-11-30
  • 使用邮件发送消息
#1.服务端配置邮件功能
[root@backup ~]# yum install mailx -y
[root@backup ~]# vim /etc/mail.rc
set from=253097001@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=253097001@qq.com
set smtp-auth-password=123123123
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

#2.测试发送邮件
[root@backup backup]# mail -s "校验结果" 1240206455@qq.com < server.sh 
  • 服务端脚本
#!/bin/bash
#1.定义变量
DIR=/backup
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${HOSTNAME}_${IP}_${DATE}

#2.校验文件
md5sum -c $DIR/*_$DATE/flag > $DIR/result.txt

#3.将校验结果发送给管理员邮箱
mail -s "$DATE备份文件 校验结果" 1240206455@qq.com < $DIR/result.txt

#4.删除6个月之前的数据
find $DIR/ -type d -mtime +180 | xargs rm -rf
  • 将服务端脚本加入定时任务
[root@backup ~]# crontab -e
#服务端每天7点将校验备份结果发给管理员
0 7 * * * /bin/bash /root/server.sh &> /dev/null

七、Rsync结合inotify

1、安装inotify

[root@web01 ~]# yum -y install inotify-tools

2、常用参数

-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
	%Xe 事件
	%w 目录
	%f 文件
-e 指定监控的事件
	access 访问
	modify 内容修改
	attrib 属性修改
	close_write 修改真实文件内容
	open 打开
	create 创建
	delete 删除
	umount 卸载
  • 测试命令
/usr/bin/inotifywait  -mrq  --format '%Xe  %w  %f' -e create,modify,delete,attrib,close_write  /backup

3、实时备份脚本编写

[root@backup ~]# vim rsyn-inotify.sh
#!/bin/bash
dir=/backup
/usr/bin/inotifywait  -mrq  --format '%w %f' -e create,delete,attrib,close_write  $dir | while read line;do
        cd  $dir  && rsync -az -R  --delete  .  rsync_backup@172.16.1.31::backup --password-file=/etc/rsync.passwd >/dev/null 2>&
done  &

以上是关于rsync服务的主要内容,如果未能解决你的问题,请参考以下文章

Rsync

rsync实现数据同步

Rsync:非常实用的同步文件命令。

rsync

rsync nfs 实时同步,结合实战

双台服务器rsync同步报错(code 5) at main.c(1503) [sender=3.0.6]