Centos RSync+Shell实现数据定时同步

我们前面介绍了几篇关于Centos相关服务安装及配置,今天我们主要介绍如何实现本地与远程计算机的数据目录同步,在我之前bolg中有一篇通过shell实现本地与远程计算机的数据同步的文章,通过shell同步实现指定目录的复制及覆盖操作不是那么的方便,因为复制目录及覆盖目录只会增量,不会减量,比如:原来的本地有一个目录下的abc.txt被同步到了远程计算机的指定目录后,当本地目录下的abc.txt文件删除后,远程计算机同步目录下的abc.txt依然存在,所以这样导致数据信息不准确,今天了我们为了解决这样的问题,我们准备使用rsync+shell脚本进行定期数据同步。说到Rsync相信大家已经很熟悉了,但是很多文章中都介绍了,配置了Rsync server和rsync client的数据自动同步,这样结果当然好,但是对于服务配置上稍稍有点复杂,对于一个初学者来说还是有点难度,所以我们今天不准备配置rsync server 和rsync client实现自动同步,而是使用rsync client 和shell脚本定时同步数据,对于rsync server 和rsync client结合实现数据的双向同步我们下一篇文章中介绍;我们最最后再重申月一下Rsync 同步目录数据使用的SSH进行同步的;所以我们首先要将服务器之间的SSH服务互相通信,然后还需要注意一点是数据同步需要配置SSH-KEY,这样数据同步就无需输入密码了;

环境介绍:centos 6.4  + rsync + shell   DB1:192.168.6.28  DB2: 192.168.6.38

环境需求:我们需要将DB1服务器上的指定目录下的文件定时同步到DB2服务器上的指定目录;

我们使用的是rsync服务进行数据同步,对于rsync有很多参数,具体见下:

--help

选项

说明

-a,--archive

归档模式,表示以递归方式传输文件,并保持所有文件属性,等价于 -rlptgoD (注意不包括 -H)

-r,--recursive 对子目录以递归模式处理

-l,--links

保持符号链接文件

-H,--hard-links

保持硬链接文件

-p,--perms

保持文件权限

-t,--times

保持文件时间信息

-g,--group

保持文件属组信息

-o,--owner

保持文件属主信息 (super-user only)

-D

保持设备文件和特殊文件 (super-user only)

-z,--compress

在传输文件时进行压缩处理

--exclude=PATTERN

指定排除一个不需要传输的文件匹配模式

--exclude-from=FILE

从FILE中读取排除规则

--include=PATTERN

指定需要传输的文件匹配模式

--copy-unsafe-links

拷贝指向SRC路径目录树以外的链接文件

--safe-links

忽略指向SRC路径目录树以外的链接文件(默认)

--existing 仅仅更新那些已经存在于接收端的文件,而不备份那些新创建的文件
--ignore-existing

忽略那些已经存在于接收端的文件,仅备份那些新创建的文件

-b,--backup

当有变化时,对目标目录中的旧版文件进行备份

--backup-dir=DIR

与-b结合使用,将备份的文件存到 DIR 目录中

--link-dest=DIR

当文件未改变时基于 DIR 创建硬链接文件

--delete 删除那些接收端还有而发送端已经不存在的文件
--delete-before 接收者在传输之前进行删除操作 (默认)

--delete-during

接收者在传输过程中进行删除操作

--delete-after 接收者在传输之后进行删除操作

--delete-excluded

接收者在传输之后进行删除操作

-e,--rsh=COMMAND

指定替代 rsh 的 shell 程序

--ignore-errors

即使出现 I/O 错误也进行删除

--partial

保留那些因故没有完全传输的文件,以是加快随后的再次传输
--progress

在传输时显示传输过程

-P

等价于--partial--progress

--delay-updates

将正在更新的文件先保存到一个临时目录(默认为 “.~tmp~”),待传输完毕再更新目标文件

-v,--verbose

详细输出模式

-q,--quiet

精简输出模式

-h,--human-readable

输出文件大小使用易读的单位(如,K,M等)

-n,--dry-run

显示哪些文件将被传输

--list-only

仅仅列出文件而不进行复制

--rsync-path=PROGRAM

指定远程服务器上的 rsync 命令所在路径

--password-file=FILE

从 FILE 中读取口令,以避免在终端上输入口令,通常在 cron 中连接 rsync 服务器时使用

-4,--ipv4 使用 IPv4
-6,--ipv6 使用 IPv6
--version

打印版本信息

--help 显示帮助信息

一、安装rsync服务

首先在DB1server上安装rsync client服务;DB1 server是源服务器

yum install rsync

Centos RSync+Shell实现数据定时同步_第1张图片

安装完成

Centos RSync+Shell实现数据定时同步_第2张图片

我们同时在DB2server也安装rsync服务;

yum install rsync

我们服务已经安装好了;

Centos RSync+Shell实现数据定时同步_第3张图片

二、配置key验证

接下来我们需要配置key验证,因为数据同步我们不能使用密码验证后再传输同步数据,所以我们需要配置key认证,这样本地服务器与远程服务器之间同步就不需要密码验证了;

其实key验证我们前面的文章中已经有写了,为了方便在此还是说说。在源服务器上我们通过ssh-keygen生成一对验证秘钥,一个公钥,一个私钥;私钥放在远程服务器上即可,私钥需要公钥验证后才可以匹配,所以相对还是比较安全的;

ssh-keygen -t rsa     回车;

因为之前服务器上使用注册的,所以就拿来直接用了;计算机名不一样;请忽略即可;

p_w_picpath

创建目录,认证目录;然后一路回车

Centos RSync+Shell实现数据定时同步_第4张图片

在/root/.ssh 目录下生成了一对密钥文件
id_rsa   私钥
id_rsa.pub     公钥

clip_p_w_picpath003

ssh-copy-id ipaddress
ssh-copy-id 192.168.6.38

只在脚本执行的机器上或者源服务器上执行即可

会自动将公钥拷贝到目标服务器上;

Centos RSync+Shell实现数据定时同步_第5张图片

到此我们就结束了key的配置;

如果提示以下错误的话,我们需要修改hosts

reverse mapping checking getaddrinfo for bogon failed – POSSIBLE BREAK-IN ATTEMPT! 错误,但不影响登录。

原因:ssh 登录的时候会做一系列安全检查,其中有一项是 主机名与ip地址是否能解析,如果解析不了就会报这个错误。

解决方法:在/etc/hosts 文件加上对方的 ip地址  主机名,可以ping通主机名即可。

如果你有dns服务器 ,在服务器上做解析也行。总之,ping主机名必须解析到对应的ip地址;

三、创建数据同步目录;

我们在DB1server上创建同步目录;

mkdir SourceDirectory  创建目录
cd SourceDirectory     进入目录

Centos RSync+Shell实现数据定时同步_第6张图片

然后我们在SourceDirectory目录创建几个测试文件;

vim 1.txt

Centos RSync+Shell实现数据定时同步_第7张图片

然后我们在DB2server上创建target目标目录;

Centos RSync+Shell实现数据定时同步_第8张图片

接下来我们就是数据同步了;我们在没有TargetDirectory目录下创建任何文件,当前目录下为空;

我们使用rsync命令实现DB1--->DB2的数据同步;

执行“推”复制同步----就是将本地/root/SourceDirectory目录下的数据远程同步到192.168.6.38服务器下的/root/TargetDirectory目录下;

注:如果目录结尾不加“/”的话,意思就成将该文件夹同步到目标目录了;

synch -avz --delete /root/SourceDirectory/ [email protected]:/root/TargetDirectory/

Centos RSync+Shell实现数据定时同步_第9张图片

我们在目标服务器上查看同步的数据;

Centos RSync+Shell实现数据定时同步_第10张图片

当然我们也可以实现拉的操作:执行“拉”复制同步----就是将远程服务器192.168.6.38下的/root/TargetDirectory目录下的数据同步到本地/root/SourceDirectory目录下;数据远程同步到192.168.6.38服务器下的/root/TargetDirectory目录下

rsync -avz --delete [email protected]:/root/TargetDirectory/ /root/SourceDirectory/

我们先在DB2server上创建一个文件及编辑内容;

vim 2.txt 

Centos RSync+Shell实现数据定时同步_第11张图片

Centos RSync+Shell实现数据定时同步_第12张图片

接下来我们在DB1server上查看效果;

Centos RSync+Shell实现数据定时同步_第13张图片

我们运行拉的操作命令

rsync -avz --delete [email protected]:/root/TargetDirectory/    /root/SourceDirectory/

Centos RSync+Shell实现数据定时同步_第14张图片

然后我们查看执行结果;数据同步完成;

Centos RSync+Shell实现数据定时同步_第15张图片

四、使用shell脚本定时同步数据;

我们在创建一个sh文件,然后添加执行命令即可

vim rsyncshell.sh
#!/bin/sh
Push_Source="/root/SourceDirectory/" 
Pull_Source="[email protected]:/root/TargetDirectory/"
Push_Target="[email protected]:/root/TargetDirectory/" 
Pull_Target="root/SourceDirectory"
#rsync -avz --delete /root/SourceDirectory/ [email protected]:/root/TargetDirectory/    ----->从本地“推”数据同步   rsync -avz --delete $Push_Source $Push_Target
#rsync -avz --delete [email protected]:/root/TargetDirectory/ /root/SourceDirectory/   ----->从远程“拉”数据同步    #rsync -avz --delete $Pull_Target $Pull_Source
echo "$(date +%Y-%m-%d_%H:%M:%S) -The Data Directoty:$Push_Source to $Push_Target had Sync Sucess" >>/var/log/DataSync.log

 Centos RSync+Shell实现数据定时同步_第16张图片

我们给脚本赋予执行权限,再次

chomd 700 rsyncshell.sh

Centos RSync+Shell实现数据定时同步_第17张图片

我们测试一下脚本;首先我们编辑DB1Server上的数据目录

Centos RSync+Shell实现数据定时同步_第18张图片

Centos RSync+Shell实现数据定时同步_第19张图片

我们执行脚本

./rsyncshell.sh

Centos RSync+Shell实现数据定时同步_第20张图片

我们查看DB2serve上的目录结构

Centos RSync+Shell实现数据定时同步_第21张图片

对了我们在参数中添加了一个delete参数;我们来演示一下效果;

--delete参数的效果是当源目录中的文件和目标目录文件不统一时就会以源头为准,比如源目录下有1.txt\2.txt\3.txt,目标目录下有1.txt\2.txt\3.txt\4.txt,当执行同步的时候,会以源目录为准,源目录没有4.txt,所以会删除目标目录下的4.txt文件。以达到数据统一的目的;

我们现在确认测试数据;DB1serve(源)同步目录有1.txt、2.txt、3.txt

p_w_picpath

同时更新源文件1.txt的内容;

Centos RSync+Shell实现数据定时同步_第22张图片

目标服务器数据;DB2server(目标)同步目录有:1.txt、2.txt、3.txt、4.txt

Centos RSync+Shell实现数据定时同步_第23张图片

同时确认目标服务器的1.txt文件内容;

Centos RSync+Shell实现数据定时同步_第24张图片

所以当我们执行脚本,会将内文件内容及同步目录下的数据进行以源为准进行更新

执行结果:DB2目标服务器的4.txt文件删除,1.txt文件内容以源服务器上的1.txt文件内容为准进行更新

执行脚本;结果我们已经看见了;

Centos RSync+Shell实现数据定时同步_第25张图片

具体我们查看DB2server上的目录结构及文件内容

Centos RSync+Shell实现数据定时同步_第26张图片

Centos RSync+Shell实现数据定时同步_第27张图片

因为脚本内定义了日志记录,所以我们可以查看log

cat /var/log/DataSync.log

Centos RSync+Shell实现数据定时同步_第28张图片

5,使用计划任务进行脚本运行;

我们前面已经介绍了linux中使用 crontab 进行定义计划任务

linux上计划任务的命令为crontab ,通过后面的参数即可配置;我们可以通过man crontab查看相关帮助。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。

同样:crontal 的参数格式为  * * * * *   

一个 * 一小时当中的第几分钟 0-59

第二个 * 一天当中的第几个小时 0-23

第三个 * 一个月当中的第几天 1-31

第四个 * 一年当中的第几个月 1-12

第五个 * 一周当中的星期几 1-7

Centos RSync+Shell实现数据定时同步_第29张图片

我们确认脚本存放路劲

/root/shell/

Centos RSync+Shell实现数据定时同步_第30张图片

crondtal –e  编辑计划任务

每天晚上22:30执行一次

Centos RSync+Shell实现数据定时同步_第31张图片

crontal –l 查看计划任务

p_w_picpath

因为我们脚本内添加了log记录,所以我们可以查看对应的log,查看是否执行成功

cat /var/log/DataSync.log

Centos RSync+Shell实现数据定时同步_第32张图片