>백엔드 개발 >PHP 튜토리얼 >rsync+inotify는 Linux 시스템의 서버 간 실시간 파일 동기화를 실현합니다.

rsync+inotify는 Linux 시스템의 서버 간 실시간 파일 동기화를 실현합니다.

高洛峰
高洛峰원래의
2017-02-07 16:40:491524검색

이전에 "SSH 신뢰 및 SCP 자동 전송 스크립트"에 대한 기술 문서를 작성한 적이 있습니다. 이 솔루션은 회사에서 백업 방법으로 사용되지만 실제 작동에서는 메인 서버가 백업 서버로 전송하기 때문에 메인 서버 서버가 백업해야 할 파일이 실시간으로 지속적으로 생성되기 때문에, 메인 서버가 백업 서버로 전송한 파일이 얼마나 되는지 알 수 없습니다. 백업을 하는 방법은 하나는 파일을 보관하는 것이고, 다른 하나는 메인 서버의 문제를 해결하는 것입니다. 디스크가 가득 차 있지만 백업 서버에 얼마나 많은 파일이 수신되었는지 모르기 때문에 감히 삭제할 수 없습니다. 메인서버에 있는 파일들 (백업도 안하고 삭제하면 문제가 심각해집니다. 정부과제이고 서버에 있는 파일들도 다 중요한 파일입니다. 잘못 삭제하시면 퇴사합니다~~ ~~(>_다음은 회사 운영 및 유지 관리를 위해 작성한 백업 기술 문서입니다. 모든 분들께 도움이 되길 바랍니다.

먼저 온라인에서 찾은 rsync와 inotify를 소개하겠습니다. 먼저 rsync 및 inotify에 대한 다음 소개는 제가 작성한 것이 아님을 선언하겠습니다.

1. rsync

rsync는 기존 cp 및 tar 백업 방법에 비해 높은 보안, 빠른 백업이라는 장점이 있으며, 증분 백업을 지원하여 실시간 요구 사항을 해결할 수 있습니다. 원격 서버에 대한 파일 서버 데이터의 정기적인 백업, 로컬 디스크의 정기적인 데이터 미러링 등과 같은 백업 요구 사항
응용 프로그램 시스템의 규모가 계속 확장됨에 따라 데이터 보안 및 안정성에 대한 더 나은 요구 사항이 제시됩니다. rsync는 고급 비즈니스 시스템에서 점차 많은 단점을 노출했습니다. 우선, rsync가 데이터를 동기화할 때 모든 파일이 필요합니다. 차동 전송을 위해 스캔되고 비교됩니다. 파일 수가 수백만 또는 수천만 개에 도달하면 모든 파일을 검색하는 데 매우 많은 시간이 소요됩니다. 그리고 변화하는 것은 종종 그것의 아주 작은 부분일 뿐이며, 이는 매우 비효율적인 방식입니다. 둘째, rsync는 실시간으로 데이터를 모니터링하고 동기화할 수 없습니다. Linux 데몬을 통해 동기화를 트리거할 수 있지만 두 트리거 작업 간에 시간 차이가 발생하므로 서버와 클라이언트 데이터가 일치하지 않을 수 있습니다. 애플리케이션 오류 발생 시 데이터 복구를 완료합니다. 위의 이유를 바탕으로 rsync+inotify 조합이 등장했습니다!
2. inotify
Inotify는 강력하고 세분화된 비동기 파일 시스템 이벤트 모니터링 메커니즘입니다. 2.6.13부터 Linux 커널에 Inotify 지원이 추가되었습니다. 수정, 이동 및 기타 미묘한 이벤트를 통해 이 커널 인터페이스를 사용하여 타사 소프트웨어는 파일 시스템 아래 파일의 다양한 변경 사항을 모니터링할 수 있으며 inotify-tools는 이러한 타사 소프트웨어입니다.
위 장에서 rsync가 트리거된 파일 동기화를 달성할 수 있다고 언급했지만, crontab 데몬을 통해 트리거되면 동기화된 데이터가 실제 데이터와 다르며, inotify는 파일 시스템의 다양한 변경 사항을 모니터링할 수 있습니다. , 파일에 변경 사항이 있으면 rsync 동기화가 트리거되어 데이터의 실시간 동기화 문제를 해결합니다.

rsync 및 inotify의 설치, 구성 및 테스트를 시작하겠습니다.

다음은 두 서버의 구조이며, 호스트 이름, IP, 상태, 커널, 비트 수, 동기화된 디렉터리이며 두 서버 모두 redhat5.4 릴리스 버전입니다.

rsync+inotify는 Linux 시스템의 서버 간 실시간 파일 동기화를 실현합니다.

1. 메인 서버(서버측, 여기는 nginx)

메인 서버는 rsync와 inotify를 설치해야 하며, 메인 서버는 그 역할을 합니다. 서버에서 백업 서버 클라이언트로 파일 전송

1. rsync 설치

[root@nginx ~]# cd /usr/src/
[root@nginx src]# ll
total 16
drwxr-xr-x 2 root root 4096 Jan 26 2010 debug
drwxr-xr-x 2 root root 4096 Jan 26 2010 kernels
[root@nginx src]# wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz
[root@nginx src]# tar zxvf rsync-3.0.9.tar.gz
[root@nginx src]# cd rsync-3.0.9
[root@nginx rsync-3.0.9]# ./configure --prefix=/usr/local/rsync
[root@nginx rsync-3.0.9]# make
[root@nginx rsync-3.0.9]# make install

2. rsync-pwd가 수행할 수 있는 비밀번호 인증 파일

[root@nginx rsync-3.0.9]# cd /usr/local/rsync/ 
[root@nginx rsync]# echo "rsync-pwd" >/usr/local/rsync/rsync.passwd

을 생성합니다. 비밀번호 자체 설정, rsync .passwd 이름은 직접 설정할 수도 있습니다

[root@nginx rsync]# chmod 600 rsync.passwd

보안을 위한 것인지 다음 오류를 피하기 위해 비밀번호 파일에 600개의 권한을 부여해야 합니다

password file must not be other-accessible 
continuing without password file

3. inotify 설치

[root@nginx rsync]# cd /usr/src/
[root@nginx src]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@nginx src]# tar zxvf inotify-tools-3.14.tar.gz
[root@nginx src]# cd inotify-tools-3.14
[root@nginx inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
[root@nginx inotify-tools-3.14]# make
[root@nginx inotify-tools-3.14]# make install

4. rsync 복사 스크립트 생성

이 기능은 주로 서버 측에서 /tmp 디렉토리의 내용을 복사하는 데 사용됩니다. 수정(파일 추가, 수정, 삭제 등)을 하면 inotify를 통해 사용할 수 있다. rsync를 통해 실시간으로 클라이언트의 /tmp에 모니터링하고 동기화한다. 다음은 쉘 스크립트를 통해 구현된다.

#!/bin/bash
host=192.168.10.221
src=/tmp/    
des=web
user=webuser
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

참고: 1층에서 프롬프트를 받은 후 rsync.log를 tmp(백업 디렉터리)에 넣거나 항상 복사본을 보내는 경우 rsync를 사용하는 것이 좋습니다. . 로그는 다른 디렉터리(백업 디렉터리 아님)에 저장됩니다.
host는 클라이언트의 IP, src는 서버 측에서 실시간으로 모니터링할 디렉터리, des는 클라이언트와 일치해야 하는 인증 모듈 이름, user는 인증된 사용자입니다. 비밀번호 파일의 사용자.
이 스크립트의 이름을 rsync.sh로 지정하고 모니터링되는 디렉터리에 넣습니다. 예를 들어 스크립트는 /tmp 아래에 두고 764 권한을 부여합니다.

[root@nginx tmp]# chmod 764 rsync sh

그런 다음 이 스크립트를 실행하세요

[root@nginx tmp]# sh /tmp/rsync.sh &

请记住,只有在备份服务器client端的rsync安装并启动rsync之后,在启动rsync.sh脚本,否则有时候会满屏出现:

rsync: failed to connect to 192.168.10.221: Connection refused (111)  
rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8] 

我们还可以把rsync.sh脚本加入到开机启动项里

[root@nginx tmp]# echo "/tmp/rsync.sh" >> /etc/rc.local 二、备份服务器(client,我这里为nginx-backup)

1、安装rsync(备份服务器只安装rsync)

[root@nginx-backup ~]# cd /usr/src/
[root@nginx-backup src]# ll
total 16
drwxr-xr-x 2 root root 4096 Jan 26 2010 debug
drwxr-xr-x 2 root root 4096 Jan 26 2010 kernels
[root@nginx-backup src]# wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz
[root@nginx-backup src]# tar zxvf rsync-3.0.9.tar.gz
[root@nginx-backup src]# cd rsync-3.0.9
[root@nginx-backup rsync-3.0.9]# ./configure --prefix=/usr/local/rsync
[root@nginx-backup rsync-3.0.9]# make
[root@nginx-backup rsync-3.0.9]# make install

  

2、建立用户与密码认证文件

[root@nginx-backup rsync-3.0.9]# echo "webuser:rsync-pwd" > /usr/local/rsync/rsync.passwd

请记住,在server端建立的密码文件,只有密码,没有用户名;而在备份服务端client里建立的密码文件,用户名与密码都有。

[root@nginx-backup rsync]# chmod 600 rsync.passwd 需要给密码文件600权限

3、建立rsync配置文件

uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web]
path = /tmp/
comment = web file
ignore errors
read only = no
write only = no
hosts allow = 192.168.10.220
hosts deny = *
list = false
uid = root
gid = root
auth users = webuser
secrets file = /usr/local/rsync/rsync.passwd

其中web是server服务端里的认证模块名称,需要与主服务器里的一致,以上的配置我的自己服务器里的配置,以供参考。

把配置文件命名为rsync.conf,放到/usr/local/rsync/目录里

启动rsync
[root@nginx-backup rsync]# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf

如果出现以下问题:

/usr/local/rsync/bin/rsync: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory,

可以采用下面方法解决

[root@nginx-backup rsync]# whereis libiconv.so.2 
libiconv.so: /usr/local/lib/libiconv.so.2 /usr/local/lib/libiconv.so

找到所需模块所在的目录,然后把此目录添加到/etc/ld.so.conf里,并更新库文件

[root@nginx-backup rsync]# echo "/usr/local/lib/" >> /etc/ld.so.conf  
 [root@nginx-backup rsync]# ldconfig

我们可以把rsync脚本加入到开机启动项里

[root@nginx-backup rsync]# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local

现在rsync与inotify在server端安装完成,rsync在备份服务器client端也安装完成
下面是server端的tmp文件情况

rsync+inotify는 Linux 시스템의 서버 간 실시간 파일 동기화를 실현합니다.

下面是client端tmp的文件情况

rsync+inotify는 Linux 시스템의 서버 간 실시간 파일 동기화를 실현합니다.

接下来我们来做一下测试,在server里创建个test-rsync文件,看看client是否能收到

rsync+inotify는 Linux 시스템의 서버 간 실시간 파일 동기화를 실현합니다.

在看client端是否有test-rsync文件,同时client端的tmp目录文件是否与server端的文件完全一致

rsync+inotify는 Linux 시스템의 서버 간 실시간 파일 동기화를 실현합니다.

可以看到在client端,已经收到了test-rsync文件,而且client的tmp里的文件与server里tmp的文件完全相同、文件数目一致。

现在rsync与inotify的搭建与配置完成了,并实现了服务器直接数据的实时同步;大家可以根据自己的需要来进行相应的配置。

BTW:在rsync+inotify这种备份方法的时候,我公司遇到了一个问题,那就是主服务已经给备用服务同步完数据了,但主服务器磁盘看见满了,需要把已经备份的文件删除,但同时在备份服务器里保留主服务器里的文件,也就是说主服务器里删除文件的时候,备份服务器里不跟着删除文件,我查看了很多英文文档,测试了很多遍,最后找到了一个解决方法,那就是在主服务器里,把rsync.sh这个脚本里第9行的--delete参数给去掉,就可以解决这个问题。

更多rsync+inotify는 Linux 시스템의 서버 간 실시간 파일 동기화를 실현합니다.相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.