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自帶的軟件爲例。
rsync遠程同步
圖1
默認就是安裝好爲的,所以我們不需要進行安裝
在遠程同步中,負責發起rsync同步操作的客戶機稱爲發起端,也就是客戶端,而負責響應來自發起端的rsync同步操作的服務器稱爲同步源。在同步過程中,同步源負責提供文檔的原始位置,發起端應該對該位置具有讀取權限。(也就是能夠進行下載同步源中的文件或目錄樹)
rsync分爲兩種上行同步和下行同步,上行同步是指將本地的文件或者目錄樹上傳到同步源,下行同步是從同步源下載文件或目錄樹。我們先來看一下下行同步。
rsync遠程同步
圖2
服務器B現在需要與服務器A進行數據同步,那麼是服務器B需要和服務器A進行同步那麼服務器B就作爲發起端向服務器A發出請求,去同步服務器A中的資源,那麼服務器A也就成爲了同步源,我們通過配置來實現服務器B的需求。我們來看一下具體配置思路。
rsync作爲同步源時以進程的方式運行,爲其他客戶端提供同步源。 我們來看一下下面的實驗的拓撲。
rsync遠程同步
圖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 //指定賬戶信息的數據文件位置
從上面的配置項來說我們這裏需要詳細的解釋幾點
1)www共享模塊名稱,這裏呢其實就是發起端訪問我時所輸入的名字,它就代表了/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
好了我們可以看到監聽地址是我們設置的,端口號一定是要爲tcp的873號端口。我們的進程已經啓動了,在/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多個吧!在網上可以搜到很多類似的選項解釋。
好了看了這麼多選項那我們來進行實際的應用吧。以下操作在發起端進行操作。
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執行的格式來解釋一下
rsync 命令字
-avz 使用歸檔模式保留文件的屬性並且輸出執行過程的詳細信息,同時在傳輸的過程中進行壓縮提升傳輸速度,降低流量
[email protected] 使用backuper來連接192.168.100.2
::用來指定共享模塊名 /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服務我們就可以通過這種方式提供主從複製。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章