通過rsync搭建一個遠程備份系統(二)

Rsync+inotify實時備份數據

rsync在同步數據的時候,需要掃描所有文件后進行對比,然后進行差量傳輸,如果文件達到了百萬或者千萬級別以上是,掃描文件的時間也很長,而如果只有少量的文件變更了,那么此時rsync是非常低效的。所以此時需要一個實時監控文件變化的軟件結合rsync來做實時數據備份。

what's inotify

inotify是一個強大的,細粒度的,異步的文件系統事件監控機制,linux內核從2.6.13開始加了這個功能,可以通過監控文件系統添加,刪除,修改移動等事件,利用這個接口,第三方軟件可以監控文件系統添加,刪除,修改移動等事,inotify-tools就是這樣的一個第三方軟件。

install it

安全前首先確認內核大于2.6.13以上,以下重新編譯內核加入inotify的支持,具體方法請自查。

[root@salt ~]# uname -r
2.6.32-504.el6.x86_64
[root@salt ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Nov  4 02:53 max_queued_events
-rw-r--r-- 1 root root 0 Nov  4 02:53 max_user_instances
-rw-r--r-- 1 root root 0 Nov  4 02:53 max_user_watches

如果 ll 后顯示有三個,那么說明支持inotify了。
既然系統支持,那么接下來安裝它 。
官網地址是:https://github.com/rvoicilas/inotify-tools
我這里的下載地址是:https://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

[root@salt tmp]# tar zxf inotify-tools-3.14.tar.gz 
[root@salt tmp]# cd inotify-tools-3.14
[root@salt inotify-tools-3.14]# ./configure --prefix=/usr/local/inotifytools && make && make install [root@salt inotify-tools-3.14]# cd /usr/local/inotifytools/
[root@salt inotifytools]# ls
bin  include  lib  share
[root@salt inotifytools]# ll bin/inotifywa*
-rwxr-xr-x. 1 root root 44319 Nov  4 03:00 bin/inotifywait
-rwxr-xr-x. 1 root root 41425 Nov  4 03:00 bin/inotifywatch

安裝好inotify-tools,會生成inotifywait 或者 inotifywatch 兩個指令,

  • inotifywait用于等待文件或者文件集上的特定事件,可以監控任何文件和目錄設置,并且可以遞歸地監控整個目錄樹
  • inotifywatch用于收集被監控的文件系統統計數據,包括整個inotify時間發生多少次等信息。
inotify 相關參數

inotify定義了一些接口參數,用來限制inotify消耗kernel memory的大小。由于這些參數都是內存參數,因此根據實際情況調節其大小,下面介紹下這些參數:

  • /proc/sys/fs/inotify/max_queued_events 表示調用了inotify_init時分配到inotify_instance中可排隊的event數最大值,超過這值就會被丟棄,但會出發IN_Q_QVRFLOW事件
  • /proc/sys/fs/inotify/max_user_instances 表示每一個real_user ID可創建的inotify instances數量上限。
  • /proc/sys/fs/inotify/max_user_watches 表示每個inotify 實例相關聯的watchs上限,也就是inotify實例監控最大文件的數量,如果文件數量巨大,這個值也需要調高。如我們修改成8百萬
[root@localhost inotify-tools-3.14]# cat /proc/sys/fs/inotify/max_user_watches
8192
[root@localhost inotify-tools-3.14]# echo "3000000" > /proc/sys/fs/inotify/max_user_watches
[root@localhost inotify-tools-3.14]# cat /proc/sys/fs/inotify/max_user_watches
3000000
inotifywait 相關參數

inotifywait是一個監控等待事件,可以配合shell腳本來使用它,下面說下常用的幾個參數:

  • -m (--monitor) 表示處于一直保持時間監聽的狀態
  • -r (--recursive) 表示遞歸查詢目錄
  • -d (--daemon) 守護進程運行
  • -q (--quiet) 表示打印出監控事件
  • -c (--event) 通過此參數可以指定要監控的事件,常見的事件有modify,delete,create和attrib等等
    man inotifywait可以查詢到更多的參數

公司應用案例:rsync+inotify搭建實時同步系統

網站架構簡單概要

這是一個應用商店業務,前端haproxy負載均衡,中間nginx作為web服務節點,網站數據訪問都到后端存儲節點,后端存儲節點與公司app發布節點通過rsync+inotify進行同步,此時你也許會問了,為什么不直接把APP放在后端存儲節點了呢,我們當時是這樣考慮:

  • 存儲節點是有多臺服務器,如果要上傳app的話,就得上傳很多臺服務器,我們通過inotify+rsync就可以上傳到發布機上,自己自動同步到多臺后端存儲服務器了,這樣就實現了上傳到一臺,同步到多臺的效果。
  • 服務器都在阿里云,發布機在內網,公司需要訪問的話,直接訪問內部發布機即可,避免訪問阿里云的服務器,占用它的帶寬資源。

所以下面就通過inotify+rsync來實現app文件的自動同步了

環境介紹:

以下為實驗環境,但是其生產情況和這類似。只不過是服務器數量多了幾臺罷了。

  • 192.168.141.3 發布機 安裝inotify+rsync
  • 192.168.141.4 存儲節點 rsync服務端模式

我們在剛才的操作中,已經在192.168.141.3上的發布機安裝好了rsync+inotify的,192.168.141.4上把rsync配置成服務器模式,發布機配制成客戶端模式,這樣發布機上一有東西都自動同步到存儲節點。

在存儲節點(192.168.141.4)上配置rsync
[root@localhost ~]# useradd store        # 往store家目錄下同步數據
[root@localhost ~]# cat /etc/rsyncd.conf
uid = nobody
gid = nobody
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
[appstore]
path = /home/store
comment = app file
ignore errors
read only = no
write only = no
hosts allow = *
list = false
uid = root
gid = root
auth users = store
secrets file = /etc/server.pass
[root@localhost ~]# cat /etc/server.pass
store:123..aa
[root@localhost ~]# chmod 600  /etc/server.pass
[root@localhost ~]# ll   /etc/server.pass
-rw-------. 1 root root 14 Nov  5 01:42 /etc/server.pass    # 千萬不要忘記600權限
在發布機(192.168.141.3)上的配置

確保inotify安裝正確后,我們首先手動測試下看rsync能不能夠正常傳輸東西

[root@localhost ~]# rsync -vzrtopg --delete --progress /home/store store@192.168.141.4::appstore
Password:
sending incremental file list
store/
store/.bash_logout18 100%    0.00kB/s    0:00:00 (xfer#1, to-check=7/9)
....一堆東西

顯然,上面的狀態說明rsync正常工作的,接下來寫一個腳本,實現rsync+inotify結合工作

[root@localhost ~]# cat syncapp.sh
#!/bin/bash
node1="192.168.141.4"       # 如果有多個服務端,可以node2=xx,node3=xxx,總之自由發揮吧
src=/home/store/            # 確保目錄存在
dst=appstore
user=store
/usr/local/inotifytools/bin/inotifywait  -mrq --timefmt '%d/%m/%y %H:%M'  --format '%T %w%f%e' -e close_write,delete,create,attrib $src \
| while read file
dorsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src  $user@$node1::$dstecho "${file}  was rsynced" >> /var/log/rsyncd.log  2&>1
done

腳本相關參數如下:

  • --timefmt 指定時間的輸出格式
  • --format 指定變化文件的詳細信息
  • -e close_write,delete,create,attrib 需要注意的這個close_write,表示等文件寫完以后在觸發rsync同步,
  • -e modify,delete,create,attrib
測試是否正常工作

我們在發布機下的/home/store上放一個東西,或者新建一個目錄,刪除一個東西,如果存儲節點能夠自動同步過去,那么就正常了。。。。

轉載于:https://www.cnblogs.com/liaojiafa/p/6033520.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457014.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言掃地雷游戲的題目簡介,C語言程序設計課程設計(論文)-掃地雷游戲.doc...

C語言程序設計課程設計(論文)-掃地雷游戲遼 寧 工 業 大 學C語言程序設計 課程設計(論文)題目: 掃地雷游戲院(系): 軟件學院專業班級: 電子商務091班學 號:學生姓名:指導教師:教師職稱: 助 教起止時間:2009…

關于地圖中軌跡的平滑移動的實現

很多人應該都有類似的經歷,叫完車,想看看車離我還有多遠距離?但手機屏幕上的車不是一動不動,就是一跳一跳的漂移。 目前市面上大多產品“軌跡平滑移動”做的并不好。 市面上只有快的打車和一號專車實現了平滑移動,那…

查看centos中的用戶和用戶組

1、用戶列表文件:/etc/passwd/ 2、用戶組列表文件:/etc/group 3、查看系統中有哪些用戶: cut -d : -f 1 /etc/passwd 4、查看可以登錄系統的用戶: cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1 5、查看用戶操作…

【Android】關于參數的傳遞問題

最近遇到了一個bug,在debug條件下可以看出更改后的值,但是在最終顯示的結果中確實沒有更改的值。經過很多次的調試后,才發現最后的原因竟然是因為參數傳遞的時候并沒有將更改后的值傳遞給最終變量。 這時才意識到java中只存在值傳遞&#xff…

android按鈕響應事件嗎,Android 按鈕響應事件的幾種方式

目錄1.在布局中指定onClick屬性布局代碼android:id"id/btn1"android:layout_width"wrap_content"android:layout_height"wrap_content"android:text"button1"android:onClick"click"/>android:id"id/btn2"andr…

Android 開源優秀 Library 推薦

之后的每月會推薦一些優秀的開源 Android libraries,不僅僅是學習,也可以方便的使用到項目中,避免重復的造輪子。 PageIndicatorView 如果你需要在 ViewPager 中指明當前處于哪個畫面中,PageIndicatorView是你的不二選擇。而且真…

Vue2.0王者榮耀助手

vue-gok vue2.0-王者榮耀助手 項目使用的是帶玩游戲平臺提供的API,由于騰訊公司王者榮耀游戲關閉了查看其它人的戰績功能,帶玩平臺受其影響,已將API暫時關閉,所以無法獲得穩定的 DAIWAN-API-TOKEN ,所以會出現DAIWAN-API-TOKEN令…

訪問對象的屬性和方法

class Person(object):name ""age 0height 0weight 0def run(self):print("run")def eat(self,food):print("eat"food)def openDoor(self):print("我已經打開了門")def fillEle(self):print("我已經把大象裝進了冰箱")de…

Android mc怎么和win10聯機,我的世界手機版/win10版聯機完美互通方法

我的世界手機版玩家想要更加方便的操作?0.12.1更新之后,你除了能使用手柄進行方便的操作之外,現在你能完全擺脫小屏幕蹩腳的操作了!win10版在9月9日進行了重大更新,我們能直接使用win10的電腦玩我的世界,而…

十大基礎算法

做為程序員,以下著十大10大基礎實用算法是必須知道的。

[HNOI2004]L語言

1212: [HNOI2004]L語言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1507 Solved: 666[Submit][Status][Discuss]Description 標點符號的出現晚于文字的出現,所以以前的語言都是沒有標點的。現在你要處理的就是一段沒有標點的文章。 一段文章T是由若干小寫字…

對象的初始狀態(構造函數)

class Person(object):# name ""# age 0# height 0# weight 0def run(self):print("run")def eat(self,food):print("eat"food)def __init__(self,name,age,height,weight):# print(name,age,weight,height)print("這里是init")sel…

【bzoj 2434】【codevs 1946】[Noi2011]阿貍的打字機(AC自動機)

2434: [Noi2011]阿貍的打字機 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2477 Solved: 1382[Submit][Status][Discuss]Description 阿貍喜歡收藏各種稀奇古怪的東西,最近他淘到一臺老式的打字機。打字機上只有28個按鍵,分別印有26個小寫英文字母…

android加法服務類,iOS越來越像Android:蘋果簡單做加法遠離精致

原標題:iOS越來越像Android:蘋果簡單做加法遠離精致剛剛結束的WWDC2016的主題演講中,蘋果為我們帶來了最新的iOS 10系統,官方稱本次iOS 10的推出有著多大10項的重要更新,在用戶體驗、界面、Siri、地圖以及音樂方面都有著不少的變化…

JDK源碼學習之Arraylist與LinkedList

ArrayList和LinkedList是我們在開發過程中常用的兩種集合類,本文將從底層源碼實現對其進行簡單介紹。 下圖是Java集合類所涉及的類圖。 一.ArrayList 從上面的集合類圖可以看出,ArrayList實現了List接口。ArrayList是順序的集合容器,容器中可以存放null…

學習記錄4

學習了python基本數據類型,附學習筆記圖及操作圖 轉載于:https://www.cnblogs.com/bgd140206127/p/6549229.html

self 實例對象-代碼詳細解釋

self代表類的實例,而非類哪個對象調用方法,那么該方法中的self就代表那個對象self.__calss__ 代表類名class Person(object):def run(self):print("run")print(self.__class__)p self.__class__("tt",30,10,20)print(p)def eat(sel…

CString之GetBuffer與ReleaseBuffer

我們知道,CString是MFC中提供的方便字符串操作的一個類,非常好使,具有自動動態內存管理功能。 GetBuffer()主要作用是將字符串的緩沖區長度鎖定; ReleaseBuffer()則是解除對緩沖區的鎖定,這樣使得CString對象在以后的代…

mac 編譯android系統,mac 編譯 Android 系統雜記

掛載android分區sudo hdiutil attach ~/android_code/android7.dmg.sparseimage -mountpoint /Volumes/android原放入U盤:echo 188jinghao | sudo -S hdiutil attach ~/android7.dmg.sparseimage -mountpoint /Volumes/android放入機械硬盤sudo hdiutil attach /Vol…

Java開發必須熟悉的Linux命令總結

身為一個Java開發人員,這些常用的Linux命令必須掌握。即使平時開發過程中沒有使用Linux(Unix)或者mac系統,也需要熟練掌握Linux命令。因為很多服務器上都是Linux系統。所以,要和服務器機器交互,就要通過she…