Rsync學習之旅上

rsync 簡介

什麼是rsync

rsync是一款開源的,快速的,多功能的,可實現全量及增量的本地或遠程數據同步備份的優秀工具。html

全量:將所有數據,進行傳輸覆蓋
增量:只傳輸差別部分的數據redis

實現增量複製原理

Rsync經過其獨特的「快速檢查」算法,實現增量傳輸數據算法

[root@backup ~]#man rsync
Rsync  finds  files  that  need  to  be transferred using a 「quick check」 algorithm (by default)  that  looks  for  files  that  have changed  in  size  or  in  last-modified time.  Any changes in the other preserved attributes (as requested by options) are  made  on the  destination file directly when the quick check indicates that the file’s data does not need to be updated.

在同步備份數據時,默認狀況下,Rsync經過其獨特的「quick check」算法,它僅同步大小或者最後修改時間發生變化的文件或目錄,固然也可根據權限,屬主等屬性的變化同步,但須要指定相應的參數,甚至能夠實現只同步一個文件裏有變化的內容部分,因此,能夠實現快速的同步備份數據。shell

centos 5 rsync 2.x 先比對再同步,速度較慢
centos 6 rsync 3.x 一邊比對,一邊對差別部分進行同步centos

軟件版本

[root@mico ~]# rsync --version
rsync  version 3.1.2  protocol version 31
Copyright (C) 1996-2015 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes, prealloc

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details

rsync 軟件功能介紹

相似於 cp 命令 -- 實現本地備份傳輸數據
相似於scp 命令 -- 遠程備份傳輸數據
相似於 rm 命令 -- 實現無差別同步備份
相似於 ls 命令 -- 本地文件信息查看安全

rsync 命令屬於1 v 4 的命令服務器

rsync==cp

[root@mico practices]# cp -a /root/practices/source/tmp_file.txt  tmp/
cp:是否覆蓋"tmp/tmp_file.txt"? 
[root@mico practices]# rm -rf tmp/tmp_file.txt 
[root@mico practices]# cp -a /root/practices/source/tmp_file.txt  tmp/
[root@mico practices]# ls tmp/
tmp_file.txt
[root@mico practices]# rm tmp/tmp_file.txt 
rm:是否刪除普通空文件 "tmp/tmp_file.txt"?
[root@mico practices]# rsync /root/practices/source/tmp_file.txt tmp/
[root@mico practices]# ls tmp/
tmp_file.txt
[root@mico practices]# ls tmp/tmp_file.txt 
tmp/tmp_file.txt

rsync == scp

使用scp實現

檢查對端服務器目標位置上是否有該文件app

root@vicodona practices]# ls tmp/tmp_file.txt
ls: cannot access tmp/tmp_file.txt: No such file or directory

從本地拷貝到遠端服務器上ssh

[root@mico practices]# ls tmp/tmp_file.txt 
tmp/tmp_file.txt
[root@mico practices]# scp -rp /root/practices/source/tmp_file.txt 47.107.108.121:/root/practices/tmp/
The authenticity of host '47.107.108.121 (47.107.108.121)' can't be established.
ECDSA key fingerprint is SHA256:XRAgcbGsezufwlo5zaYbN4gO/8tS7pHAcNtfc7T1URA.
ECDSA key fingerprint is MD5:e0:07:d1:80:ae:1f:8c:58:46:69:15:d6:46:0e:76:4f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '47.107.108.121' (ECDSA) to the list of known hosts.
root@47.107.108.121's password: 
tmp_file.txt                               100%    0     0.0KB/s   00:00    
[root@mico practices]#

檢查遠端服務器上的結果socket

[root@vicodona practices]# ls tmp/tmp_file.txt
tmp/tmp_file.txt
使用rsync實現
[root@mico practices]# rsync -rp /root/practices/source/tmp_file.txt 47.107.108.121:/root/practices/tmp/
root@47.107.108.121's password: 
[root@mico practices]#

檢查遠端服務器上的結果

[root@vicodona practices]# ls tmp/tmp_file.txt
tmp/tmp_file.txt

rsync==rm

rm 操做
[root@mico practices]# ls source/tmp_file.txt 
tmp/tmp_file.txt
[root@mico practices]# rm -rf source/tmp_file.txt 
[root@mico practices]# ll source/tmp_file.txt
ls: 沒法訪問source/tmp_file.txt: 沒有那個文件或目錄
[root@mico practices]#
rsync操做

建立一個空目錄,使用空目錄進行無差別同步

[root@mico practices]# ll tmp/
總用量 0
-rw-r--r-- 1 root root 0 7月  12 15:17 tmp_file.txt
[root@mico practices]# mkdir null
[root@mico practices]# rsync --delete null/ tmp/
rsync: --delete does not work without --recursive (-r) or --dirs (-d).
rsync error: syntax or usage error (code 1) at main.c(1567) [client=3.1.2]
[root@mico practices]# rsync -a --delete null/ tmp/
[root@mico practices]# ll tmp/
總用量 0

rsync==ls -l

使用 rsync 能夠實現與ls相似的功能

[root@mico practices]# ls -l source/tmp_file.txt 
-rw-r--r-- 1 root root 0 7月  12 15:44 source/tmp_file.txt
[root@mico practices]# rsync source/tmp_file.txt 
-rw-r--r--              0 2019/07/12 15:44:57 tmp_file.txt
[root@mico practices]#

rsync 命令特性(7個)

  • 支持拷貝普通文件與特殊文件如連接文件,設備等。
  • 能夠有排除指定文件或目錄同步的功能,至關於打包命令tar的排除功能。
#tar zcvf backup_1.tar.gz  /opt/data  -exclude=mico   
    說明:在打包/opt/data時就排除了mico命名的目錄和文件。
  • 能夠作到保持原文件或目錄的權限、時間、軟硬連接、屬主、組等全部屬性均不改變-p。
  • 可實現增量同步,既只同步發生變化的數據,所以數據傳輸效率很高(tar -N)
# 將備份/home 目錄自 2008-01-29 以來修改過的文件
    # tar -N 2008-01-29 -zcvf /backups/inc-backup_$(date +%F).tar.gz /home
    # 將備份 /home 目錄昨天以來修改過的文件
    # tar -N $(date -d yesterday "+%F") -zcvf /backups/inc-backup_$(date +%F).tar.gz /home
    # 添加文件到已經打包的文件
    # tar -rf all.tar *.gif
    說明:這條命令是將全部.gif的文件增長到all.tar的包裏面去。-r是表示增長文件的意思。
  • 可使用rcp、rsh、ssh等方式來配合進行隧道加密傳輸文件(rsync自己不對數據加密)
  • 能夠經過socket(進程方式)傳輸文件和數據(服務端和客戶端)*****。重點掌握。
  • 支持匿名的或認證(無需系統用戶)的進程模式傳輸,可實現方便安全的進行數據備份及鏡像。

rsync 的企業工做常見說明

  • 兩臺服務器之間數據同步(定時任務cron+rsync)
    同步網站內部人員數據信息(定時任務最小週期爲1分鐘)

  • 兩臺服務器之間數據同步(實時任務inotify/sersync/lrsyncd+rsync)
    同步網站用戶人員數據信息

rsync的使用方式

rsync軟件工做方式

SYNOPSIS
        本地數據同步方式
       Local:  rsync [OPTION...] SRC... [DEST]
        遠程數據同步方式
       Access via remote shell:
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
        守護進程方式同步數據
       Access via rsync daemon:
         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
               rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
               rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

本地數據同步方式(相似於cp)

Local:  rsync [OPTION...] SRC... [DEST]
參數 含義
rsync 數據同步命令
[OPTION...] rsync命令參數信息
SRC 要同不得數據信息(文件或目錄)
[DEST] 將數據傳輸到什麼位置

實例演示命令

[root@backup ~]# rsync  /etc/hosts /tmp/
[root@backup ~]# ls /tmp/hosts
/tmp/hosts

遠程數據同步方式(相似scp)---又稱爲隧道傳輸

Access via remote shell:
  Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

說明:須要進行交互傳輸數據。若是想實現免交互傳輸數據,須要藉助ssh+key方式實現

pull: 拉:
[USER@] : 以什麼用戶身份傳輸數據信息
HOST: 遠程主機信息(IP地址信息 主機名稱信息)
SRC: 遠端要恏過來的數據信息
[dest] 恏到本地什麼位置
push:推:
SRC: 本地要懟過去的數據信息
DEST 懟到遠端什麼位置

【實踐操做】pull拉

從遠端拉文件到當前目錄

[root@vicodona tmp]# touch 1.txt
[root@vicodona tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Jul 13 16:00 1.txt
[root@vicodona tmp]# pwd
/root/practices/tmp
----------------------------------------
[root@mico tmp]# rsync 47.107.108.121:/root/practices/tmp/1.txt .
root@47.107.108.121's password: 
[root@mico tmp]# ll
總用量 0
-rw-r--r-- 1 root root 0 7月  13 16:03 1.txt
【實踐操做】push推(目錄)

將本地的tmp目錄推到遠端服務器上

[root@vicodona practices]# ls tmp
ls: cannot access tmp: No such file or directory
----------------
[root@mico practices]# rsync -r /root/practices/tmp  47.107.108.121:/root/practices
root@47.107.108.121's password: 
----------------------------
[root@vicodona practices]# ll
total 4
drwxr-xr-x 2 root root 4096 Jul 13 16:11 tmp

若是僅是推送目錄下的文件並不包括目錄自己,使用/tmp/

/tmp --表示將tmp目錄自己及目錄下的內容進行傳輸
/tmp/ --表示只傳輸tmp目錄下面的內容信息

守護進程方式同步數據

Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
      rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
      rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

配置rsync守護進程方式(須要有服務端跟客戶端)

  1. vicodona 服務器做爲rsync服務端
  2. 以rsync客戶端做爲參照物,將數據推到rsync服務器上

配置rsync服務端(將服務端配置到vicodona服務器上)

第一步:檢查軟件是否存在

[root@vicodona ~]# rpm -qa|grep rsync
rsync-3.1.2-4.el7.x86_64

第二步:進行軟件服務配置

[root@vicodona ~]# cat /etc/rsyncd.conf 
# /etc/rsyncd: configuration file for rsync daemon mode

# See rsyncd.conf man page for more options.

# configuration example:

# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# [ftp]
#        path = /home/ftp
#        comment = ftp export area

uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 47.107.108.121/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
fake super = yes
[backup]
comment = "backu dir by vicodona"
path = /backup

第三步:建立rsync用戶

[root@vicodona ~]# id rsync
id: rsync: no such user
[root@vicodona ~]# useradd -s /sbin/nologin -M rsync

第四步:建立數據備份存儲目錄,目錄修改屬主

[root@vicodona ~]# mkdir /backup/
[root@vicodona ~]# chown -R rsync.rsync /backup/

第五步:建立認證用戶密碼文件

[root@vicodona ~]# echo "rsync_backup:vicodona123">>/etc/rsync.password
[root@vicodona ~]# chmod 600 /etc/rsync

第六步:啓動rsync服務

[root@vicodona ~]# rsync --daemon

查看啓動的服務

[root@vicodona ~]# ps -ef|grep rsync
root      7860     1  0 08:58 ?        00:00:00 rsync --daemon
root      7863  7841  0 08:58 pts/19   00:00:00 grep --color=auto rsync
[root@vicodona ~]# netstat -lntup |grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      7860/rsync          
tcp6       0      0 :::873                  :::*                    LISTEN      7860/rsync

配置rsync客戶端(其餘服務器做爲客戶端)

第一步:查看軟件是否存在

[root@mico ~]# rpm -qa|grep rsync
rsync-3.1.2-4.el7.x86_64

第二步:建立認證文件
客戶端認證文件只須要有密碼便可

[root@mico ~]# echo "vicodona123">>/etc/rsync.passwd
[root@mico ~]# chmod 600 /etc/rsync.passwd

第三步:實現數據傳輸
交互式

[root@mico practices]# rsync -azvP /root/practices/tmp/1.txt rsync_backup@47.107.108.121::backup 
Password: 
sending incremental file list
1.txt
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

sent 88 bytes  received 43 bytes  29.11 bytes/sec
total size is 0  speedup is 0.00

非交互式

[root@mico practices]# rsync -azvP /root/practices/tmp/1.txt rsync_backup@47.107.108.121::backup --password-file=/etc/rsync.passwd
sending incremental file list
1.txt
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

sent 88 bytes  received 43 bytes  262.00 bytes/sec
total size is 0  speedup is 0.00

rsync守護進程傳輸數據原理

rsync 命令同步參數選項和特殊參數

目錄參數 參數說明
-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rlptgoD
-r, --recursive 對子目錄以遞歸模式處理
-R, --relative 使用相對路徑信息
-b, --backup 建立備份,也就是對於目的已經存在有一樣的文件名時,將老的文件從新命名爲~filename。可使用--suffix選項來指定不一樣的備份件前綴。
--backup-dir 將備份文件(如~filename)存放在在目錄下。
-suffix=SUFFIX 定義備份文件前綴
-u, --update 僅僅進行更新,也就是跳過全部已經存在於DST,而且文件時間晚於要備份的文件。(不覆蓋更新的文件)
-l, --links 保留軟鏈結
-L, --copy-links 想對待常規文件同樣處理軟鏈結
--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹之外的鏈結
--safe-links 忽略指向SRC路徑目錄樹之外的鏈結
-H, --hard-links 保留硬鏈結
-p, --perms 保持文件權限
-o, --owner 保持文件屬主信息
-g, --group 保持文件屬組信息
-D, --devices 保持設備文件信息
-t, --times 保持文件時間信息
-S, --sparse 對稀疏文件進行特殊處理以節省DST的空間
-n, --dry-run 現實哪些文件將被傳輸
-W, --whole-file 拷貝文件,不進行增量檢測
-x, --one-file-system 不要跨越文件系統邊界
-B, --block-size=SIZE 檢驗算法使用的塊尺寸,默認是700字節
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行數據同步
--rsync-path=PATH 指定遠程服務器上的rsync命令所在路徑信息
-C, --cvs-exclude 使用和CVS同樣的方法自動忽略文件,用來排除那些不但願傳輸的文件
--existing 僅僅更新那些已經存在於DST的文件,而不備份那些新建立的文件
--delete 刪除那些DST中SRC沒有的文件
--delete-excluded 一樣刪除接收端那些被該選項指定排除的文件
--delete-after 傳輸結束之後再刪除
--ignore-errors 及時出現IO錯誤也進行刪除
--max-delete=NUM 最多刪除NUM個文件
--partial 保留那些因故沒有徹底傳輸的文件,以是加快隨後的再次傳輸
--force 強制刪除目錄,即便不爲空
--numeric-ids 不將數字的用戶和組ID匹配爲用戶名和組名
--timeout=TIME IP超時時間,單位爲秒
-I, --ignore-times 不跳過那些有一樣的時間和長度的文件
--size-only 當決定是否要備份文件時,僅僅察看文件大小而不考慮文件時間
--modify-window=NUM 決定文件是否時間相同時使用的時間戳窗口,默認爲0
-T --temp-dir=DIR 在DIR中建立臨時文件
--compare-dest=DIR 一樣比較DIR中的文件來決定是否須要備份
-P 等同於 --partial
--progress 顯示備份過程
-z, --compress 對備份的文件在傳輸時進行壓縮處理
--exclude=PATTERN 指定排除不須要傳輸的文件模式
--include=PATTERN 指定不排除而須要傳輸的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 綁定到特定的地址
--config=FILE 指定其餘的配置文件,不使用默認的rsyncd.conf文件
--port=PORT 指定其餘的rsync服務端口
--blocking-io 對遠程shell使用阻塞IO
-stats 給出某些文件的傳輸狀態
--progress 在傳輸時現實傳輸過程
--log-format=formAT 指定日誌文件格式
--password-file=FILE 從FILE中獲得密碼
--bwlimit=KBPS 限制I/O帶寬,KBytes per second
-h, --help 顯示幫助信息

保持同步目錄及文件屬性:

這裏的-avzP至關於 -vzetopdDlP,生產環境經常使用的參數爲 -avzP
在腳本中能夠報-vP去掉
--progress能夠用-P代替

daemon啓動擴展參數

參數 說明
--daemon daemon表示以守護進程的方式啓動rsync服務。
--address 綁定指定IP地址提供服務。
--config=FILE 更改配置文件路徑,而不是默認的/etc/rsyncd.conf
--port=PORT 更改其它端口提供服務,而不是缺省的873端口

特殊參數實踐

指定ip

[root@vicodona backup]# rsync --daemon --address=47.107.108.121
[root@vicodona backup]# netstat -lntup|grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      7860/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      7860/rsync        

--------------------
[root@mico practices]# rsync -azvP /root/practices/tmp/1.txt rsync_backup@47.107.108.121::backup --password-file=/etc/rsync.passwd
sending incremental file list
1.txt
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

sent 88 bytes  received 43 bytes  262.00 bytes/sec
total size is 0  speedup is 0.00

服務端指定服務端口

[root@vicodona  ~]# rsync --daemon --port=5222
[root@vicodona  ~]# netstat -lntup|grep rsync
tcp        0      0 0.0.0.0:5222      0.0.0.0:*           LISTEN      2598/rsync         
tcp        0      0 :::5222            :::*                 LISTEN      2598/rsync
相關文章
相關標籤/搜索