rsync远程同步

rsync远程同步

 
大纲
          1. 配置rsync源服务器
                 1.1 配置SSH备份源
                 1.2.配置rsync备份源
          2.使用rsync备份工具
                 2.1 rnync命令的基本用法
                 2.2.rsync备份操作示例
                 2.3.编写rsync备份脚本
          3 配置rsync+inotify实时同步
                 3.1 调整inotify内核参数
                 3.2 安装inotify-tools工具
                 3.3 编写触发久同步脚本
 
简介
正确、有效的备份方案是保障系统及数据安全的重要手段,在服务器中通常会结合计划任务、Shell脚本来执行本地备份。为了进一步提高备份的可靠性,使用异地备份也是非常有必要的。
 
1. 配置rsync源服务器
rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份,镜像服务器等应用。
 
rsync的官方站点位于http://rsync.samba.org,目前最新版本是3.0.9,由Wayne Davison进行维护。作为一种最常用的文件备份工具,rsync往往是Linux/UNIX系统默认安装的基本组件之一。
[root@sky ~]# rpm -q rsync
rsync-3.0.6-9.el6.x86_64
 
在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客户机的rsync同步操作的服务器称为备份源。在下行同步(下载)中,备份源负责提供文档的原始位置,发起端应对该位置具有读取权限;在上行同步(上传)中,备份源负责提供文档的目标位置,发起端应对该位置具有写入权限,如图所示:
使用rsync同歩工具时,备份源既可以是SSH服务器,也可以是以服务模式运行的rsync程序。下面分别讲解配置SSH备份源,rsync备份源的方法。
 
1.1 配置SSH备份源
使用SSH协议的好处是能够基于更安全的远程连接增强备份的保密性。这种方式的备份源最容易配置只要确认源文件夹的位置,并准备一个备份操作用户即可。以服务器A为例,若要将网站目录/var/www/html/作为备份源,允许用户rget做下行备份,用户rput做上行备份可以参考以下操作。
 
(1)新建备份用户rget,rput,分别用来下载上传。
[root@sky ~]# useradd rget
[root@sky ~]# passwd rget
[root@sky ~]# useradd rput
[root@sky ~]# passwd rput
 
(2)确认sshd服务正常运行,只允许用户rget,rput通过SSH登陆访问。
[root@sky ~]# vim /etc/ssh/sshd_config 
UseDNS no
AllowUsers rget rput     <==启用此行可以限定SSH登录用户
[root@sky ~]# service sshd start
 
(3)调整/var/www/html/目录权限使rget用户有权读取,rput用户有权写入。
在Linux文件系统中,正常创建的目录权限为755,文件权限为644,因此对于rget用户来说,默认权限已经满足下行备份的要求。
[root@sky ~]# mkdir -p /var/www/html/
[root@sky ~]# ls -ld /var/www/html/
drwxr-xr-x. 2 root root 4096 4月  24 15:14 /var/www/html/
 
但是对于rput用户来说,要能够写人才有权限做上行备份。建议将目录的属主修改为备份用户;另一方面,为了不影响网站服务器对相关目录的访问,需要为Web服务的运行用户指定额外的权限。例如,若httpd服务的运行用户为daemon,要求用户rput能够全权控制,用户daemon对子目录upload能够全权控制,可以执行以下操作。
[root@sky ~]# chown -R rput:rput /var/www/html/
[root@sky ~]# mkdir /var/www/html/upload
[root@sky ~]# setfacl -R -m user:daemon:rwx /var/www/html/upload    <==设置ACL
 
上述操作中用到Linux文件系统的ACL访问控制机制,通过setfacl命令进行设置。其中“-R”选项表示递归操作,“-m”选项用来指定权限。对于设有ACL的目录或文件,执行"ls-l"命令查看时会发现权限字串末尾多了一个符号“+",或者使用getfacl命令可以查看到详细的ACL属性。
[root@sky ~]# ls -ld /var/www/html/upload/
drwxrwxr-x+ 2 root root 4096 4月  24 15:25 /var/www/html/upload/
[root@sky ~]# getfacl /var/www/html/upload/
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/upload/
# owner: rput
# group: rput
user::rwx
user:daemon:rwx
group::r-x
mask::rwx
other::r-x
 
如果希望新建立的文件,子目录也具有相同的ACL属性,则应为指定目录设置默认ACL属性——在setfacl权限模式中添加“default:”部分。例如,执行以下操作以后,凡是在目录/var/www/html/upload中新建的文档,用户daemon都拥有rwx权限。
[root@sky ~]# setfacl -m default:user:daemon:rwx /var/www/html/upload/
[root@sky ~]# getfacl /var/www/html/upload/ | grep default
getfacl: Removing leading '/' from absolute path names
default:user::rwx
default:user:daemon:rwx      <==新指定的默认ACL属性
default:group::r-x
default:mask::rwx
default:other::r-x
当需要清除所有设置的ACL属性时,setfacl命令的“-x”、“-b"选项,分别用来个别删除和全部删除。例如,如执行”setfacl -R -b /var/www/html/“表示删除所有的ACL属性,若执行”setfacl -R -x user:daemon /var/www/html/upload“则只删除指定的某一项ACL属性。
 
1.2 配置rsync备份源
rsync不仅仅用作远程同步发起端(客户端),也可以作为守护进程运行,为其他客户机提供备份源。配置rsync备份源需要建立配置文件rsync.conf,创建备份账号,然后将rsync程序以”--daemon“选项运行。
 
(1)建立/etc/rsync.conf配置文件。
配置文件rsync.conf位于/etc/目录下,需自行建立。配置内容的格式与Samba服务器类似,下面将以源目录/var/www/html/、备份账号backuper为例:
[root@sky ~]# vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes                       <==禁锢在源目录
address = 192.168.1.10                 <==监听地址                                               
port 873                               <==监听端口
log file = /var/log/rsyncd.log         <==日志文件位置
pid file = /var/run/rsyncd.pid         <==存放进程ID的文件位置                                                 
hosts allow = 192.168.1.0/24           <==允许访问的客户机地址
[wwwroot]                              <==共享模块名称
    path = /var/www/html               <==源目录的实际位置
    comment = Document Root of www.sky.com     
    read only = yes       <==是否为只读
    dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z      <==同步时不再压缩的文件类型
    auth users = backuper                                 <==授权账户
    secrets file = /etc/rsyncd_users.db                   <==存放账户信息的数据文件
 
基于安全性考虑,对于rsync的备份源最好仅允许以只读方式做下行同步,若确实需要做上行同步时建议改用SSH备份源。另外,下行备份可以采用匿名的方式,只要将其中的“auth users”和“secrets file"配置记录去掉就可以了。
 
(2)为备份账户创建数据文件。
根据上一步的设置,创建账号数据文件,添加一行用户记录以冒号分隔,用户名称为backuper密码为qwe.123。由于账号信息采用明文存放因此应调整文件权限,避免账号信息泄露。
[root@sky ~]# vim /etc/rsyncd_users.db
backuper:qwe.123     <==无需建立同名系统用户
[root@sky ~]# chmod 600 /etc/rsyncd_users.db
 
与配置SSH备份源类似,备份用户backuper也需要对源目录/var/www/html有相应的读取权限。实际上只要other组有读取权限,则备份用户backuper和运行用户nobody也就有读取权限了。
 
(3)启动rsync服务程序运行参数为”--daemon"。
上述操作完成以后,执行”rsync --daemon"命令就可以启动rsync服务,以独立监听服务的方式运行。若要关闭rsync服务,可以采取kill进程的方式。
[root@sky ~]# rsync --daemon         <==启动rsync服务
[root@sky ~]# netstat -anpt | grep rsync
tcp        0      0 192.168.1.10:873            0.0.0.0:*                   LISTEN      3563/rsync
[root@sky ~]# kill &(cat /var/run/rsyncd.pid)       <==关闭rsync服务
考虑到异地备份的特殊性,通常并不需要全天不间断运行,最好是在有客户机连接的时候才启用。因此可以将rsync交给超级服务xinetd管理(默认的方式),只要修改相应配置并启动xinetd服务就可以提供rsync服务了。
[root@sky ~]# vim /etc/xinetd.d/rsync
service rsync
{
        disable = no          <==将原有的yes改为no
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon      <==确认有--daemon服务选项
        log_on_failure  += USERID
}
[root@sky ~]# yum -y install xinetd        <==安装xinetd服务
[root@sky ~]# service xinetd start         <==启动xinetd服务
 
 
2.使用rsync备份工具
有了备份源服务器以后,就可以使用rsync工具来执行远程同步了,本节讲解的备份操作均在客户机(发起端)执行。实际上备份源与发起端可以是同一台主机(当然这种情况不常见),其效果相当于本地备份而不是异地备份。
 
2.1 rnync命令的基本用法
几乎所有的备份程序都要求指定原始位置,目标位置,rsync命令也一样。最简单的rsync用法有点类似于cp命令,例如可以将文件/etc/fstab、目录/boot/grub同步备份到/opt/目录下,其中"-r"选项表示递归整个目录树,”-l“选项目来备份链接文件。
[root@sky ~]# rsync /etc/fstab /opt/
[root@sky ~]# rsync -rl /etc/fstab /boot/grub/ /opt/
[root@sky ~]# ls -R /opt/
/opt/:
device.map    grub.conf  minix_stagel_5    stage2
......  //省略部分信息
   
1)命今格式及常用备份选项
从以上操作可以看出,备份的基本格式为”rsync [ 选项 ] 原始位置 目标位置“,其中常用的一些命令选项如下所示,具体应根据实际需求选择(如一avz)
➣  -r:递归模式包含目录及子目录中的所有文件。
➣  -I:对于符号链接文件仍然复制为符号链接文仲。
➣  -v:显示同步过程的详细(verbose)信息。
➣  -a:归档模式,保图文件的权限,属性等信息等同于组合选项”-rlptgoD"。
➣  -z:在传输文件时进行压缩(compress)。
➣  -p:保留文件的权限标记。
➣  -t:保留文件的时间标记。
➣  -g:保留文件的属组标记(仅超级用户使用)。
➣  -o:保图文件的属主标记(仅超级用户使用)。
➣  -H:保留硬连接文件。
➣  -A:保留ACL属性信息。
➣  -D:保留设备文件及其他特姝文件。
➣  --delete:删除目标位置有而原始位置设有的文件。
➣  --checksum:根据校验和(而不是文件大小,修改时间)来决定是否跳过文件。
 
2)配置源的表示方法
在执行远程同步任务时,rsync命令需要指定备份源服务器中的资源位置。对于下行备份操作,备份源对应”原始位置“对于上行备份操作,备份源对应“目标位置”。根据备份源的类型不同,其资源表示方式也不相同。
➣  SSH备份源:表示为”用户名@主机地址:目录路径“的形式,用一个冒号分隔,验证字串与SSH登录类似。例如以下操作将访问SSH备份源,下载到本地/opt/目录进行备份。
[root@sky ~]# rsync -avz rget@192.168.1.10:/var/www/html/ /opt/
➣  rsync备份源:表示为“用户名@主机地址::共享模块名”或者“rsync://用户名@主机地址/共享模块名”的形式,前者为两个冒号分隔,后者为URL地址形式。例如,以下操作将访问rsync备份源,下载到本地/root目录进行备份。
[root@sky ~]# rsync -avz backuper@192.168.1.10::wwwroot /root
或者
 
2.2 rsync备份操作示例
根据上一节讲解的rsync命令格式,备份源表示方法,下面分别展示几种不同的远程同步操作过程。
1)下行同步SSH备份源
将服务器192.168.1.10中的/var/www/html文件夹与客户机本地的/wwwroot文件夹进行同步,保持文件权限和属性、软/硬链接,ACL属性,删除/wwwroot目录中多余的文件,并在传输过程中进行压缩。
[root@sky ~]# mkdir -p /wwwroot        <==创建本地目标文件夹
[root@sky ~]# rsync -avzH --delete rget@192.168.1.10:/var/www/html/ /wwwroot
rget@192.168.1.10's password:              <==验证rget用户的密码
receiving incremental file list
./
index.html
style/
  
sent 37 bytes  received 137 bytes  38.67 bytes/sec
total size is 0  speedup is 0.00
[root@sky ~]# ls /wwwroot/         <==确认同步结果
index.html  style
 
对于同一项远程同步任务,当再次被执行时,将自动进行增量更新,相同的文件将不再重复复制。例如,可以现在服务器端删除style目录,添加index.php文件,然后回到客户端再次执行上例同步操作,则/wwwroot目录中的变化为:下载index.php文件,删除style目录。
[root@sky ~]# rsync -avzH --delete rget@192.168.1.10:/var/www/html/ /wwwroot
rget@192.168.1.10's password:
receiving incremental file list
deleting style/
./
index.php
  
sent 18 bytes  received 100 bytes  47.20 bytes/sec
total size is 0  speedup is 0.00
[root@sky ~]# ls /wwwroot/
index.html  index.php
 
2) 下行同步rsync备份源
当备份源为rsync服务器时,只要将同步操作中的原始位置修改为规范格式,其他操作基本一样。例如,以下操作将访问源服务器中的wwwroot共享模块,并下载到本地的/myweb/目录中。
[root@sky ~]# mkdir /myweb
[root@sky ~]# rsync -avzH --delete backuper@192.168.1.10::wwwroot/ /myweb
Password:        <==验证backuper用户的密码
receiving incremental file list
./
index.html
index.php
  
sent 102 bytes  received 209 bytes  88.86 bytes/sec
total size is 0  speedup is 0.00
[root@sky ~]# ls /myweb/        <==确认同步结果
index.html  index.php
 
3) 上行同步SSH备份源
找到客户机中的/usr/share/doc/HTML/文件夹,将其中的内容上传同步到SSH服务器中的/var/www/html/目录下。由于备份用户rput并非root用户,因此"-g"、“-o”等选项将无法使用。
[root@sky ~]# cd /usr/share/doc/HTML/
[root@sky HTML]# rsync -rlvz --delete img/ rput@192.168.1.10:/var/www/html/
rput@192.168.1.10's password:
sending incremental file list
deleting index.php
deleting index.html
centos-logo.png
header-background.png
html-background.png
  
sent 65470 bytes  received 69 bytes  18725.43 bytes/sec
total size is 65967  speedup is 1.01
 
2.3 编写rsync备份脚本
      实际生产环境中的备份工作通常是按计划重复执行的,例如每天晚上22:30对服务器的网站目录做一次下行同步。定期任务可以交给crond服务来完成,而实际的备份操作则可以写到Shell脚本中。
       由于计划备份中的脚本在后台运行,无法根据提示来输入密码,因此编写rsync备份脚本时如何解决交互验证的问题就成为关键所在。根据备份源的类型不同,可以分别使用不同的方法。
 
1) SSH备份源的无交互验证
对于SSH服务器来说,采用密钥验证是避免交互式登录的最佳方法。例如,只要在客户机中创建无私钥短语的密钥对,然后将公钥文件分发给服务器中的备份用户,就可以实现无密码自动登录了。
[root@sky ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):     <==回车
Enter passphrase (empty for no passphrase):     <==回车
Enter same passphrase again:        <==回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
f3:28:72:ff:eb:d6:28:49:8d:7d:e7:36:5e:60:d8:da root@sky
The key's randomart image is:
+--[ RSA 2048]----+
|        o        |
|      S+  . +    |
|      o+o .+..   |
|   . o....+.oE . |
|    o oo o . +.  |
|     .=+. o..    |
+-----------------+
[root@sky ~]# ssh-copy-id rget@192.168.1.10       <==将公钥分发给服务器
rget@192.168.1.10's password:
Now try logging into the machine, with "ssh 'rget@192.168.1.10'", and check in:
  
  .ssh/authorized_keys
  
to make sure we haven't added extra keys that you weren't expecting.
[root@sky ~]# ssh rget@192.168.1.10       <==无密码自动登录
[rget@sky ~]$ 
 
成功实现免交互自动登录以后,再次使用rsync访问SSH备份源时,也就不再提示需要密码验证了,在脚本中得以自动验证。需要注意的是执行脚本的必须是在客户机中创建密钥对的用户。
[root@sky ~]# rsync -az --delete rput@192.168.1.10:/var/www/html/ /wwwroot/
[root@sky ~]# ls /wwwroot/
common  feedback.html  index.html
 
2)rsync备份源的无交互验证
对于rsync备份源来说,可使用环境变量RSYNC_PASSWORD来存放密码。执行rsync备份任务时,会自动读取该变量的值,并在需要时发送给rsync源服务器来进行验证。
[root@sky ~]# export RSYNC_PASSWORD=qwe.123
[root@sky ~]# rsync -az --delete backuper@192.168.1.10::wwwroot/ /wwwroot/
[root@sky ~]# ls /wwwroot/
common  feedback.html  index.html
相对于SSH源的免交互措施来说,使用密码变量的方法显然是不够安全的,因此若在脚本中使用此方法,应严格控制脚本读取权限避免密码泄露。
以使用RSYNC_PASSWORD变量的方式为例,rsync备份脚本的应用可以参考以下操作。
[root@sky ~]# vim /root/rsync_get_wwwroot.sh
#!/bin/bash
CMD="/usr/bin/rsync"
RSYNC_USER="backuper"
RSYNC_PASSWORD="qwe.123"
ARGS="-az --delete"
SRC="192.168.1.10::wwwroot"
DST="/wwwroot"
mkdir -p $DST
$CMD $ARGS $RSYNC_USER@$SRC $DST
[root@sky ~]# chmod 700 /root/rsync_get_wwwroot.sh
[root@sky ~]# crontab -e
30 22 * * * /root/rsync_get_wwwroot.sh       <==每天22:30执行脚本
[root@sky ~]# service crond start
[root@sky ~]# chkconfig crond on
 
 
3 配置rsync+inotify实时同步
        Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取,删除,移动,修改等。利用这一机制可以非常方便地实现文件异动告警,增量备份,并针对目录或文件的变化及时作出响应。
      使用rsync工具与inotify机制相结合,可以实现触发式备份(实时同步)——只要原始位置的文档发生变化,则立即启动増量备份操作,如下图所示,否则处于静默等待状态。这样一来,就避免了按固定周期备份时存在的延迟性,周朝过密等问题。
正因为inotify通知机制由Linux内核提供,因此主要做本机监控在触发式备份中应用时更适合上行同步。下面依次介绍其配置过程。
 
3.1 调整inotify内核参数
在Linux内核中,默认的inotify机制提供了三个调控参数:max_queue_events,max_user_instances,max_user_watches分别表示监控事件队列(16384),最多监控实例数(128)、每个实例最多监控文件数(8192)。
[root@sky ~]# cat /proc/sys/fs/inotify/max_queued_events
16384
[root@sky ~]# cat /proc/sys/fs/inotify/max_user_instances
128
[root@sky ~]# cat /proc/sys/fs/inotify/max_user_watches
8192
当要监控的目录文件数量较多或者变化较频繁时建议加大这三个参教的值。例如可直接修改/etc/sysctl.conf配置文件,将管理队列设为32768,实例数设为1024,监控数设为1048576(建议大于监控目标的总文件数)。
[root@sky ~]# vim /etc/sysctl.conf 
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@sky ~]# sysctl -p
 
3.2 安装inotify-tools工具
使用inotify机制还需要安装inotify-tools,以便提供inotifywait,inotifywatch辅助工具程序,用来监控,汇总改动情况。目前inotify-tools的最新版本为3.14,可从网站http://inotify-tools.sourceforge.net/下载。
[root@sky home]# tar zxvf inotify-tools-3.14.tar.gz 
[root@sky home]# yum -y install gcc c++
[root@sky home]# cd inotify-tools-3.14
[root@sky inotify-tools-3.14]# ./configure
[root@sky inotify-tools-3.14]# make 
[root@sky inotify-tools-3.14]# make install
以监控网站目录/var/www/html/为例,,可以先执行inotifywait命令,然后在另一个终端向/var/www/html/目录下添加文件,移动文件,跟踪屏幕输出结果。其中选项“-e”用来指定要监控哪些事件,选项“-m”表示继续监控,“-r”表示递归整个目录,“-q”简化输出信息。
[root@sky inotify-tools-3.14]# inotifywait -mrq -e modify,create,move,delete /var/www/html/
/var/www/html/ CREATE index.php      <==创建index.php文件
/var/www/html/ MODIFY index.php        <==修改index.php文件
/var/www/html/ MOVED_FROM index.php    <==重命名index.php文件
/var/www/html/ MOVED_TO text.php       <==改名为text.php文件
/省略部分价息
 
inotifywait可监控modify(修改),create(创建),move(移动),delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果。inotifywatch可用来收集.文件系统变动情况,并在运行结束后输出汇总的变化情况,关于这两个命令的详细用法可以参考其man手册页,配置触发备份任务时只要用inotifywait就可以了。
 
3.3 编写触发久同步脚本
使用inotifywait输出的监控结果中,每行记录中依次包括目录、事件,文件,据此可以识别变动情况。为了简单起见,只要检测到变动时执行rsync上行同步操作即可。需要注意的是,当更新较频繁时应避免并发执行rsync备份——若rsync进程已经有在则忽略本次同步,或者根据rsync进程数量(取决于实际任务)来决定是否同步。
[root@sky ~]# vim /opt/inotify_rsync.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete /var/www/html/ rput@192.168.1.10:/var/www/html"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l-le 0 ] ; then
        $RSYNC_CMD
    fi
done
[root@sky ~]# chmod +x /opt/inotify_rsync.sh
[root@sky ~]# echo '/opt/inotify_rsync.sh /etc/rc.local'
上述脚本用来检测本机/var/www/html目录的变动情况,一旦有更新时触发rsync同步操作,上传备份至服务器192.168.1.10的/var/www/html目录。用户验证采用SSH方式,已经做好无交互登录。
触发式上行同步的验证过程如下所述:
(1) 使用rsync工具执行一次上行同步
(2) 在本机运行/opt/inotify_rsync.sh脚本程序
(3) 切换到本机的/var/www/html目录,执行增加,删除,修改文件等操作。
(4) 查看服务器中的/var/www/html目录下的变化情况。 
 
实际环境:
 





posted @ 2015-05-27 14:02  Hello-Sky  阅读(975)  评论(0编辑  收藏  举报