Linux常用工具服务——rsync数据同步服务

rsync数据同步服务

简介

Rsync(Remote synchronization)工具可实现全量增量本地或远程数据同步备份

(1) 一个rsync相当于scp,cp,rm,但是优于每一个命令(rsync可以完整拷贝和增量拷贝)
(2) 默认情况下,Rsync在同步备份数据时,通过其独特的“quick check”算法,快速的同步备份数据:
它仅同步大小或者最后修改时间发生变化的文件或目录;
也可根据权限,属主等属性的变化同步,但需要指定相应的参数;
甚至可以实现只同步一个文件里有变化的内容部分。

数据同步原理

CentOS5,rsync2.x比对方法,把所有的文件比对一遍,然后进行同步。
CentOS6,rsync3.x比对方法,一边比对差异,一边对差异的部分进行同步。

rsync常用参数选项

-a --archive,相当于-rlptgoD,归档模式,采取递归方式来同步,且尽可能的保持各个方面的一致性 -a无法同步硬链接,要加上-H选项

选项 含义
-r --recursive,递归模式
-l --links 保留软链接
-p --perms 保持文件权限
-t --times 保持文件时间信息
-g --group 保持文件属组信息
-o –owner 保持文件属主信息
-D --devices 保持设备文件信息

-v --verbose,详细模式输出,传输时的进度等信息
-z --compress,对备份的文件在传输时进行压缩处理
-P --progress 显示同步的过程及传输时的进度等信息

- - delete 让源目录SRC和目标目录数据DST一致(如果源端没有此文件,那么目的端也别想拥有)--delete选项不能单独使用(可以搭配-r)
- - exclude=filename 指定排除不需要传输的文件名称
- - bwlimit=KBPS 限制 I/O 带宽,KBytes per second

带宽限制

某DBA做数据同步,带宽占满,导致用户无法访问网站。

rsync -avz dbfile 10.0.0.41:/backup #没有给带宽做限制
rsync -avz --bwlimit=100 dbfile 172.16.1.41:/backup #限定了带宽

保持同步目录及文件属性

生产环境常用参数:-avz 或 -vzrtopg 前者较后者多了Dl功能
-avzP相当于-vzrtopgDIP(放入脚本中可以把-v和-P去掉)

rsync的工作方式

本地数据传输模式(local-only-mode)

当本地的不同目录之间需要数据传输,特别是经常需要增量传输时,rsync命令可以替代cp等命令,提升拷贝的效率

(1) 第一次运行命令会由于需要扫描并同步所有文件及目录,因此时间会长一些,如果再次备份就会进行快速对比,忽略通过的文件,速度更快。
(2) 在传输数据时,rsync命令也需要有对同步的目录拥有权限如此才可以实现正常传输数据。

rsync [OPTION...] SRC... [DEST]
命令 【参数】 源 【目的分区,文件或目录】

实例

1.把根下的opt目录同步到mnt目录(直接本地同步,与cp命令相似)
rsync -avz /opt /mnt 必须是/opt
2.删除功能,相当于rm命令

[root@localhost ~]# mkdir /space
[root@localhost ~]# rsync -avz --delete /space/ /tmp	;必须是/space/

注意有/和无/的区别

借助ssh通道在不同主机之间传输数据

Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

实例

1.将当前主机/etc目录通过SSH推送到远程主机的/tmp目录
rsync -avzP [-e 'ssh -p 22'] /etc [email protected]:/tmp
2.将远程主机/opt目录拉取到当前主机(包含目录本身)
rsync -avzP [-e 'ssh -p 22'] [email protected]:/opt /tmp/

通过映射好的主机名:(/etc/hosts)
[root@localhost ~]# tail -1 /etc/hosts
192.168.213.125 zhao
rsync -avzP [-e 'ssh -p 22'] root@zhao:/opt /tmp/

将命令的结果反馈回来 ssh root@IP command

以守护进程(socket)的方式传输数据(重点)

Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
      rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
      rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

环境搭建

1.部署环境

操作系统
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
内核版本
[root@localhost ~]# uname -r
3.10.0-1062.el7.x86_64

主机网络参数设置

主机名 网卡ens33 用途 代号
A 192.168.213.129 rsync服务端 A-Server
B 192.168.213.125 rsync客户端 B-Cilent

2.开始部署rsync服务端

rpm -qa rsync	#首先确认软件是否安装
cp -p /etc/rsyncd.conf{,.bak}	#配置文件/etc/rsyncd.conf(配置前先备份)
vim /etc/rsyncd.conf
【
uid = root	#用户
gid = root	#组
use chroot = no	#程序安全设置
max connections = 200	#客户端连接数
timeout = 300	#超时时间
pid file = /var/run/rsyncd.pid	#进程号文件位置
lock file = /var/run/rsync.lock	#进程锁
log file = /var/log/rsyncd.log	#日志文件位置

# rsync主目录设置
[backup]
path = /backup/	#使用目录
ignore errors	#有错误时忽略
read only = false	#可读可写(true或false)
list=false	#阻止远程列表(不让通过远程方式看服务端有啥)
hosts allow = 192.168.197.0/24	#允许IP
hosts deny = 0.0.0.0/32	#禁止IP 
auth users = rsync_backup	#虚拟用户
secrets file = /etc/rsync.password	#存放用户和密码的文件useradd -M -s /sbin/nologin rsync	#添加rsync程序用户
mkdir /backup	#创建共享目录
rsync --dameon	#启动服务
chown -R rsync:rsync /backup/	#将共享文件夹更改属主rsync
chmod -R 755 /backup/	#将共享文件夹更改权限
echo "rsync_backup:123456" > /etc/rsync.password	#创建rsync虚拟账户名和密码
chmod 600 /etc/rsync.password	#将账户密码文件的权限设置为600(必须否则失败)
echo "rsync --daemon" >> /etc/rc.local	#加入开机自启动
systemctl stop firewalld
setenforce 0
systemctl disable firewalld	#禁止开机启动

【重启rsync服务】
①pkill rsync ;关闭rsync服务
②rsync --daemon ;启动rsync服务

3.开始部署rsync客户端

rpm -qa rsync
echo "123456" > /etc/rsync.password	;创建密码文件
chmod 600 /etc/rsync.password	;将账户密码文件的权限设置为600(必须否则失败)

rsync同步测试

rsync服务器配置文件里的模块名

1.推送 将客户端任意目录推送到服务器端rsync指定目录/backup下

rsync -avzP /etc [email protected]::backup --password-file=/etc/rsync.password
ssh [email protected] ls /backup;查看同步结果

2.拉取 将rsync服务器端全部内容同步到客户端/backup
rsync -avzP [email protected]::backup /backup/ --password-file=/etc/rsync.password
3.拉取 将rsync服务器端指定目录下的指定内容同步到客户端
rsync -avzP [email protected]::backup/opt.tar.gz /backup/ --password-file=/etc/rsync.password
4.拉取时排除 将rsync服务器端指定目录下的全部内容排除某目录或文件后,同步到客户端

通过命令行实现排除
rsync -avzP --exclude=hosts --exclude=test/test1.txt [email protected]::backup /backup/ --password-file=/etc/rsync.password
通过列表文件实现排除
rsync -avzP --exclude-from=/root/exclude.txt [email protected]::backup /backup/ --password-file=/etc/rsync.password
#cat/root/exclude.txt
test/test1.txt
hosts

4.同步拉取 让rsync客户端指定目录内容始终和rsync服务器共享目录内容保持一致
(1)和rsync服务器目录内容始终保持一致

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

始终保持一致的意思是说,当Rsync服务器共享目录增加文件,那么客户端指定目录也增加,服务器端共享目录删除文件,那么客户端指定目录也删除文件

(2) 排除某文件后,再和服务器进行同步

rsync -avz --delete --exclude=file [email protected]::backup /backup/ --password-file=/etc/rsync.password

与同步拉取相比,同步推送只是客户端目录放在了服务端的前边

开发rsync服务启动脚本

vim Rsync	;编写脚本
【
# 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: " /bin/true
        sleep 1
    else
        action "Stopping Rsync:" /bin/true
        sleep 1
    fi
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload)
        stop
        start
        ;;
    *)
        echo $"Usage: `basename $0` {start|stop|restart|reload}"
esac
】
chmod +x Rsync	;增加可执行权限
mv Rsync /usr/local/bin/
#【使用方法】
Rsync
Usage: Rsync {start|stop|restart|reload}

排错必备思想

日志文件

cat /var/log/rsyncd.log

服务端排错

  1. 查看rsync服务配置文件路径是否正确,正确的默认路径为:/etc/rsyncd.conf
  2. 查看配置文件里host allow,host deny,允许的IP网段是否是允许客户端访问的ip网段
  3. 查看配置文件中path参数里的路径是否存在,权限是否正确(正常应为配置文件中的UID参数对应的属主和组)
  4. 查看rsync服务是否启动 ps -ef|grep rsync
    端口是否存在 netstat -antup |grep 873
  5. 查看iptables防火墙和selinux是否开启允许rsync服务通过,也可以考虑关闭
  6. 查看服务端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,正确格式为:用户名:密码,文件路径和配置文件里的secrect files参数对应
  7. 如果是推送数据,要查看下,配置rsyncd.conf文件中用户是否对模块下目录有可读写的权限

客户端排错

  1. 查看客户端rsync配置的密码文件是否600的权限,密码文件格式是否正确,注意:仅需要有密码,并且和服务器端的密码保持一致
  2. 用telnet连接rsync服务器ip地址873端口,查看服务是否启动(可测试服务端防火墙是否阻挡)telnet 192.168.197.129 873
  3. 客户端执行命令时IP::backup处的双冒号,其后的backup为模块名称

Rsync项目实战

备份全网服务器数据生产架构方案案例模型(必做)
【企业案例】
某公司里有一台Web服务器,里面的数据很重要,但是如果硬盘坏了,数据就会丢失,现在领导要求你把数据在其他机器上做一个周期性定时备份。要求如下:
每天晚上00点整在Web服务器A上打包备份网站程序目录并通过rsync命令推送到服务器B上备份保存(备份思路可以是先在本地按日期打包,然后再利用rsync推送到备份服务器上)。
具体要求如下:
1)rsync服务的socket方式传递,(客户端,服务端(web))
2)web服务器站点目录为(/var/www/html)
3)归档压缩web目录内容为日期格式,(例如:/backup/www.20190915.tar.gz),web服务器本地仅保留7天内的备份
4)备份服务器上检查备份结果是否正常(对比大小(服务文件—客户端文件对比)md5sum 生成校验码,使用校验码对比),并将每天的备份结果发给管理员信箱(自学 postfix)。
5)备份保留180天。

前提:rsync1备份服务器已搭建好rsync服务器环境,rsync2已搭建好rsync客户端环境。

[root@rsync2 ~]# crontab -l
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

#每天0点打包备份网站程序目录,rsync推送到服务器上备份
0 0 * * * source ./etc/profile;/bin/sh rsync2.sh

[root@rsync2 ~]# cat rsync2.sh
dir=/backup
date=`date +"%Y%m%d"`
backfile=$dir/www.$date.tar.gz
md5file=$dir/md5-$date.txt
#检查备份保存目录是否存在
checkdir(){
if [ ! -d $dir ]
then
    mkdir /backup
fi
}
#打包备份网站程序目录
checkdir
tar -czf $backfile /var/www/html &>/dev/null
#生成md5校验码
md5sum $backfile >$md5file
#推送到服务器B上
rsync -avz $backfile $md5file [email protected]::backup --password-file=/etc/rsync.password &>/dev/null
#本地保留7天内的备份
find $dir -mtime +7 -exec rm -rf {} \; &>/dev/null

[root@rsync01 ~]# crontab -l
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

#每天0点5分检查网站程序目录备份是否异常
5 0 * * * source ./etc/profile;/bin/sh rsync1.sh

[root@rsync01 ~]# cat rsync1.sh
dir=/backup
date=`date +"%Y%m%d"`
backfile=$dir/www.$date.tar.gz
md5file=$dir/mymd5.txt
#生成md5校验码,检查备份结果是否正常
md5sum $backfile >$md5file
diff $md5file $dir/md5-$date.txt &>/dev/null
if [ $? -eq 0 ]
then
    echo "经md5校验,$backfile备份正常 success"|mail -v -s "rsync备份报告$date" [email protected] &>/dev/null
else
    echo "经md5校验,$backfile备份异常 fail"|mail -v -s "rsync备份报告$date" [email protected] &>/dev/null
fi
#清除临时文件
rm -rf $md5file
rm -rf $dir/md5-$date.txt
#备份保留180天
find $dir -mtime +180 -exec rm -rf {} \; &>/dev/null

在这里插入图片描述

发布了61 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42049496/article/details/104258561