1. 程式人生 > >Rsync+inotify備份

Rsync+inotify備份

ash min info 自定義 -h 部分 def bin 遠程

Rsync+inotify
Inotify是一個通知接口,用來監控文件系統的各種變化,如果文件存取,刪除,移動。可以非常方便地實現文件異動告警,增量備份,並針對目錄或文件的變化及時作出響應。rsync+inotify可以實觸發式實時同步增量備份

案例: 實現web上傳視頻文件,寫入NFS共享存儲,然後將NFS存儲內容實時復制至Backup服務器

環境準備

角色 外網IP(NAT) 內網IP(LAN) 安裝工具
Rsync-server eth0:10.0.0.41 eth1:172.16.1.41 rsync-server
nfs-server eth0:10.0.0.31 eth1:172.16.1.31 rsync+inotify

web01 eth0:10.0.0.7 eth1:172.16.1.7 nginx+php
Rsync-Server操作步驟如下:

1.安裝rsync

[root@backup-41 ~]# yum install -y rsyncd
2.配置rsync

[root@backup-41 ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup

secrets file = /etc/rsync.password
log file = /var/log/rsyncd.log
#####################################
[backup]
path = /backup

[data]
path = /data

準備密碼文件以及虛擬用戶對應的虛擬密碼
[root@backup-41 ~]# cat /etc/rsync.password
rsync_backup:123456
[root@backup-41 ~]# ll /etc/rsync.password
-rw------- 1 root root 20 Jul 23 11:42 /etc/rsync.password

創建backup data倉庫目錄
[root@backup-41 ~]# mkdir /backup
[root@backup-41 ~]# chown -R rsync.rsync /backup/

[root@backup-41 ~]# mkdir /data
[root@backup-41 ~]# chown -R rsync.rsync /data/
3.啟動rsync

[root@backup-41 ~]# systemctl restart rsyncd
[root@backup-41 ~]# netstat -lntp|grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1372/rsync
4.nfs客戶端驗證rsync是否正常使用

[root@nfs01 ~]# rsync -avz /root/oldboy [email protected]::backup
Password:
sending incremental file list
oldboy

[root@nfs01 ~]# rsync -avz /root/oldboy [email protected]::data
Password:
sending incremental file list
oldboy
NFS-Server操作步驟如下:

1.安裝nfs

[root@nfs01 ~]# yum install nfs-utils rpcbind -y
2.配置nfs

[root@nfs01 ~]# cat /etc/exports
/data/ 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[root@nfs01 ~]# id www
uid=666(www) gid=666(www) groups=666(www)

[root@nfs01 ~]# mkdir /data
[root@nfs01 ~]# mkdir /data/www
[root@nfs01 ~]# chown -R www.www /data
[root@nfs01 ~]# ll -d /data/
drwxr-xr-x 5 www www 98 Jul 26 09:29 /data/
[root@nfs01 /]# ll -d /data/www/
drwxr-xr-x 2 root root 6 Jul 27 10:40 /data/www/
3.啟動nfs

[root@nfs01 ~]# systemctl restart rpcbind
[root@nfs01 ~]# systemctl restart nfs-server
4.安裝inotify

[root@nfs01 ~]# yum install inotify-tools rsync -y
5.配置inotify

在linux內核中,默認的inotify機制提供了三個調控參數:
[root@nfs01 ~]# ls /proc/sys/fs/inotify/
max_queued_events #設置監控服務實例可以監控的事件個數
max_user_instances #設置用戶可以開啟的服務進程數
max_user_watches #可以監控的最大文件數

參數值修改
cat >> /etc/sysctl.conf <<EOF
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
EOF

使修改的參數生效
[root@nfs01 ~]# sysctl -p

inotify工具中常用於實時同步的命令是inotifywait(監控文件或目錄的變化),如下列出常用參數
-m 表示持續監控
-r 遞歸形式監視目錄
-q 簡化輸出信息
-e 指定要監視的事件(create,move,delete,modify)
--timefmt 自定義時間格式,常用參數‘%y/%m/%d %H:%M‘
--format 自定義輸出格式信息, 常用的格式符如下
%e: 使用了什麽事件
%T: 時間
%w:顯示被監控文件的文件名;
%f:如果發生某事件的對象是目錄,則顯示被監控
6.利用inotifywait實現數據實時監控

[root@nfs01 ~]# inotifywait -mrq --format ‘%e %T %w%f‘ --timefmt ‘%y/%m/%d %H:%M‘ -e close_write,modify,delete,create,move /backup/
7.使用inotifywait配合rsync實現實時同步腳本

[root@nfs01 ~]# vim /server/scripts/inotify_rsync.sh
#!/bin/bash
export RSYNC_PASSWORD=123456
SRC=/data/
[email protected]::backup/

inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read file
do
rsync -az --delete $SRC $DST
done
[root@nfs01 ~]# chmod +x /server/scripts/inotify_rsync.sh
web01操作步驟如下:

1.安裝nginx+php以及nfs相關工具

[root@web01 ~]# yum install nginx php php-fpm php-pdo nfs-utils rpcbind -y
2.配置nfs-client

[root@web01 ~]# mkdir /data/www
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/www /data/www/
#加入開機自動掛載該nfs設備
[root@web01 ~]# tail -n1 /etc/fstab
172.16.1.31:/data/www /data/www nfs defaults 0 0

[root@web01 ~]# umount /data/www/
[root@web01 ~]# mount -a
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data/www 50G 1.6G 49G 4% /data/www
3.配置nginx

[root@web01 ~]# vim /etc/nginx/nginx.conf
user www;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
root /data/www;
index index.php index.html index.htm;
autoindex on;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
include fastcgi_params;
}
}
}
#註意:nginx修改運行用戶需要調整對應的臨時目錄權限
[root@web01 ~]# chown -R www.www /var/lib/nginx/
4.修改php程序運行的屬主和屬組,統一用戶id

[root@web01 ~]# sed -i ‘s#user = apache#user = www#g‘ /etc/php-fpm.d/www.conf
[root@web01 ~]# sed -i ‘s#group = apache#group = www#g‘ /etc/php-fpm.d/www.conf
[root@web01 ~]# egrep "^user|^group" /etc/php-fpm.d/www.conf
user = www
group = www
5.啟動nginx+php

[root@web01 ~]# systemctl start nginx php-fpm
[root@web01 ~]# netstat -lntp|egrep "nginx|php"
tcp 0 0 127.0.0.1:9000 0.0.0.0: LISTEN 1661/php-fpm: maste
tcp 0 0 0.0.0.0:80 0.0.0.0:
LISTEN 1670/nginx: master
6.上傳對應代碼至網站目錄,然後進行附件提交測試

backup補充部分:與nfs-server保持高度一致

1.安裝nfs
[root@backup-41 ~]# yum install nfs-utils -y
2.配置nfs
[root@backup-41 ~]# cat /etc/exports
/data/ 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
3.啟動nfs
[root@backup-41 ~]# systemctl enable nfs-server
[root@backup-41 ~]# systemctl start nfs-server
架構補充部分:進程至後臺

[root@nfs01 ~]# yum install screen -y
[root@nfs01 ~]# screen -S Socket_name #建議指定一個名稱
####進入screen會話---->
1.強制關閉終端
2.ctrl+a+d 退出scrren,但不會結束當前在screen運行的程序
註意: 使用exit會結束screen整個會話
[root@nfs01 ~]# screen -r [pid|socket_name] #如果指定名稱,如果沒有指定名稱需要使用pid

1.前端頁面上傳文件->web服務器
2.web存放的代碼和附件目錄是掛載至nfs存儲上
3.web->nfs->backup
nfs故障
在web上卸載nfs的掛載信息
重新掛載至backup
nfs-server:模擬nfs故障

[root@nfs01 ~]# systemctl stop nfs-server
1.web01處理操作,卸載當前已down的nfs-server,然後重新掛載至backup服務器,解決。
[root@web01 ~]# umount -lf /data/www && mount -t nfs 172.16.1.41:/data/www /data/www/
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.41:/data/www 50G 2.2G 48G 5% /data/www

註意:此時還是無法正常訪問web,因為rsync使用的rsync用戶管理目錄
[root@backup-41 ~]# cat /etc/rsyncd.conf #變更如下配置
uid = www
gid = www
[root@backup-41 ~]# systemctl restart rsyncd
[root@backup-41 ~]# chown -R www.www /data/
[root@backup-41 ~]# chown -R www.www /backup/
nfs-server:nfs故障後恢復

#1.修復nfs-server後,手動拉取backup下的所有數據,保持一致。
rsync -avz --delete [email protected]::data /data/

#2.在web上卸載,然後重新掛載至nfs存儲
[root@web01 ~]# umount /data/www/ && mount -t nfs 172.16.1.31:/data/www /data/www
sersync實時同步
sersync是國人基於rsync+inotify-tools開發的工具,不僅保留了優點同時還強化了實時監控,文件過濾,簡化配置等功能,幫助用戶提高運行效率,節省時間和網絡資源。

sersync優點

1)支持通過配置文件管理
2)真正的守護進程socket(不需要寫腳本)。
3)可以對失敗文件定時重傳(定時任務功能)。
4)第三方的HTTP接口(例如更新cdn緩存)。
5)默認多線程rsync同步。

sersync項目地址

角色 外網IP(NAT) 內網IP(LAN) 安裝工具
nfs-server eth0:10.0.0.31 eth1:172.16.1.31 rsync+inotify+sersync
backup eth0:10.0.0.41 eth1:172.16.1.41 rsync-server
Backup操作步驟如下

1.安裝rsync

[root@backup-41 ~]# yum install rsync -y
2.配置rsync

[root@backup-41 ~]# cat /etc/rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.password
log file = /var/log/rsyncd.log
#####################################
[backup]
path = /backup

[data]
path = /data

建立對應密碼文件

[root@backup-41 ~]# echo "rsync_backup:123456" > /etc/rsync.password
4.創建對應目錄並授權

[root@backup-41 ~]# groupadd -g 666 www
[root@backup-41 ~]# useradd -u 666 -g www www
[root@backup-41 ~]# id www
uid=666(www) gid=666(www) groups=666(www)
[root@backup-41 ~]# mkdir -p /{backup,data}
[root@backup-41 ~]# chown -R www.www /{backup,data}
5.啟動rsync

[root@backup-41 ~]# systemctl enable rsyncd
[root@backup-41 ~]# systemctl start rsyncd
[root@backup-41 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1680/rsync
Nfs-Server操作步驟如下

1.安裝sersync

sersync需要依賴inotify和rsync,所以需要安裝對應軟件

[root@nfs01 ~]# yum install rsync inotify -y

安裝sersync

[root@nfs01 ~]# mkdir /server/tools -p
[root@nfs01 ~]# cd /server/tools/
[root@nfs01 tools]# wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs01 tools]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs01 tools]# mv GNU-Linux-x86/ /usr/local/sersync
[root@nfs01 tools]# cd /usr/local/sersync/
[root@nfs01 sersync]# cp confxml.xml confxml.bak
[root@nfs01 sersync]# vim confxml.xml
5 <fileSystem xfs="true"/> <!-- 文件系統 -->
6 <filter start="false"> <!-- 排除不想同步的文件-->
7 <exclude expression="(.).svn"></exclude>
8 <exclude expression="(.
).gz"></exclude>
9 <exclude expression="^info/"></exclude>
10 <exclude expression="^static/
"></exclude>
11 </filter>

12 <inotify> <!-- 監控的事件類型 -->
13 <delete start="true"/>
14 <createFolder start="true"/>
15 <createFile start="true"/>
16 <closeWrite start="true"/>
17 <moveFrom start="true"/>
18 <moveTo start="true"/>
19 <attrib start="false"/>
20 <modify start="false"/>
21 </inotify>

23 <sersync>
24 <localpath watch="/data/www"> <!-- 監控的目錄 -->
25 <remote ip="172.16.1.41" name="data"/> <!-- backup的IP以及模塊 -->
26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
28 </localpath>

29 <rsync> <!-- rsync的選項 -->
30 <commonParams params="-az"/>
31 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
32 <userDefinedPort start="false" port="874"/><!-- port=874 -->
33 <timeout start="true" time="100"/><!-- timeout=100 -->
34 <ssh start="false"/>
35 </rsync>

        <!-- 每60分鐘執行一次同步-->

36 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--def
ault every 60mins execute once-->
3.啟動sersync服務守護進程

查看啟動參數

[root@nfs01 sersync]# ./sersync2 -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param


參數-d:啟用守護進程模式
參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍
c參數-n: 指定開啟守護線程的數量,默認為10個
參數-o:指定配置文件,默認使用confxml.xml文件
參數-m:單獨啟用其他模塊,使用 -m refreshCDN 開啟刷新CDN模塊
參數-m:單獨啟用其他模塊,使用 -m socket 開啟socket模塊
參數-m:單獨啟用其他模塊,使用 -m http 開啟http模塊
不加-m參數,則默認執行同步程序

啟動配置,可以使用多套配置
[root@nfs01 ~]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

Rsync+inotify備份