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
安装完成
我们同时在DB2server也安装rsync服务;
yum install rsync
我们服务已经安装好了;
二、配置key验证
接下来我们需要配置key验证,因为数据同步我们不能使用密码验证后再传输同步数据,所以我们需要配置key认证,这样本地服务器与远程服务器之间同步就不需要密码验证了;
其实key验证我们前面的文章中已经有写了,为了方便在此还是说说。在源服务器上我们通过ssh-keygen生成一对验证秘钥,一个公钥,一个私钥;私钥放在远程服务器上即可,私钥需要公钥验证后才可以匹配,所以相对还是比较安全的;
ssh-keygen -t rsa 回车;
因为之前服务器上使用注册的,所以就拿来直接用了;计算机名不一样;请忽略即可;
创建目录,认证目录;然后一路回车
在/root/.ssh 目录下生成了一对密钥文件 id_rsa 私钥 id_rsa.pub 公钥
ssh-copy-id ipaddress ssh-copy-id 192.168.6.38
只在脚本执行的机器上或者源服务器上执行即可
会自动将公钥拷贝到目标服务器上;
到此我们就结束了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 进入目录
然后我们在SourceDirectory目录创建几个测试文件;
vim 1.txt
然后我们在DB2server上创建target目标目录;
接下来我们就是数据同步了;我们在没有TargetDirectory目录下创建任何文件,当前目录下为空;
我们使用rsync命令实现DB1--->DB2的数据同步;
执行“推”复制同步----就是将本地/root/SourceDirectory目录下的数据远程同步到192.168.6.38服务器下的/root/TargetDirectory目录下;
注:如果目录结尾不加“/”的话,意思就成将该文件夹同步到目标目录了;
synch -avz --delete /root/SourceDirectory/ [email protected]:/root/TargetDirectory/
我们在目标服务器上查看同步的数据;
当然我们也可以实现拉的操作:执行“拉”复制同步----就是将远程服务器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
接下来我们在DB1server上查看效果;
我们运行拉的操作命令
rsync -avz --delete [email protected]:/root/TargetDirectory/ /root/SourceDirectory/
然后我们查看执行结果;数据同步完成;
四、使用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
我们给脚本赋予执行权限,再次
chomd 700 rsyncshell.sh
我们测试一下脚本;首先我们编辑DB1Server上的数据目录
我们执行脚本
./rsyncshell.sh
我们查看DB2serve上的目录结构
对了我们在参数中添加了一个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
同时更新源文件1.txt的内容;
目标服务器数据;DB2server(目标)同步目录有:1.txt、2.txt、3.txt、4.txt
同时确认目标服务器的1.txt文件内容;
所以当我们执行脚本,会将内文件内容及同步目录下的数据进行以源为准进行更新
执行结果:DB2目标服务器的4.txt文件删除,1.txt文件内容以源服务器上的1.txt文件内容为准进行更新
执行脚本;结果我们已经看见了;
具体我们查看DB2server上的目录结构及文件内容
因为脚本内定义了日志记录,所以我们可以查看log
cat /var/log/DataSync.log
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
我们确认脚本存放路劲
/root/shell/
crondtal –e 编辑计划任务
每天晚上22:30执行一次
crontal –l 查看计划任务
因为我们脚本内添加了log记录,所以我们可以查看对应的log,查看是否执行成功
cat /var/log/DataSync.log