rsync远程同步

理论部分:

正确、有效的备份方案是保障系统及数据安全的重要手段,在服务器中,通常会结合计划任务,shell脚本来执行本地备份,为了加强备份的可靠性,使用异地备份也是非常有必要的今天我们将要学习的就是异地灾备的其中一种rsync(Remote Sync 远程同步)工具的使用。以实现快速、安全、高效的异地备份,比如构建Web镜像站点等。

rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持连接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适合异地备份,镜像服务器等引用。

解释:所谓的镜像服务器就是两台主机提供服务的内容是保持同步的,需要一致的,就像我们之前学习的bind服务的主从复制技术,当一台服务器宕机时还能正常的提供服务,当然了镜像服务器一般都会用在负载均衡上面比如像淘宝和京东的网站,用没用这个工具我不知道,但是我敢肯定的是他们的网站一定利用了类似的技术

rsync的官网站点为http://rsync.samba.org 目前最新版本为3.1.2由WayneDavison进行维护,作为一种最常用的文件备份工具,rsync往往是linux系统默认安装的基本组件之一,今天我们以rsync3.0.6-9为例来进行部署这也是rhel6.5自带的软件为例。

clip_image002

图1

默认就是安装好为的,所以我们不需要进行安装

在远程同步中,负责发起rsync同步操作的客户机称为发起端,也就是客户端,而负责响应来自发起端的rsync同步操作的服务器称为同步源。在同步过程中,同步源负责提供文档的原始位置,发起端应该对该位置具有读取权限。(也就是能够进行下载同步源中的文件或目录树)

rsync分为两种上行同步和下行同步,上行同步是指将本地的文件或者目录树上传到同步源,下行同步是从同步源下载文件或目录树。我们先来看一下下行同步。

rsync远程同步_第1张图片

图2

服务器B现在需要与服务器A进行数据同步,那么是服务器B需要和服务器A进行同步那么服务器B就作为发起端向服务器A发出请求,去同步服务器A中的资源,那么服务器A也就成为了同步源,我们通过配置来实现服务器B的需求。我们来看一下具体配置思路。

rsync作为同步源时以进程的方式运行,为其他客户端提供同步源。 我们来看一下下面的实验的拓扑。

rsync远程同步_第2张图片

图3

这里的拓扑是在局域网内完成 的,其实我们也可以通过我们之前所学的知识,在拿一台linux服务器作为网关来连接互联网实现异地备份,这里我们为了简化实验拓扑只在局域网内完成了,原理都是一样的。我们开始做实验来解释rsync的工作原理。

配置rsync同步源需要手动建立配置文件/etc/rsyncd.conf,创建备份的账户文件,然后以--daemon运行。

1、建立/etc/rsyncd.conf配置文件。

vim /etc/rsync.conf

uid = nobody //指定运行程序的用户

gid = nobody //指定运行程序的组

use chroot = yes //禁锢在源目录,这里指的是只能访问我指定的目录不允许访问其他目录,这里类似以vsftpd的禁锢

address = 192.168.100.2 //指定监听的地址

port = 873 //指定监听的端口

log file = /var/log/rsyncd.log //指定日志文件存放的位置

pid file = /var/run/rsyncd.pid //指定进程文件的位置

hosts allow = 192.168.100.0/24 //指定可以访问的地址,这里如果需要实现异地灾备的时候可以写上公网的IP地址,通过路由器映射进来就可以了。

[www] //指定共享的名字

path = /var/www/html //源目录的实际目录

comment = Dcoument Root of web.lzg.com //这个模块的描述信息

read only = yes //目录为只读

dont compress = *.gz *.bz2 *.zip *.z *.rar //同部是不在压缩的文件类型,也就是在传输过程中不在进行二次压缩。

auth users = backuper //授权备份的用户

secrets file = /etc/rsyncd_users.db //指定账户信息的数据文件位置

从上面的配置项来说我们这里需要详细的解释几点

1www共享模块名称,这里呢其实就是发起端访问我时所输入的名字,它就代表了/var/www/html这个实际的路径。还有就是共享模块可以指定多个,格式都是一样的。

2)授权的用户,rsync所使用的用户是需要写在文件中就可以了,与系统用户没有任何关系。

3)如果需要设置匿名同步的时候只需要将auth users secrets file配置项去掉或注释就可以了。

2、建立账户数据文件,这个文件非常好理解,我们来建立一下

vim /etc/rsyncd_users.db 根据配置文件的名字为准

backuper:123.abc //前面为用户名后面为用户的密码

这个文件的权限必须为600否则后面的过程会有问题的。

chmod 600 /etc/rsyncd_users.db

好了权限设置好了之后我们来进行验证一下。

ls /etc/rsyncd_users.db -ld

-rw------- 1 root root 17 10月 17 05:56 /etc/rsyncd_users.db

好了这就是验证的结果我们设置的是没有问题的。

3、启动进程,并设置下次开机自动启动

rsync --daemon

echo "rsync --daemon" >> /etc/rc.local

现在再来看一下是否启动

netstat -anpt | grep 873

tcp 0 0 192.168.100.2:873 0.0.0.0:* LISTEN 24058/rsync

好了我们可以看到监听地址是我们设置的,端口号一定是要为tcp873号端口。我们的进程已经启动了,在/var/www/html目录下创建有些文件让发起端去下载。

touch 123 456 789 1234 4568 789 498 创建了这些文件。我们还有一项最重要的事情就是在防火墙上建立相应的规则

iptables -I INPUT -p tcp --dport 873 -j ACCEPT

到此为止,我们的同步源就配置好了,现在我们来看一下发起端都需要做什么。

有了同步源服务器之后,就可以使用rsync工具来执行远程同步了。我们主要用到的工具就是rsync工具,绝大对数备份程序都会要求指定原始位置、目标位置 rsync命令也是一样,最简单的rsync用法类似于cp命令可以在本地进行复制操作,具体用法与cp类似,这里我就不介绍了,主要介绍的是rsync的命令格式。

rsync的基本格式为 rsync 选项 原始位置 目标位置 常用的选下入选所示:

-r :递归模式,包含目录及子目录的所有文件

-l:对于符号连接文件仍然保持为符号连接文件

-v:显示同步过程中的详细信息

-z:在传输过程中进行压缩

-t:保留文件的时间标记

-p:保留文件的权限标记

-g:保留文件的属组标记

-o:保留文件的属主标记

-H:保留硬链接文件

-A:保留ACL属性信息

-D:保留设备文件及其他特殊文件

-a:归档模式,保留文件的权限、属性等信息,等同于-rlptogD选项的集合

--delete :删除目标位置有而原始位置没有的文件 这个选项的含义就是,发起端的目录有的文件而同步源没有的文件就将发起端的文件删除。

--checksum根据校验和(而不是文件大小,修改时间)来判断是否跳过文件。

以上所常用的主要就是-azvH几个选项其他的作为了解就可以了,更多需要参考 rsync --help 还有很多 我看了一下有100多个吧!在网上可以搜到很多类似的选项解释。

具体的我在网上搜了一篇文章可以进行参考 http://roclinux.cn/?p=2643 这是一个博主写的博客,还不错。

好了看了这么多选项那我们来进行实际的应用吧。以下操作在发起端进行操作。

rsync -avz [email protected]::www /root

Password: 输入用户的密码

receiving incremental file list

./

123

1234

456

4568

498

789

sent 174 bytes received 363 bytes 214.80 bytes/sec

total size is 0 speedup is 0.00

从上面我们可以看出rsync执行的格式来解释一下

n rsync 命令字

n -avz 使用归档模式保留文件的属性并且输出执行过程的详细信息,同时在传输的过程中进行压缩提升传输速度,降低流量

n [email protected] 使用backuper来连接192.168.100.2

n ::用来指定共享模块名 /root同步带的目录

这只是其中的一种方法还有另外一种方法为

-avz rsync://[email protected]/www /root/

Password:

receiving incremental file list

sent 57 bytes received 144 bytes 57.43 bytes/sec

total size is 0 speedup is 0.00

这种方式也可以,这种方式是以共享的方式进行的。这里呢我就不进行详细的解释了,与上面的差不多。

还有一种方式也是经常会使用的,我们来看一下。

执行一下操作将同步源中的www共享模块并下载到/myweb中

我们先创建这个目录

[root@web ~]# mkdir /myweb

在这个目录中创建一个文件名为bbs.php文件,这个文件同步源不存在,之后我们执行同步操作,看一下这个文件还存在吗!

root@web ~]#touch /myweb/bbs.php

root@web ~]# ls /myweb

[root@web ~]# ls /myweb/

bbs.php

好了,现在我们进行同步操作

[root@web ~]# rsync -azv --delete [email protected]::www /myweb/

Password:

receiving incremental file list

./

123

1234

456

4568

498

789

sent 174 bytes received 363 bytes 214.80 bytes/sec

total size is 0 speedup is 0.00

[root@web ~]#

好了,我们来看你一下里面文件都有什么吧

[root@web ~]# ls /myweb/

123 1234 456 4568 498 789

bbs.php文件已经不存在了,这就是--delete的作用,这个选项是比较常用的,用于保证对台主机之间的数据同步。

在实际的生产环境下我们不可能通过这样的方式来执行一般我们都是通过计划任务来实现的,使用计划任务时就需要考虑密码的问题,怎么将密码输入进去,这里我们提供了两种解决方案,一种就是我们之前提到过的使用匿名的方式来实现,当时这样相对来说不是很安全,还有一种呢就是将备份用户的密码写入到一个文件中,在任务执行的过程中去执行他。

vim /etc/backuper.pass //文件的名字随便起

123.abc

建好了之后也需要改成600的权限,也是出于安全考虑,但是也是必须做的,不操作是不可以的,在执行任务计划时通过--password-file 来指定文件路径。

[root@web ~]# chmod 600 /etc/backuper.pass

现在我们就来通过计划任务实现周期性的执行。

在执行之前我们需要查一下rsync命令的绝对路径

[root@web ~]# which rsync

/usr/bin/rsync

crontab -e

*/1 * * * * /usr/bin/rsync -azv --delete --password-file=/etc/backup

er.pass [email protected]::www /myweb/

以上为计划任务的内容,接下来我们通过tail -f /var/log/cron来进行监控计划任务的执行过程

[root@web ~]# tail -f /var/log/cron

Oct 17 06:54:01 web CROND[24234]: (root) CMD (/usr/bin/rsync -azv --delete --password-file=/etc/[email protected]::www /myweb/)

以上为计划任务执行的结果,证明我们的操作是没有任何问题的。 今天的第一个问题就解决了,如何实现一个简单的下行同步。 接下来进行我们今天的第二个知识点上行同步。

所谓的上行同步就是将发起端的文件上传到同步源,比如说,我现在的服务器首先跟新了文件,这时需要同步源同时也存在发起端一样的文件 ,这时就会用到上行同步,也就是所说的上传。我们实行上行同步的时候不能使用rsync来进行同步,因为rsync使用的用户不是系统用户,backuper这个用户属于rsync,它默认有other权限,不能对目录有写入权限,所以他是无法完成上传操作的,还需要使用另外一种同步源ssh同步源,ssh同步源使用ssh协议通讯,相对于rsync更安全一些,因为ssh协议采用的是加密传输。

ssh使用系统用户进行同步,这时就可以将文件或目录写入到目录中了,其中需要我们掌握两个命令,在之前的课程中我们知道,windows是可以针对某一个用户对文件或文件件可以单独的设置权限,我们linux也是可以的。其实我们的这个权限,与所有者,所属组,其他人没人任何关系,我是为某一个用户单独设置的权限。

我们可以通过setfacl命令进行操作。我们来看一下他的命令格式。

setfacl -R -m user:用户名:权限列表(rwx) 目标目录

我们来举一个例子来说明一下

[root@dns ~]# mkdir /opt/zhangsan

[root@dns ~]# ls /opt/zhangsan/ -ld

drwxr-xr-x. 2 root root 4096 Oct 17 10:50 /opt/zhangsan/

[root@dns ~]# touch /opt/zhangsan/123.abc

我们在opt目录下创建了一个子目录张三,在张三的目录下创建了一个文件,我们可以看见zhangsan的目录权限为755作为Other只有读取和指向的权限并没有写入权限。现在我想授予zhangsan用户所有权限,看一下应该如何操作。

[root@dns ~]# setfacl -R -m user:zhangsan:rwx /opt/zhangsan/

[root@dns ~]# getfacl /opt/zhangsan/123.abc

getfacl: Removing leading '/' from absolute path names

# file: opt/zhangsan/123.abc

# owner: root

# group: root

user::rw-

user:zhangsan:rwx

group::r--

mask::rwx

other::r--

以上就是通过设置acl的权限列表 getfacl 文件名 查看acl列表

这是这里如何创建acl权限和如何查看acl权限,之后我会整理一个专门演示ACL权限的文档。今天只是会设置就可以了。这是关于用户拥有对立的读写执行权限。

我们继续研究上行同步,说到了使用ssh实现同步源,还需要一种工具用于检测发起端的文件变化实现自动上传到同步源,这就是我们今天的所需要的工具叫做inotify

从linux内核2.6.13开始内核就提供了这样的接口,用来监控文件的各种变化情况,如文件的存取。修改,删除,创建,更改文件属性等。利用这样的一个机制可以方便的实现文件的异动、报警、异地备份等操作。

将ssh和inotify结合起来可以实现实时同步的功能。

在linux内核中默认提供了三个调整参数:max_queue_events、max_user_intances、max_user_watches,分别表示监控时间队列、最多监控实例,每隔实例最对监控文件数量。

我们来看一下他们的默认参数

[root@dns ~]# cat /proc/sys/fs/inotify/max_queued_events

16384

[root@dns ~]# cat /proc/sys/fs/inotify/max_user_instances

128

[root@dns ~]# cat /proc/sys/fs/inotify/max_user_watches

8192

在实际的生产环境下可以适当的进行更改

vim /etc/sysctl/conf

……省略部分信息

添加三行

fs.inotify.max_ queued_events = 50000

fs.inotify.max_user_instances = 200

fs.inotify.max_user_watches = 2000000

这是这里,接下来我们演示如何通过ssh+inotify实现实时同步

首先在同步源上进行操作

一、配置ssh源分为四步

1、创建用户rput

useradd rput && passwd rput

2、开启sshd服务

[root@web html]# service sshd start

正在启动 sshd: [确定]

3、创建同步目录 //用户将文件上传到哪里

[root@web html]# mkdir /backup

4、设置rput对backup有读写执行权限。

[root@web html]# setfacl -R -m user:rput:rwx /backup

[root@web html]# setfacl -R -m default:user:rput:rwx /backup

//第二条为新建的文件的读写执行权限

二、配置发起端 //实现实时同步需要使用秘钥对的方式验证身份。

1、建立秘钥对文件实现无交互式登录

[root@web html]# ssh-keygen -t rsa

创建过程一路回车就可以了,之前我们也讲过了。

[root@web html]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

The authenticity of host '192.168.100.2 (192.168.100.2)' can't be established.

RSA key fingerprint is 74:f9:20:68:f9:81:89:0f:c8:a1:e8:9d:b3:bc:30:78.

Are you sure you want to continue connecting (yes/no)? yes

……省略部分内容

[root@web html]# ssh [email protected]

[rput@web ~]$exit

[root@web html]#

实现了无交互式验证。

2、在发起端安装inofity工具,我们使用源码安装的方式

可已在http://inotify-tools.souceforge.net进行下载

进入到解压目录 ./configure && make && make 安装就可以了,注意需要提前安装gcc编译器。

我们以监控/var/www/html为例

[root@dns ~]# inotifywait -mrq -e modify,delete,create,move,attrib /var/www/html/

其中

-m:表示持续监控

-r:递归目录

-q:简化输出信息 //只输出三列

-e:指定要监控那些事件

modify修改、create创建、move移动、delete删除、attrib属性修改。

[root@dns ~]touch /var/www/html/123

/var/www/html/

/var/www/html/ ATTRIB 123

在打开一个终端,在/var/www/htnl下创建一个文件就会进行跟踪,我们通过rsync命令将发生变化的文件上传到同步源上

rsync -azH --delete [email protected]:/backup

下面我们通过上面的选项来进行今天的最后一个任务编写一个脚本实现实时同步。

vim /opt/inotify_ssh.sh

#!/bin/bash

inotify_cmd="inotifywait -mrq -e modify,delete,create,attrib,move /va

r/www/html"

rsync_cmd="rsync -azH --delete /var/www/html [email protected]:/backup"

$inotify_cmd | while read directory event file

do

if [ $(pgrep "^rsync$" | wc -l) -le 0 ]; then

$rsync_cmd

echo "$file way rsnyc"

fi

done

通过这个脚本,执行的时候会实时监控并且有了任何修改则进行上传操作。

我们来验证一下

sh /opt/inotify_ssh.sh

123456 way rsnyc

123456 way rsnyc

在打开另外一个终端touch 一个文件在/var/www/html下监控的屏幕就会显示一下内容

我们在同步源查看一下是否成功

[root@web backup]# ls -l

总用量 0

-rw-r--r--+ 1 rput rput 0 10月 17 12:46 123456

可以看出是通过rput建立的文件,我们的实验是成功的。

ps:如果时间不同步的时候可能会给出一些信息,但是实验可以成功只是提示信息而已,看起来比较乱。

今天的远程同步就完成了,像之前的BIND服务我们就可以通过这种方式提供主从复制。