Shell脚本中应用 Rsync 保持两服务器间文件几秒内同步 及 rsync实现服务器间文件同步的正确用法

一、Shell脚本中应用 Rsync 保持两服务器间文件几秒内同步

    今天在服务器间使用rsync同步的时候,一开始还尝试使用另外一个用户进行rsync通信,后来才发现服务器在初始化的时候已经为我们打通好了rsync通道,只要使用rsync用户即可。于是这个工作就简单了许多,直接写定时任务和脚本即可。但因为定时任务只能实现最短1分钟进行一次操作,所以在脚本中进行了循环处理,从而让服务器间同步在秒级里完成。

    定时任务写在:sudo vim /var/spool/cron/rsync 文件中.

[test@kermit vhosts]$ sudo cat /var/spool/cron/rsync
*/1 * * * * /bin/bash /home/rsync/rsync.sh >> /tmp/rsync.log

shell脚本文件:/home/rsync/rsync.sh内容如下:

[test@kermit images]$ sudo vim /home/rsync/rsync.sh                          
#!/bin/bash
cd /opt/data/api.com/images
for ((i=1; i<12; i++))
do
    #在1分钟内每5秒轮询一次,如果有1分钟内修改过文件,就同时向另外三台服务器同步
    fs=`find ./ -type f -mmin -1 | head -1`
    if [ x$fs != x"" ]; then
        echo $(date)
        rsync -avrogtpP --delete --delete-excluded ./* rsync@192.168.162.15:/opt/data/api.com/images/
        rsync -avrogtpP --delete --delete-excluded ./* rsync@192.168.162.16:/opt/data/api.com/images/
        rsync -avrogtpP --delete --delete-excluded ./* rsync@192.168.162.17:/opt/data/api.com/images/
        echo '-----------------------'
    fi
    sleep 5
done

    使用中发现虽然加了a,pP选项,但是同步后文件所属用户和组依然都是rsync,好像如果要保持文件的属组,需要让rsync和要修改的组(比如www)属于同一个组,如下将rsync改成同时归属于www组,同步的文件才能属于rsync组。

    但同步后的文件所属用户依然是一样。但如果只能到这步的话,那就没法实现保持和原来文件的属组一致的属性了。这点后续再看吧。

#这种会把用户从其他组中去掉,只属于该组
[test@kermit images]$ sudo usermod -G www rsync
#添加-a选项实现即属rsync组,也属于www组
[test@kermit images]$ sudo usermod -a -G www rsync
[test@kermit images]$ sudo groups rsync
rsync : rsync www

二、Rsync实现服务器间文件同步的正确用法

    虽然第一章能实现服务器间的同步,但实际这种需要几秒才能同步的速度在高并发系统中是不可接受的,也不是Rsync的正确用法。第一章和这一章都是很久前写的文章了,下面这一章节的内容新一点,是后面整理的 Rsync实现服务器间文件同步的记录。

        rsync的官网地址:https://rsync.samba.org。目前rsync最新版是3.1.2版。rsync的原理也不复杂,在服务器端启动一个rsyncd服务,默认商品是873.然后客户端就可以向服务器端同步文件(上传下载文件)。rsync的安装命令:

wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
cd rsync-3.1.2
mkdir /opt/modules/rsync
./configure --prefix=/opt/modules/rsync
make
make install

     安装成功后,开始编写配置文件,默认调用的配置文件路径是/etc/rsyncd.conf文件。打开写入以下内容:

#以下用户和组运行rsync服务器端
uid = root
gid = root
use chroot = no
#最大连接数
max connections = 2 
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
#注意此处webtest是一个模块。同步的时候在host后面使用::模块名即是此处的名称
[webtest]
#服务器端接收文件后的存储路径
path = /home/rsync
ignore errors
#可写可读控制
read only = false
write only = yes
#是否允许列表展现服务器文件 
list = false
#允许的远程客户端主机
hosts allow = 114.25.8.214
#允许登录的用记名
auth users = root

#服务器端存放密码文件地址,里面存放了客户端的密码格式root:11111
secrets file = /etc/server.pass

     此处注意,密码文件/etc/server.pass的权限必须要改成其它用户不可访问。如果密码文件的权限其它用户可访问则在客户端连接时,服务器端日志中会报错:secrets file must not be other-accessible (see strict modes option),不过因为我们在配置文件中使用了ignore errors表示忽略无关的IO错误。启动的时候未报错误。但日志中会有记录,而在此情况下,当客户机连接服务器时,日志中会有记录用户验证失败(因为服务器端不能读取密码文件,所有不管客户端用什么账户密码都不能通过,原因就是密码文件的权限里不该给其它用户访问权限)如日志:auth failed on module webtest from UNKNOWN (114.25.8.214) for root: ignoring secrets file.

    配置文件写好后,现在启动rsync服务器端:

[root@kermit bin]# /usr/local/rsync/bin/rsync  --daemon
[root@kermit rsync]# ps -ef | grep rsync
root     31984     1  0 21:13 ?        00:00:00 /usr/local/rsync/bin/rsync --daemon

    这时服务器端就启动成功了,接下来我们来使用客户端向服务器端发送文件 ,客户端不需要安装什么,服务器基本都带有这个rsync命令,直接使用。不过在用之前需要配置一下密码文件,因为我们向服务器端发送文件时肯定需要密码,但不能让密码明文展示在命令里吧?所以要写到配置文件,比如/etc/client.pass文件,这里的密码格式和上面的/etc/server.pass不一样,这里只需要写密码即可,比如对应上方的配置,此处直接写11111即可。同样这个客户端的密码文件的权限也必须是其它用户不可访问,否则在执行加载密码文件时会报错:@ERROR: auth failed on module webtest。

    为什么rsync对这个密码文件有这个要求呢?其它也很好理解,这是个密码文件,里面存的都是重要密码啊,所以不能让其它用户有访问权限,不然服务器端就没有安全可言了。好,接下来使用命令向服务器端发送文件:

[root@kermit ~]# rsync -avSH --password-file=/etc/client.pass aa.php root@114.25.8.214::webtest
sending incremental file list
sent 27 bytes  received 8 bytes  70.00 bytes/sec
total size is 66  speedup is 1.89

    从远程服务器读取模块下来使用以下命令:

[root@kermit ~]# rsync -vzrtopg --progress  --delete  --password-file=/etc/client.pass root@114.25.8.214::webtest ./hahahah/
receiving incremental file list
./
aa.php
          66 100%   64.45kB/s    0:00:00 (xfer#1, to-check=1/3)
c.log
          10 100%    9.77kB/s    0:00:00 (xfer#2, to-check=0/3)
sent 68 bytes  received 209 bytes  554.00 bytes/sec
total size is 76  speedup is 0.27

     不过需要注意的是,我上方的配置文件里是写了write only=yes。这样的话是不能实现从服务器端读取的,此时执行上面的读取命令会有日志报错:ERROR: module is write only。需要改成read only = false和write only = false。这样客户端就能对服务器端进行读和写了。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值