自動化運維-【同步工具】

運維同步工具:scp,nfs,sftp,http,samba(windows和linux之間),rsync,csync,drbd(基於文件系統)等html

1. Rsyncnode

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

功能一:git

  可以使本地主機不一樣分區或目錄之間及本地和遠程兩臺主機之間的數據快速同步鏡像,遠程備份等功能。適合linux/windows等系統github

功能二:算法

  能夠再本地主機的不一樣分區或目錄之間進行全量或者增量的複製數據shell

注意:windows

rsync的目的是實現本地主機和遠程主機上之間的數據快速複製同步鏡像,遠程備份的能力(包括本地推到遠程,遠程拉到本地兩種同步方式),也能夠實現本地不一樣路徑下文件的同步。但不能實現遠程路徑1到遠程路徑2之間的同步(scp能夠實現)。安全

功能一:相似於scp命令,可是scp每次都是全量拷貝,而rsync能夠進行增量拷貝,scp拷貝數據時加密的,可是rsync是不加密的。bash

功能二:有相似於cp命令,可是cp每次都是全量拷貝,而rsync能夠進行增量拷貝

rsync還能夠實現文件和目錄的刪除功能,這又是至關於RM命令,rsync至關於scp,cp,rm命令。而且還因爲他們。

在同步備份時,默認狀況下,rsync經過其獨特的「quick check」算法,僅同步大小或者最後修改時間發生變化的文件或目錄(也可根據權限,屬主等變化同步,須要制定參數)。甚至是隻同步一個文件裏變化的內容部分,因此能夠實現快速的同步數據的功能。

簡單描述

2.Rsync特性

1)支持拷貝特殊文件如連接,設備,屬組,權限等
2)能夠有排除指定文件或目錄同步的功能,至關於打包命令tar
3)能夠保持原來文件或目錄的權限,時間,軟硬連接等全部屬性均不改變。
4)可實現增量同步,即只同步發生變化的數據,所以數據傳輸效率更高
5)可使用rcp,rsh,ssh等方式來配合傳輸文件(rsync自己不對傳輸數據加密),也能夠經過直接的socket連接(有服務端和客戶端)
6)支持匿名(不須要超級用戶權限)的或認證的進程模式傳輸,方便進行數據備份及鏡像。

3.Rsync工做方式

(1).本地文件系統上實現同步。命令行語法格式爲上述"Local"段的格式。相似於cp命令的功能

(2).本地主機使用遠程shell和遠程主機通訊。命令行語法格式爲上述"Access via remote shell"段的格式。相似於scp命令的功能,基於ssh通道來傳輸數據

(3).本地主機經過網絡套接字鏈接遠程主機上的rsync daemon。命令行語法格式爲上述"Access via rsync daemon"段的格式。這是rsync自身最重要的功能,socket守護進程

 前二者的本質是經過管道通訊,即便是遠程shell。而方式(3)則是讓遠程主機上運行rsync服務,使其監聽在一個端口上,等待客戶端的鏈接。

安裝

yum -y install rsync  
#啓動rsync服務
systemctl start rsyncd.service
systemctl enable rsyncd.service
#檢查是否已經成功啓動
netstat -lnp|grep 873

3.0 rsync參數  

紫色字符表示不固定,根據本身需求調整。紅色字符表示警告。
-a 歸檔模式傳輸, 等於-tropgDl -v 詳細模式輸出, 打印速率, 文件數量等 -z 傳輸時進行壓縮以提升效率 -r 遞歸傳輸目錄及子目錄,即目錄下得全部目錄都一樣傳輸 -t 保持文件時間信息 -o 保持文件屬主信息 -p 保持文件權限 -g 保持文件屬組信息 -l 保留軟鏈接 -P 顯示同步的過程及傳輸時的進度等信息 -D 保持設備文件信息 -L 保留軟鏈接指向的目標文件 -e 使用的信道協議,指定替代rsh的shell程序 --exclude=PATTERN 指定排除不須要傳輸的文件模式 tar命令的排除也是--exclude -X==--exclude-from=FILE --exclude-from=file 文件名所在的目錄文件 --bwlimit=100 限速傳輸 --partial 斷點續傳 --delete 讓目標目錄和源目錄數據保持一致 謹慎使用
--bwlimit 限速

生產環境參數:
  
-avzP 至關於-vzrtopgDlP,還多了Dl的功能,生產環境裏面能夠把-v和-P去掉,P能夠用--progress代替
  -avz 至關於 -vzrtopg,這是生產參數

中文參數介紹 英文參數介紹

-v:顯示rsync過程當中詳細信息。可使用"-vvvv"獲取更詳細信息。
-P:顯示文件傳輸的進度信息。(實際上"-P"="--partial --progress",其中的"--progress"纔是顯示進度信息的)。
-n --dry-run  :僅測試傳輸,而不實際傳輸。常和"-vvvv"配合使用來查看rsync是如何工做的。
-a --archive  :歸檔模式,表示遞歸傳輸並保持文件屬性。等同於"-rtopgDl"。
-r --recursive:遞歸到目錄中去。
-t --times:保持mtime屬性。強烈建議任什麼時候候都加上"-t",不然目標文件mtime會設置爲系統時間,致使下次更新 :檢查出mtime不一樣從而致使增量傳輸無效。
-o --owner:保持owner屬性(屬主)。
-g --group:保持group屬性(屬組)。
-p --perms:保持perms屬性(權限,不包括特殊權限)。
-D        :是"--device --specials"選項的組合,即也拷貝設備文件和特殊文件。
-l --links:若是文件是軟連接文件,則拷貝軟連接自己而非軟連接所指向的對象。
-z        :傳輸時進行壓縮提升效率。
-R --relative:使用相對路徑。意味着將命令行中指定的全路徑而非路徑最尾部的文件名發送給服務端,包括它們的屬性。用法見下文示例。
--size-only :默認算法是檢查文件大小和mtime不一樣的文件,使用此選項將只檢查文件大小。
-u --update :僅在源mtime比目標已存在文件的mtime新時才拷貝。注意,該選項是接收端判斷的,不會影響刪除行爲。
-d --dirs   :以不遞歸的方式拷貝目錄自己。默認遞歸時,若是源爲"dir1/file1",則不會拷貝dir1目錄,使用該選項將拷貝dir1但不拷貝file1。
--max-size  :限制rsync傳輸的最大文件大小。可使用單位後綴,還能夠是一個小數值(例如:"--max-size=1.5m")
--min-size  :限制rsync傳輸的最小文件大小。這能夠用於禁止傳輸小文件或那些垃圾文件。
--exclude   :指定排除規則來排除不須要傳輸的文件。
--delete    :以SRC爲主,對DEST進行同步。多則刪之,少則補之。注意"--delete"是在接收端執行的,因此它是在
            :exclude/include規則生效以後才執行的。
-b --backup :對目標上已存在的文件作一個備份,備份的文件名後默認使用"~"作後綴。
--backup-dir:指定備份文件的保存路徑。不指定時默認和待備份文件保存在同一目錄下。
-e          :指定所要使用的遠程shell程序,默認爲ssh。
--port      :鏈接daemon時使用的端口號,默認爲873端口。
--password-file:daemon模式時的密碼文件,能夠從中讀取密碼實現非交互式。注意,這不是遠程shell認證的密碼,而是rsync模塊認證的密碼。
-W --whole-file:rsync將再也不使用增量傳輸,而是全量傳輸。在網絡帶寬高於磁盤帶寬時,該選項比增量傳輸更高效。
--existing  :要求只更新目標端已存在的文件,目標端還不存在的文件不傳輸。注意,使用相對路徑時若是上層目錄不存在也不會傳輸。
--ignore-existing:要求只更新目標端不存在的文件。和"--existing"結合使用有特殊功能,見下文示例。
--remove-source-files:要求刪除源端已經成功傳輸的文件。
 

3.1 rsync數據傳輸模式

本地數據傳輸模式(lcoal-only mode),單個主機之間傳送,相似cp命令  
  Local: rsync [OPTION...] SRC... [DEST] 複製   [root@node1
/]# rsync /etc/hosts /tmp #將/etc/hosts推送到/tmp目錄,至關於cp /etc/hosts /tmp   cp -a 至關於 cp -drp #-r目錄全都賦值,-p保持文件屬性,-d設備    參數介紹:   -v 詳細模式輸出,傳輸式的進度等信息   -z --compress 傳輸式進行壓縮以提升傳輸效率,--compress-level=1,可按級別壓縮   [root@node1 /]# rsync -avz /etc/hosts /tmp #當此命令在執行一次時,就不在copy了,體現了rsync的增量copy,   sending incremental file list host sent 175 bytes received 35 bytes 420.00 bytes/sec total size is 221 speedup is 1.05 刪除目錄裏面的內容 新建空目錄 mkdir /null [root@node1 /]# rsync -r --delete /null/ /test/ #至關於rm命令 /null/目錄裏面有什麼/test/目錄裏面就有什麼,/null/爲空/test/也爲空,其實是刪除複製,這個--delete命令有危險 注意:/null/必須加上最後斜線,不加的話表明/null和目錄裏面的內容,若是加上的話,只表示目錄裏面的東西
====================================================================================================================================================================
遠程數據傳輸模式,ssh通道數據傳輸,相似於scp命令,通常設置免祕鑰登陸 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 下載(拉) 藉助ssh通道從遠程主機拉取數據   
[root@node1 /]# rsync -avz -e 'ssh -p 22' root@192.168.10.232:/tmp/1.txt /tmp   參數說明:    1)-avz至關於-vzrtopgDl,表示同步時文件和目錄的屬性不變,    2)-P顯示同步過程,能夠用--progress替換   3)-e 'ssh -p 22'表示經過ssh的通道傳輸數據 -p 22 能夠省略    Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 上傳(推) 藉助ssh通道向遠程主機推送文件   [root@node1 /]# rsync -e 'ssh -p 22' /test/dads.txt root@192.168.10.232:/tmp #至關於scp命令 藉助ssh通道向遠程主機推送文件夾   [root@node1 /]# rsync -avz -e 'ssh -p 22' /test/ root@192.168.10.232:/tmp/ #經過root用戶把本地目錄/test/,不包括目錄自己推送到192.168.10.231的/tmp
====================================================================================================================================================================
重點
Access via rsync daemon:    守護進程方式傳輸
Rsync daemon數據傳輸(經過守護進程的方式),端口爲873
服務器端配置
1.配置文件:/etc/rsyncd.conf
 
##rsyncd.conf start##
  uid = rsync # 用戶好像也是nodobody,nfs的uid和gid是65534
  gid = rsync
  use chroot = no # 防止安全問題,假根
  max connections = 200 # 同時最大多少客戶端鏈接
  fake super = yes #rsync將經過對附加在每一個文件上的擴展屬性(根據實際須要)的保存/恢復來模擬super user。
  timeout = 300 # 超時時間,默認s    
  pid file = /var/run/rsyncd.pid # rsync系統進程號,就是pid所在的文件
  lock file = /var/run/rsync.lock # rsync傳輸數據的鎖
  log file = /var/log/rsyncd.log # 日誌文件
  [backup] # 模塊名稱
  path = /backup/ # 模塊路徑,至關於客戶端上傳和下載的目錄
  ignore errors # 忽略錯誤信息
  read only = false # 對備份數據可讀可寫
  list = false # 不容許查看模塊信息
  hosts allow = 192.168.10.0/24 # 容許的主機
  hosts deny = 0.0.0.0/32 # 拒絕的主機
  auth users = rsync_backup # rsync虛擬用戶,不是系統用戶
  secrets file = /etc/rsync.password # 用戶對應的密碼文件
#rsync_config_______________end
2.建立用戶及備份目錄
[root@node1 /]# useradd rsync -s -M /sbin/nologin 建立運行rsync服務的用戶,不容許登陸,不建立家目錄
[root@node1 /]# mkdir /oldboy -p 建立備份目錄,儘量的大 [root@node1 /]# chown -R rsync.rsync /oldboy 受權備份目錄以rsync爲屬組
[root@node1 /]# echo "rsync_backup:123456" >/etc/rsync.password 建立虛擬用戶密碼文件,用戶客戶端鏈接使用時的用戶,密碼爲1
[root@node1 /]# chmod 600 /etc/rsync.password 下降權限,保證安全,權限過高可能致使傳輸失敗,權限必須600如下

啓動rsync daemon功能
  rsync --daemon(表示以守護進程的方式啓動) 等價於systemctl start rsyncd
systemctl enable rsyncd
3.檢查對應端口
netstat -nltp |grep 873

客戶端配置:
  1.保證安裝了rsync軟件
  2.將服務器端的虛擬用戶的密碼發送到客戶端,用於之後不輸入密碼進行推送
    [root@node2 ~]# echo "123456" >/etc/rsync.password
    [root@node2 ~]# chmod 600 /etc/rsync.password
 
注意:之後的數據流向必定是客戶端流向服務端的,也就是執行命令的地方必定是在客戶端,服務端就是一個守護進程,由客戶端去推送或拉取
Rsync daemon數據傳輸實踐
從服務端拉取數據
第一種方式
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync -avz rsync_backup@192.168.10.231::oldboy /data
命令 參數 虛擬用戶 服務器IP地址 服務端模塊名稱 將拉取的數據備份到什麼地方
rsync -avz rsync_backup@192.168.10.231::oldboy /data --password-file=/etc/rsync.password #shell腳本里面自動輸入密碼
第二種方式
rsync -avz rsync://rsync_backup@192.168.10.231/oldboy /data --password-file=/etc/rsync.password
 向服務端推數據
第一種方式
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync -avz
/data/ rsync_backup@192.168.10.231::oldboy #若是隻是推/data裏面的內容就不加/,若是連目錄一塊兒推過去就加/
第二種方式
rsync -avz /data/ rsync://rsync_backup@192.168.10.231/oldboy --password-file=/etc/rsync.password

 3.2 rsync常見故障

1.服務未開啓
    systemctl start rsyncd
    netstat -nltp
2.防火牆和selinux未關閉,或者未設置
    sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

    systemctl disable firewalld
    systemctl stop firewalld
3.密碼輸入錯誤
4.命令格式錯誤,或者命令輸入錯誤
5.密碼權限600,服務端和客戶端都是
    chmod 600 /etc/rsync.password
6.rsync配置文件配置錯誤,配置文件叫rsyncd.conf,而密碼文件是rsync.password,不要多加d
    vi /etc/rsyncd.conf
7.備份文件屬組錯誤
    chown -R rsync.rsync /backup/
8.出錯的話要查看/var/log/rsyncd.log
9.添加到/etc/rc.local裏面 echo "/usr/bin/rsync --daemon" >>/etc/rc.local

3.3 rsync排除推送

--exclude=排除目錄       排除不多的目錄
--exclude-from=排除文件  排除不少

客戶端排除
向192.168.10.231的oldboy目錄推送data目錄裏面的數據,排除data目錄裏面的a和b
rsync -avz --exclude={a,b} /data/ rsync_backup@192.168.10.231::oldboy
向192.168.10.231的oldboy目錄推送data目錄裏面的數據,排除data目錄裏面的a到z
rsync -avz --exclude={a..z} /data/ rsync_backup@192.168.10.231::oldboy
向192.168.10.231的oldboy目錄推送data目錄裏面的數據,排除paichu.log裏面的文件(在n多要排除的,把名字追加到裏面,加上參數)
rsync -avz --exclude-from=paichu.log /data/ rsync_backup@192.168.10.231::oldboy

服務端排除
exclued = a b tets/1.txt #在配置文件裏面寫入,並重啓服務
在客戶端來去和推送時都排除了a和b
殺死進程
kill `cat /var/run/rsyncd.pid`
pkill rsync

 3.4無差別同步

--delete 
rsync推送企業工做場景
1)備份
  客戶端有啥,服務器就有啥,客戶端沒有的,服務器有也要刪除,服務器短的目錄可能會丟失
rsync拉取企業工做場景
1)代碼發佈,下載等。
  服務器有啥,客戶端就有啥,服務器沒有的,客戶端有也要刪除,客戶端的目錄可能會丟失

 

3.x 未解決問題

在查看rsync服務時,發現時已root權限啓動的,由於配置文件裏面已經寫了rsync用戶,不知道爲何沒生效
https://bbs.csdn.net/topics/350027210
在修改了rsync端口以後仍是root啓動的,網上說是小於1024的端口,只能是root權限啓動

[root@node1 data]# lsof -i :873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 16319 root 4u IPv4 1345670 0t0 TCP *:rsync (LISTEN)
rsync 16319 root 5u IPv6 1345671 0t0 TCP *:rsync (LISTEN)
[root@node1 data]#

2. Inotify簡介

1.inotify起源
  若是要實現定時同步數據,能夠在客戶端將rsync加入定時任務,可是定時任務的同步時間粒度並不能達到實時同步的要求,而且在服務器的文件數量達到了百萬到千萬量級的話,那麼文件的比對是很是耗時的也很是低效
2.inotify實現工具
  inotify實現工具備幾款:inotify自己、sersync、lsyncd。其中sersync是金山的周洋開發的工具,克服了inotify的缺陷,且提供了幾個插件做爲可選工具。此處先介紹inotify的用法以及它的缺陷,經過其缺陷引出sersync,並介紹其用法。
3.inotify原理,是一種linux內核的一種文件系統監控機制
inotify是一種強大的細粒度的異步的文件時間監控機制,linux內核在2.6.13起,就增長了對inotify的支持,經過intofity機制,可以對文件系統的變化進行監控,如對文件進行建立、刪除、修改等操做,能夠及時通知應用程序進行相關事件的處理。
利用這個內核接口,第三方軟件就能夠監控文件系統下文件的各類變化狀況,而inotify-tools正是實施這樣的監控軟件。而經過inotify和rsync能夠進行實施同步

inotify進程會監控文件系統的變化,若是變化,就設置觸發同步,經過rsync同步到遠端服務器。在這裏咱們只是將inotify用到了實時同步,inotify也能夠有不少應用場景

inotify安裝

1.因爲inotify是和rsync一塊兒支持實時同步的,因此先檢查是否在安裝了rsync,以守護進程方式啓動(rsyncd --daemon),能正確的推拉數據。
  [root@node2 /data]# rsync -avz /data rsync://rsync_backup@192.168.10.231/oldboy --password-file=/etc/rsync.password
  sending incremental file list
  data/
  data/asdasdas
  24 bytes 4,334.00 bytes/sec
  total size is 1,619 speedup is 0.7

2.肯定內核版本
[root@node2 /data]# uname -r
  3.10.0-693.el7.x86_64

3.配置地點
  一點要在客戶端配置,不要配置錯誤

4.查看系統是否支持inotify的監控
  [root@node2 tmp]# ll /proc/sys/fs/inotify/
  total 0
  -rw-r--r-- 1 root root 0 Feb 11 19:57 max_queued_events #調用inotify_init時分配到inotify instance中可排隊的event數的最大值,超出值時的事件被丟棄,但會觸發隊列溢出Q_OVERFLOW事件。
  -rw-r--r-- 1 root root 0 Feb 11 19:57 max_user_instances #每個real user可建立的inotify instances數量的上限。
  -rw-r--r-- 1 root root 0 Feb 11 19:57 max_user_watches #每一個inotify實例相關聯的watches的上限,即每一個inotify實例可監控的最大目錄、文件數量。若是監控的文件數目巨大,須要根據狀況適當增長此值。

5.下載源碼包並編譯安裝
  epel源上提供了inotify-tools工具,或者下載源碼包格式進行編譯。
  inotify-tools源碼包地址:https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
編譯安裝
    tar -zxvf inotify-tools-3.14.tar.gz && cd inotify-tools-3.14
    ./configure --prefix=/usr/local/inotify-tools-3.14
    make && make install
    cd ../ && ln -s /usr/local/inotify-tools-3.14 /usr/local/inotify

6.inotify-tools工具命令
[root@node2 /usr/local/inotify]# ll bin
total 116
-rwxr-xr-x 1 root root 60896 Nov 7 17:06 inotifywait #inotifywait命令用於等待文件發生變化,因此能夠能夠實現監控(watch)的功能,該命令是inotify的核心命令
-rwxr-xr-x 1 root root 55176 Nov 7 17:06 inotifywatch #inotifywatch用於收集文件系統的統計數據,例如發生了多少次inotify事件,某文件被訪問了多少次等等,通常用不上。

7.簡單的監控腳本

  #!/bin/bash
  #2018年11月7日18:31:26
  cmd="/usr/local/inotify-tools-3.14/bin/inotifywait"
  $cmd -mrq --format '%w%f' -e create,close_write,delete /data |\
  while read line
  do
    rsync -az --delete $line rsync_backup@192.168.10.231::oldboy --password-file=/etc/rsync.password
  done

 8.inotify的並不是每秒鐘大概是200-300左右
相關文章
相關標籤/搜索