利用rsync備份生產應用(一)
rsync簡單介紹
Rsync(remote synchronize)是一個遠程數據同步工具,可通過LAN/WAN快速同步多臺主機間的文件。Rsync使用所謂的“Rsync算法”來使本地和遠 程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。
Rsync本來是用於替代rcp的一個工具,目前由rsync.samba.org維護,所以rsync.conf文件的格式類似於samba的主配 置文件。Rsync可以通過rsh或ssh使用,也能以daemon模式去運行,在以daemon方式運行時Rsync server會打開一個873端口,等待客戶端去連接。連接時,Rsync server會檢查口令是否相符,若通過口令查核,則可以開始進行文件傳輸。第一次連通完成時,會把整份文件傳輸一次,以後則就只需進行增量備份。
rsync基本特點
1.可以鏡像保存整個目錄樹和文件系統;
2.可以很容易做到保持原來文件的權限、時間、軟硬鏈接等;
3.無須特殊權限即可安裝;
4.優化的流程,文件傳輸效率高;
5.可以使用rsh、ssh等方式來傳輸文件,當然也可以通過直接的socket連接;
6.支持匿名傳輸。
rsync同步算法
1、Rsync同步算法
Rsync只所以同步文件的速度相當快,是因為“Rsync同步算法”能在很短的時間內計算出需要備份的數據,關於Rsync的同步算法描述如下:
假定在1號和2號兩臺計算機之間同步相似的文件A與B,其中1號對文件A擁有訪問權,2號對文件B擁有訪問權。並且假定主機1號與2號之間的網絡帶寬很小。那麽rsync算法將通過下面的五個步驟來完成:
1、2號將文件B分割成一組不重疊的固定大小為S字節的數據塊,最後一塊可能會比S 小。
2、2號對每一個分割好的數據塊執行兩種校驗:一種是32位的滾動弱校驗,另一種是128位的MD4強校驗
3、2號將這些校驗結果發給1號。
4、1號通過搜索文件A的所有大小為S的數據塊(偏移量可以任選,不一定非要是S的倍數),來尋找與文件B的某一塊有著相同的弱校驗碼和強校驗碼的數據塊。這項工作可以借助滾動校驗的特性很快完成。
5、1號發給2號一串指令來生成文件A在2號上的備份。這裏的每一條指令要麽是對文件B經擁有某一個數據塊而不須重傳的證明,要麽是一個數據塊,這個數據塊肯定是沒有與文件B的任何一個數據塊匹配上的。
rsync源碼安裝
[root@cdh-namenode rsync-3.1.2]# ./configure --prefix=/usr/loca/rsync-3.1.2 [root@cdh-namenode rsync-3.1.2]# make [root@cdh-namenode rsync-3.1.2]# make install
安裝後信息(其中conf目錄及其文件需要手動添加)
[root@cdh-namenode rsync-3.1.2]# tree /usr/local/rsync-3.1.2/usr/local/rsync-3.1.2├── bin │ └── rsync ├── conf │ ├── rsyncd.conf │ ├── rsyncd.motd │ └── rsyncd.secrets -->這裏權限須為600 └── share └── man ├── man1 │ └── rsync.1 └── man5 └── rsyncd.conf.56 directories, 6 files
rsyncd.conf配置文件詳解
rsyncd.conf:rsync以daemon模式運行時的配置文件名稱
rsync服務器配置(Daemon模式) 說明: 1. rsync的配置文件為rsyncd.conf,可以使用–config選項指定要使用的配置文件。默認情況下,並沒有提供該配置文件,需要手動創建。 2. 該配置文件由兩部分組成,模塊和參數。 3. 模塊的格式:[Module] 4. 參數的格式:屬性 = 值 5. 以#開頭的表示註釋。值的部分可以是yes、no、0、1、true或false。 全局參數 motd file:指定motd(message of the day)的位置。當客戶端每一次連接時都會顯示該文件中的內容,沒有默認值。 pid file:指定rsync的pid文件存儲位置。 lock file:指定lock文件的位置,確保不會達到最大連接數。默認為/var/run/rsyncd.lock log file:指定rsync的log文件存儲位置。這個文件會在chroot函數被調用前打開 port:指定rsync監聽的端口。默認為873 address:指定rsync監聽的地址。address = 0.0.0.0表示監聽在本機上的所有地址。 syslog facility:指定rsync將log發送到syslog時的log級別。 模塊選項如下 comment:指定模塊的描述信息 path:指定模塊所映射的目錄路徑 max connections:模塊所允許的最大連接數。如果是0則表示沒有限制,如果是負值則表示關閉該模塊。如果用於全局,則表示所有模塊的最大連接數。 read only:是否允許客戶端上傳。yes表示不允許上傳,no表示允許上傳。默認為yes。如果設置為yes,則表示只能下載。 write only:是否允許客戶端下載。yes表示不允許客戶端下載,no允許客戶端下載。默認為no。如果設置為yes,表示只能上傳。 list:是否允許客戶端列出該模塊下的內容。yes允許,no不允許。 uid:username或user ID。指定該模塊傳輸文件時(上傳或下載),守護進程應該具有的UID權限,默認為nobody。當以root權限啟動服務時,uid和gid則表示修改上傳的文件的uid和gid。 gid:groupname或group ID。指定該模塊傳輸文件時(上傳或下載),守護進程應該具有的GID權限,默認為nobody。 exclude:指定多個文件或目錄(相對路徑)不被同步,並將其添加到 exclude 列表中.多個文件(目錄)用空格分隔.作用等同於在客戶端命令中使用–exclude來指定模式. include:該選項針對於exclude,即同步exclude中的哪個文件(目錄),並將其添加到include列表中,覆蓋了exclude指定的文件或目錄。多個文件(目錄)用空格分隔.作用等同於在客戶端命令中使用–include來指定模式. exclude from:和exclude的作用一樣,只不過是exclude是將排除的文件或目錄作為value的,而exclude from則是將排除的文件和目錄寫在文件中的,一行一個文件或目錄。 include from:和include的作用一樣,將包括的文件寫在文件中。 incoming chmod:修改服務器收到的文件的權限。如:incoming chmod = D2775,F664。(D表示目錄,F表示文件) outcoming chmod:修改服務器發送的文件的權限。 auth users與secrets file:這兩個選項只能組合使用 auth users指定由空格或逗號分隔的用戶名列表,只有這些用戶才允許連接該模塊,這裏的用戶和系統用戶沒有任何關系,用戶名和口令以明文方式存放在 secrets file 參數指定的文件中,格式為username:password,常用的文件名為:/etc/rsyncd.secrets,password不能超過8個字符。 註意:secrets file文件的權限只能是啟動rsyncd服務的用戶具有rw權限,其他用戶不能具有任何權限,即600. 示例: auth users = joe:deny @guest:deny admin:rw @rsync:ro susan joe sam 說明:用戶joe以及在guest組中的任何用戶將不能訪問指定的模塊。admin用戶將具有rw的權限(會忽略read only和write only的設置),rsync組中的用戶將具有ro的權限,以及susan、joe和sam將會獲取read only和write only的設置的權限。 timeout:通過該選項可以覆蓋客戶指定的IP超時時間。通過該選項可以確保rsync服務器不會永遠等待一個崩潰的客戶端。超時單位為秒,0表示沒有超時定義,這也是默認值。對於匿名rsync服務器來說,一個理想的數字是600。 strict modes:指定是否檢測口令文件的權限.若為 yes 則口令文件只能被 rsync 服務器運行身份的用戶訪問,其他任何用戶不可以訪問該文件,默認為yes。也就是該文件的權限為600或400。 hosts allow:用一個主機列表指定哪些主機客戶允許連接該模塊.不匹配主機列表的主機將被拒絕.也就是說如果指定hosts allow那麽不在hosts allow指定中的主機都將都拒絕. hosts deny:用一個主機列表指定哪些主機不能連接rsync模塊.如果hosts allow和hosts deny同時指定一臺主機,則以hosts allow為準.hosts allow和hosts deny的格式可以是x.x.x.x或x.x.x.x/n 或x.x.x.x/x.x.x.x或*的形式,也可以是主機名,要求能夠被解析。 ignore errors :可以忽略一些無關的IO錯誤 use chroot:若為 true,則 rsync 在傳輸文件之前首先 chroot 到 path 參數所指定的目錄下.這樣做的原因是實現額外的安全防護,但是缺點是需要 root 權限,並且不能備份指向 path 外部的符號連接所指向的目錄文件。 transfer logging:該選項開啟則記錄下載和上傳操作。如果不配置該選項,則即使配置了log format時,也不會生效。 log format通過該選項用戶在使用transfer logging可以自己定制日誌文件的字段. 其格式是一個包含格式定義符的字符串,但要註意log format使用要在transfer logging選項開啟的時候才可以. 常用的如下: %o表示服務端提供什麽操作,比如是接收send還是發送recv %a表示客戶端的IP地址. %m表示服務端的模塊名稱 %P表示服務端模塊指定的路徑. %t 當前時間 %u 認證的用戶名(匿名時是null) %b 實際傳輸的字節數 %f表示同步的文件. %l表示同步文件的大小. 如:log format = [op]:%o [ip]:%a [module]:%m [path]:%P [file]:%f [size]:%l
生產應用rsyncd.conf配置文件
我是按照自己的需求來編寫rsyncd.conf文件的,首先我希望只有特定的網段可以連接到我的rsync備份服務器進行備份,我兩個業務系統的文件要分兩個目錄進行存儲這樣方便管理,客戶端傳送過來的文件中排除特定文件後綴的文件,上傳到服務器的文件只有root用戶才能進行編輯修改其配置文件如下:
[root@cdh-namenode conf]# cat rsyncd.conf # Minimal configuration file for rsync daemon # See rsync(1) and rsyncd.conf(5) man pages for help # This line is required by the /etc/init.d/rsyncd script # #################### GLOBAL OPTIONS ####################################################### # uid = root gid = root use chroot = no max connections = 200 # limit access to private LANs hosts allow = 192.168.100.0/255.255.255.0 hosts deny = * # The default is for all modules to be read only read only = no write only = no incoming chmod = Du=rwx,Dgo=rx,Fu=rwx,Fgo=rx pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock # This parameter determines whether or not the permissions on the secrets file will be checked. If “strict modes” # is true, then the secrets file must not be readable by any user ID other than the one that the rsync daemon is running under. strict modes = yes secrets file = /usr/local/rsync-3.1.2/conf/rsyncd.secrets motd file = /usr/local/rsync-3.1.2/conf/rsyncd.motd log file = /var/log/rsyncd.log transfer logging = yes log format = [time]:%t [op]:%o [ip]:%a [module]:%m [path]:%P [file]:%f [size]:%l syslog facility = local3 timeout = 300 ###################################### MODULE OPTIONS ############################################### [xn_backup] path = /home/fbackup/xn_backup list=yes ignore errors auth users = xn comment = xn_backup home exclude = upload/ log/ logs/ data/ temp/ tmp/ bak/ *.log *.out *.csv *.txt *.dat *.tar *.zip *.tar.gz *.CSV *.rpm *.tgz *.cap *.bin *.iso *.pcap *.gz *.csv.gz *.CSV.gz [ot_backup] path = /home/fbackup/ot_backup list=yes ignore errors auth users = ot comment = ot_backup home exclude = upload/ log/ logs/ data/ temp/ tmp/ bak/ *.log *.out *.csv *.txt *.dat *.tar *.zip *.tar.gz *.CSV *.rpm *.tgz *.cap *.bin *.iso *.pcap
rsyncd.motd文件
[root@cdh-namenode conf]# cat rsyncd.motd +++++++++++++++++++++++++++ + rsync backup + +++++++++++++++++++++++++++
rsyncd.secrets文件
[root@cdh-namenode conf]# ls -l rsyncd.secrets -rw-------. 1 root root 26 7月 19 11:55 rsyncd.secrets [root@cdh-namenode conf]# cat rsyncd.secrets xn:redhat123 ot:redhat123
全部配置好了後,就可以啟動rsync daemon服務了
[root@cdh-namenode conf]# /usr/local/rsync-3.1.2/bin/rsync --daemon --config=/usr/local/rsync-3.1.2/conf/rsyncd.conf [root@cdh-namenode conf]# ps -ef|grep rsync root 115113 1 0 12:10 ? 00:00:00 /usr/local/rsync-3.1.2/bin/rsync --daemon --config=/usr/local/rsync-3.1.2/conf/rsyncd.conf root 123185 97353 0 12:55 pts/1 00:00:00 grep rsync [root@cdh-namenode conf]#
從客戶端上小試牛刀一把(具體詳見續章利用rsync備份生產應用(二))
備份cdh-datanode1(192.168.100.101)上的/home目錄下的所有內容到rsync服務器(192.168.100.100)上
首先登錄到cdh-datandoe1上,切換到root用戶下在/etc/目錄下新建rsync.passwd文件,裏面填寫認證密碼,認證密碼先需要在服務端rsyncd.secrets上配置好,其文件權限需要設置為600.
[root@cdh-datanode1 home]# ls -l /etc/rsync.passwd -rw-------. 1 root root 10 7月 19 12:00 /etc/rsync.passwd [root@cdh-datanode1 home]# cat /etc/rsync.passwd redhat123 [root@cdh-datanode1 home]#
備份文件到備份服務器(push)
常用需求:備份應用數據到統一備份服務器
[root@cdh-datanode1 home]# /usr/bin/rsync -azvP --password-file="/etc/rsync.passwd" /home/ [email protected]::xn_backup/cdh-datanode1 +++++++++++++++++++++++++++ + rsync backup + +++++++++++++++++++++++++++ sending incremental file list created directory cdh-datanode1 ./ kl/ kl/.bash_logout 100% 0.00kB/s 0:00:00 (xfer#1, to-check=73/76) kl/.bash_profile 100% 171.88kB/s 0:00:00 (xfer#2, to-check=72/76) kl/.bashrc 100% 121.09kB/s 0:00:00 (xfer#3, to-check=71/76) kl/.gnome2/ kl/ss/ kl/ss/auditd 100% 3.41MB/s 0:00:00 (xfer#4, to-check=68/76) kl/ss/blk-availability 100% 1.28MB/s 0:00:00 (xfer#5, to-check=67/76) kl/ss/crond 100% 1.35MB/s 0:00:00 (xfer#6, to-check=66/76) kl/ss/functions 100% 3.46MB/s 0:00:00 (xfer#7, to-check=65/76) kl/ss/halt
從備份服務器下載文件(pull)
常用需求:某個應用服務器上的文件被誤刪了,現在需要恢復這個文件
客戶端模擬重要文件被誤刪
[root@cdh-datanode1 kl]# cd ss/ [root@cdh-datanode1 ss]# ls auditd functions iptables killall mdmonitor netfs nfs-rdma postfix restorecond rsyslog saslauth blk-availability halt jexec lvm2-lvmetad messagebus network ntpd rdisc rhnsd salt-minion single crond ip6tables kdump lvm2-monitor netconsole newss ntpdate rdma rhsmcertd sandbox ss [root@cdh-datanode1 ss]# rm functions rm:是否刪除普通文件 "functions"?y [root@cdh-datanode1 ss]# ls auditd ip6tables killall messagebus newss postfix rhnsd sandbox sshd blk-availability iptables lvm2-lvmetad netconsole nfs-rdma rdisc rhsmcertd saslauthd udev-post crond jexec lvm2-monitor netfs ntpd rdma rsyslog single halt kdump mdmonitor network ntpdate restorecond salt-minion ss [root@cdh-datanode1 ss]# pwd /home/kl/ss [root@cdh-datanode1 ss]#
到備份服務器端查看備份的文件,查詢到後,直接在客戶端利用rsync進行備份還原
[root@cdh-namenode ss]# pwd /home/fbackup/xn_backup/cdh-datanode1/kl/ss [root@cdh-namenode ss]# ls auditd functions iptables killall mdmonitor netfs nfs-rdma postfix restorecond rsyslog saslauthd sshd blk-availability halt jexec lvm2-lvmetad messagebus network ntpd rdisc rhnsd salt-minion single udev-post crond ip6tables kdump lvm2-monitor netconsole newss ntpdate rdma rhsmcertd sandbox ss [root@cdh-namenode ss]#
在客戶端利用rsync進行備份還原,這裏有一點要非常註意的就是源路徑地址最後的/,加/表示同步數據的時候不包含ss目錄只同步ss目錄下面的文件,不加/表示包含ss目錄
[root@cdh-datanode1 ss]# /usr/bin/rsync -azvP --password-file="/etc/rsync.passwd" [email protected]::xn_backup/cdh-datanode1/kl/ss/ /home/kl/ss/ +++++++++++++++++++++++++++ + rsync backup + +++++++++++++++++++++++++++ receiving incremental file list ./ functions 100% 24.24MB/s 0:00:00 (xfer#1, to-check=65/70) sent 64 bytes received 8777 bytes 17682.00 bytes/sec total size is 332288 speedup is 37.58 [root@cdh-datanode1 ss]# ls auditd halt kdump mdmonitor network ntpdate restorecond salt-minion ss blk-availability ip6tables killall messagebus newss postfix rhnsd sandbox sshd crond iptables lvm2-lvmetad netconsole nfs-rdma rdisc rhsmcertd saslauthd udev-post functions jexec lvm2-monitor netfs ntpd rdma rsyslog single [root@cdh-datanode1 ss]#
本文出自 “明鏡亦非臺” 博客,謝絕轉載!
利用rsync備份生產應用(一)