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,如需转载请自行联系原作者

相关文章
|
3天前
|
JSON 监控 Shell
用shell脚本如何获取grafana上的监控数据
用shell脚本如何获取grafana上的监控数据
|
1月前
|
Shell
Shell 过滤数据(cut 截取过滤列)
Shell 过滤数据(cut 截取过滤列)
22 0
|
4月前
|
SQL 分布式计算 运维
使用Grunt shell方式交互处理数据
使用Grunt shell方式交互处理数据
|
8月前
|
Shell 数据库
shell脚本循环查询数据库实现数据输出到csv
shell脚本循环查询数据库实现数据输出到csv
226 0
|
11月前
|
监控 Shell 应用服务中间件
使用crontab配合shell脚本定时检测拉起服务
使用crontab配合shell脚本定时检测拉起服务
147 0
|
Shell 数据库
shell脚本使用mysqldump+mysql同步线上库和测试库数据
shell脚本使用mysqldump+mysql同步线上库和测试库数据
148 0
|
关系型数据库 MySQL Shell
多次循环备份MySQL数据库数据shell脚本
多次循环备份MySQL数据库数据shell脚本
194 1
|
SQL 安全 Ubuntu
数据工程师常用的 Shell 命令
导读:Linux以其强大的命令行称霸江湖,Shell命令是数据极客的必修兵器。探索性数据分析,在需求和数据都不太明确的环境下,使用各种命令进行一次探索与挖掘。从基础的文件查看到简单的统计,再到一些常用的探索性分析命令,其目的都只是为了更好的做数据分析与挖掘而已。
|
XML 存储 SQL
《懒人Shell脚本》之七——格式化处理数据存入数据库实现
0、引言 实际应用开发中遇到:将非格式化的文件数据存储到数据库中。对于传统的格式化的数据:ini/json/xml我们都有现成的类库去实现。而对于如下非格式化的数据呢?以下是我的思考与实现。
109 0
|
Shell Linux Perl
Centos7下定时重启gunicorn进程的shell脚本
Centos7下定时重启gunicorn进程的shell脚本
982 0
推荐文章
更多