利用ssh+rsync+inotify实现数据的异地实时同步

简介:

    在服务器中,通常结合计划任务、shell脚本来执行本地备份。为了进一步提高备份的可靠性,使用异地备份也是非常重要的,利用rsync工具,可以实现快速、高效的异地备份。本篇博客将配置rsync+crond实现定时备份、配置ssh+rsync+inotify实现触发式备份


rsync概述

   rsync(Remote Sync,远程同步)是一个开源的快速备份工具,适用于异地备份、镜像服务器等。作为一种最常用的文件备份工具,往往是Linux和UNIX系统默认安装的基本组件之一

具有以下特性:

(1)可以在不同主机间镜像同步整个目录树和文件系统

(2)可以很容易做到保持原来文件的权限、时间、软硬链接等

(3)支持增量备份

(3)无须特殊权限即可安装

(4)优化的同步算法,传输前执行压缩,文件传输效率高

(5)可以使用 rsh、ssh 方式来传输文件

(6)支持匿名传输,以方便进行网站镜象

杨书凡30.png


1. 配置rsync同步源

    rsync作为同步源时以守护进程运行,为其他客户机提供备份源。需要建立rsync.conf,创建备份账户   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@localhost ~] # vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot =  yes                        // 禁锢在源目录
address = 192.168.1.1                   // 监听地址
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 www1.benet.com    // 描述信息
     read  only =  yes                              // 是否为只读
     dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z    // 同步时不在压缩的文件类型
     auth  users  = backuper                        // 授权账户,如果采用匿名账户,可以去掉
     secrets  file  /etc/rsyncd_users .db          // 存放授权账户信息的数据文件
     
[root@localhost ~] # vim /etc/rsyncd_users.db    //为备份账户建立数据文件
backuper:123.abc                                 // 用:分隔账户和密码,无需建立同名系统用户
[root@localhost ~] # chmod 600 /etc/rsyncd_users.db  //修改权限,避免信息泄露
   
[root@localhost ~] # ls -ld /var/www/html/       //backuper备份用户需要对源目录拥有读取权限
drwxr-xr-x. 3 root root 4096 1月   8 05:28  /var/www/html/
[root@localhost ~] # vim /etc/sysconfig/selinux   //关闭selinux
SELINUX=disabled
[root@localhost ~] # setenforce 0                 //立即生效
[root@localhost ~] # iptables -I INPUT -p tcp --dport 873 -j ACCEPT   //允许tcp873端口通过防火墙
[root@localhost ~] # rsync --daemon               //启动rsync服务
[root@localhost ~] # netstat -anpt | grep rsync
tcp        0      0 192.168.1.1:873             0.0.0.0:*                   LISTEN      4734 /rsync
 
[root@localhost ~] # kill $(cat /var/run/rsyncd.pid)   //若需要关闭rsync服务,可结束kill进程


2. 在发起端使用rsync备份

(1)rsync命令格式及常用备份选项

rsync  [选项]  原始位置   目标位置

    下面是rsync选项的详细介绍,具体应根据实际需求进行选择

-v, --verbose               详细模式输出

-q, --quiet                 精简输出模式

-c, --checksum              打开校验开关,强制对文件传输进行校验

-a, --archive               归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD

-r, --recursive             对子目录以递归模式处理

-R, --relative              使用相对路径信息

-b, --backup                创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。

--backup-dir                将备份文件(~filename)存放在在目录下。

-suffix=SUFFIX              定义备份文件前缀

-u, --update                仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)

-l, --links                 保留软链接

-L, --copy-links            想对待常规文件一样处理软链结

--copy-unsafe-links         仅仅拷贝指向SRC路径目录树以外的链结

--safe-links                忽略指向SRC路径目录树以外的链结

-H, --hard-links            保留硬链结

-p, --perms                 保持文件权限

-o, --owner                 保持文件属主信息

-g, --group                 保持文件属组信息

-D, --devices               保持设备文件信息

-t, --times                 保持文件时间信息

-S, --sparse                对稀疏文件进行特殊处理以节省DST的空间

-n, --dry-run               现实哪些文件将被传输

-W, --whole-file            拷贝文件,不进行增量检测

-x, --one-file-system       不要跨越文件系统边界

-B, --block-size=SIZE       检验算法使用的块尺寸,默认是700字节

-e, --rsh=COMMAND           指定使用rshssh方式进行数据同步

--rsync-path=PATH           指定远程服务器上的rsync命令所在路径信息

-C, --cvs-exclude           使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件

--existing                  仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件

--delete                    删除那些DSTSRC没有的文件

--delete-excluded           同样删除接收端那些被该选项指定排除的文件

--delete-after              传输结束以后再删除

--ignore-errors             及时出现IO错误也进行删除

--max-delete=NUM            最多删除NUM个文件

--partial                   保留那些因故没有完全传输的文件,以是加快随后的再次传输

--force                     强制删除目录,即使不为空

--numeric-ids               不将数字的用户和组ID匹配为用户名和组名

--timeout=TIME IP           超时时间,单位为秒

-I, --ignore-times          不跳过那些有同样的时间和长度的文件

--size-only                 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间

--modify-window=NUM         决定文件是否时间相同时使用的时间戳窗口,默认为0

-T --temp-dir=DIR           DIR中创建临时文件

--compare-dest=DIR          同样比较DIR中的文件来决定是否需要备份

-P 等同于 --partial--progress               显示备份过程

-z, --compress             对备份的文件在传输时进行压缩处理

--exclude=PATTERN          指定排除不需要传输的文件模式

--include=PATTERN          指定不排除而需要传输的文件模式-

-exclude-from=FILE         排除FILE中指定模式的文件

--include-from=FILE        不排除FILE指定模式匹配的文件

--version                  打印版本信息

--address                  绑定到特定的地址

--config=FILE              指定其他的配置文件,不使用默认的rsyncd.conf文件

--port=PORT                指定其他的rsync服务端口

--blocking-io              对远程shell使用阻塞IO

-stats                     给出某些文件的传输状态

--progress                 在传输时现实传输过程

--log-format=formAT        指定日志文件格式

--password-file=FILE       FILE中得到密码

--bwlimit=KBPS             限制I/O带宽,KBytes per second-h, 

--help                     显示帮助信息


(2)配置源的表示方法

    rsync同步源的资源表示方法有两种:

方法一:用户名@主机地址::共享模块名

方法二:rsync://用户名@主机地址/共享模块名


例如:执行以下操作将访问同步源,并下载到本地目录/root下进行备份

1
2
3
4
[root@localhost ~] # rsync -avz backuper@192.168.1.1::wwwroot /root   //两种操作达成效果一样
Password: 
[root@localhost ~] # rsync -avz rsync://backuper@192.168.1.1/wwwroot /root
Password:



配置rsync+crond定时备份

   在实际生产环境中,备份工作通常是按计划重复执行的,可以结合crond服务来定期执行备份计划

案例:每天晚上23:30对源服务器的网站目录做一次同步,同步到/myweb目录下

    为了在同步中不使用密码,需要创建一个密码文件

1
2
3
4
5
6
7
8
9
[root@localhost ~] # mkdir /myweb                  //创建备份文件夹
[root@localhost ~] # vim /etc/service.pass         //创建密码文件
[root@localhost ~] # chmod 600 /etc/server.pass   //设置权限,防止泄露
[root@localhost ~] # crontab -e                    //设置定时任务计划,每晚23:30进行同步
30 23 * * *  /usr/bin/rsync  -az --delete --password- file = /etc/server .pass backuper@192.168.1.1::wwwroot  /myweb
[root@localhost ~] # chkconfig crond on   //重启crond服务
[root@localhost ~] # service crond restart
[root@localhost ~] # ls /myweb/           //验证同步结果
index.html  index.php


配置ssh+rsync+inotify实时同步

    Linux内核从版本2.6.13开始提供inotify通知接口,*用来监控文件系统的变动情况,并作出通知响应,如文件的存取、删除、移动、修改等。利用这一机制,可以非常方便的实现文件异动告警、增量备份,并对文件或目录的变动做出响应

    通过rsync工具与inotify机制相结合,可以实现触发式备份(实时同步)——只要原始位置的文档发生变化,即可立即启动增量备份操作,否则处于静默状态,避免了固定周期备份时存在的延迟性、周期过密等问题

杨书凡31.png


1. 调整inotify内核参数

    Linux内核中,默认的inotify机制提供了三个调控参数,分别表示监控事件队列、最多监控实例数、每个实例最多监控文件数。当需要监控的目录、文件数量过多时,建议加大这三个参数

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # cat /proc/sys/fs/inotify/max_queued_events 
16384                                                // 监控事件队列默认16384
[root@localhost ~] # cat /proc/sys/fs/inotify/max_user_instances 
128                                                  // 最多监控实例数默认128
[root@localhost ~] # cat /proc/sys/fs/inotify/max_user_watches 
8192                                                 // 每个实例最多监控文件数默认8192
[root@localhost ~] # vim /etc/sysctl.conf         //如果监控文件过多,建议加大数量 
fs.inotify.max_queued_events=16384                // 添加三行
fs.inotify.max_user_instances=1024
fs.inotify.max_user_watches=1048576
[root@localhost ~] # sysctl -p                    //立即生效


2. 安装inotify-tool

    使用inotify机制需要安装inotify-tool,以便提供inotifywait、inotifywatch辅助工具程序,用来监控、汇总改动情况。可从网站http://inotify-tool.sourceforge.net下载

1
2
3
4
5
6
7
8
9
10
[root@localhost ~] # tar zxf inotify-tools-3.14.tar.gz 
[root@localhost ~] # cd inotify-tools-3.14
[root@localhost inotify-tools-3.14] # ./configure && make && make install
[root@localhost inotify-tools-3.14] # cd ~
[root@localhost ~] # inotifywait -mrq -e modify,create,move,delete /var/www/html/ 
输入命令后,切换终端向 /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 ysf.php          // 改名为ysf.php文件

上述命令中

inotifywait:可监控modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果

inotifywatch:可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况

-m  表示持续监控

-r  表示递归整个目录

-q  表示简化输出信息

-e  用来指定监控哪些事件


3. 在rsync同步源启用密钥对验证

1
2
3
4
[root@localhost html] # vim /etc/ssh/sshd_config   //修改sshd服务配置文件
PubkeyAuthentication  yes                           // 找到这两项,去掉注释
AuthorizedKeysFile      . ssh /authorized_keys
[root@localhost html] # service sshd reload        //重载服务


4. 在rsync发起端创建ssh密钥对,并将公钥导入到服务器公钥文本     

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~] # ssh-keygen -t rsa         //使用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:                  // 按三下Enter键,实现无口令登录
[root@localhost ~] # ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1    //将公钥文件上传到rsync同步源
The authenticity of host  '192.168.1.1 (192.168.1.1)'  can't be established.
RSA key fingerprint is e5:c6:c7:96:30:eb:04:00:da:e9:43:72:67:d7:ff:e3.
Are you sure you want to  continue  connecting ( yes /no )?  yes
Warning: Permanently added  '192.168.1.1'  (RSA) to the list of known hosts.
root@192.168.1.1's password:                                              // 输入同步源用户密码
Now try logging into the machine, with  "ssh 'root@192.168.1.1'" , and check  in :
   . ssh /authorized_keys
to  make  sure we haven 't added extra keys that you weren' t expecting
[root@localhost ~] # ssh root@192.168.1.1             //成功登录sync同步源
[root@localhost ~] # ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:1C:B4:FB  
           inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0


5. 编写触发式同步脚本

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~] # vim rsync.sh               //编写脚本,若进程已经存在,则忽略本次备份,避免并发执行rsync备份
#!/bin/bash
INOTIFY_CMD= "inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD= "rsync -azH --delete /var/www/html/ root@192.168.1.1:/var/www/html"
$INOTIFY_CMD |  while  read  DIRECTORY EVENT FILE
do
     if  [ $(pgrep  rsync  wc  -l) - le  0 ] ;  then
         $RSYNC_CMD
     fi
done
[root@localhost ~] # chmod +x rsync.sh           //添加执行权限,并且服务器开机自动运行此脚本    
[root@localhost ~] # echo '/root/rsync.sh' >> /etc/rc.local


6. 验证脚本是否正确

(1)执行脚本,并切换到本机/var/www/html目录,执行增、删、改等操作

杨书凡32.png


(2)登录到rsync同步源服务器,查看/var/www/html目录下是否同步

杨书凡33.png










本文转自 杨书凡 51CTO博客,原文链接:http://blog.51cto.com/yangshufan/2059072,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
Ubuntu 安全 网络协议
如何在 Ubuntu 上启用 SSH,安全地远程管理和传输数据
如何在 Ubuntu 上启用 SSH,安全地远程管理和传输数据
214 0
如何在 Ubuntu 上启用 SSH,安全地远程管理和传输数据
|
网络安全
05-rsync与ssh访问流程区别
ssh访问流程 1.首先使用ssh root@172.16.1.41:/backup去请求172.16.1.41服务器的backup目录 2.当请求到达1.41服务器时,去判断/etc/passwd文件是否有root这个用户,如果存在则根据root用户的权限去访问对应的/backup目录 rsync访问流程 1.首先使用rsync -avz rsync_backup@172.16.1.41::backup去请求1.41服务器的backup模块 2.请求到达服务器时,服务器会判断/etc/rsync.password文件验证rsync_backup用户是否存在,如果存在就将虚拟用于程序
124 0
05-rsync与ssh访问流程区别
|
网络安全
04-rsync传输与ssh传输的区别
rsync传输与ssh传输的区别
150 0
04-rsync传输与ssh传输的区别