Centos RSync+Shell实现数据定时同步-阿里云开发者社区

开发者社区> 技术小阿哥> 正文

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是源服务器

1
yum install rsync

image

安装完成

image

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

1
yum install rsync

我们服务已经安装好了;

image

二、配置key验证

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

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

1
ssh-keygen -t rsa     回车;

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

image

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

clip_image002

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

clip_image003

1
2
ssh-copy-id ipaddress
ssh-copy-id 192.168.6.38

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

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

clip_image004

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

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

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

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

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

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

三、创建数据同步目录;

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

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

image

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

vim 1.txt

image

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

image

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

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

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

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

1
synch -avz --delete /root/SourceDirectory/ root@192.168.6.38:/root/TargetDirectory/

image

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

image

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

1
rsync -avz --delete root@192.168.6.38:/root/TargetDirectory/ /root/SourceDirectory/

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

vim 2.txt 

image

image

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

image

我们运行拉的操作命令

1
rsync -avz --delete root@192.168.6.38:/root/TargetDirectory/    /root/SourceDirectory/

image

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

image

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

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

1
2
3
4
5
6
7
8
9
vim rsyncshell.sh
#!/bin/sh
Push_Source="/root/SourceDirectory/" 
Pull_Source="root@192.168.6.38:/root/TargetDirectory/"
Push_Target="root@192.168.6.38:/root/TargetDirectory/" 
Pull_Target="root/SourceDirectory"
#rsync -avz --delete /root/SourceDirectory/ root@192.168.6.38:/root/TargetDirectory/    ----->从本地“推”数据同步   rsync -avz --delete $Push_Source $Push_Target
#rsync -avz --delete root@192.168.6.38:/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

 image

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

1
chomd 700 rsyncshell.sh

image

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

image

image

我们执行脚本

1
./rsyncshell.sh

image

我们查看DB2serve上的目录结构

image

对了我们在参数中添加了一个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

image

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

image

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

image

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

image

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

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

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

image

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

image

image

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

1
cat /var/log/DataSync.log

image

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

image

我们确认脚本存放路劲

1
/root/shell/

image

1
crondtal –e  编辑计划任务

每天晚上22:30执行一次

image

1
crontal –l 查看计划任务

image

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

1
cat /var/log/DataSync.log

image



本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1841942,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
sersync+rsync文件目录实时同步
最近需要在生产环境上rsync+inotify实时同步,但是测试发现效果极其不理想,我需要实时同步的目录大小大概为70G。起初用空目录测试的话效果极佳,但是本身我需要同步的目录很大,当我测试写入一个文件时会马上同步到备机,但是脚本后台执行内容日志一直刷扫遍目录下的所有文件,再写入一个文件时是不会马上同步到备机上的,当然等多久我不知道,我想应该会把目录扫遍完成吧!所以在网上找了一个sersync+rsync,我做了一下并发测试,同步效果确实不错。
602 0
centos安装gitlab并进行数据迁移
centos安装gitlab并进行数据迁移
2942 0
MySQL数据库 Event 定时执行任务.
一、背景   由于项目的业务是不断往前跑的,所以难免数据库的表的量会越来越庞大,不断的挤占硬盘空间。即使再大的空间也支撑不起业务的增长,所以定期删除不必要的数据是很有必要的。在我们项目中由于不清理数据,一个表占的空间竟然达到了4G之多。
1218 0
从定性遥感到定量遥感——大数据时代的空间数据科学
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ESA_DSQ/article/details/70475470 笔者最近一周之内连续听了四场关于定量遥感前沿进展的讲座(内容遍布目前定量遥感的诸多热点领域)。
1333 0
CentOS7.3安装mysql数据库
CentOS7.3安装mysql数据库Mysql数据库安装1.环境 操作系统:CentOS 7.3 软件:MySQL 5.7 下载链接:https://cdn.mysql.com//Downloads/MySQL-5.
1420 0
使用DTS从RDS PG实时同步数据到AnalyticDB for PostgreSQL
DTS支持从RDS PG将数据实时同步到AnalyticDB for PG,用户可以很方便的搭建起RDS PG到AnalyticDB for PG的数据同步,轻松实现数据的流转和复杂查询的优化。 使用DTS的前提条件 要求同步的数据表,必须建有主键(通过主键来保证源端和目标端表记录一致性)。
2237 0
厘米级实时定位!自动驾驶梦之队跃上云端
在高级别辅助驾驶领域,高精地图的重要性不言而喻。深耕高精地图市场,面向整车厂、物流公司和互联网出行服务商提供“持续赋能”的动态服务,DeepMap高深智图就是其中的佼佼者。
1050 0
Contoso 大学 - 6 – 更新关联数据
原文 Contoso 大学 - 6 – 更新关联数据 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's Web Platform & Tools Content Team.
712 0
13694
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载