posts - 66, comments - 12, trackbacks - 0, articles - 0

          遠程鏡像與備份SVN服務器(轉載)

          Posted on 2008-12-14 09:31 cyantide 閱讀(1561) 評論(0)  編輯  收藏 所屬分類: 其它

          遠程鏡像與備份SVN服務器

          如需轉載,請注明出處:http://bbs.iusesvn.com/thread-3068-1-1.html
          此文講述SVN如何鏡像服務器,注意是單向鏡像。眾所周知,SVN有自已的鏡像命令svnsync(svn1.4以及以上版本特性),但是部署與維護確是繁瑣至極,令人望而卻步。我們來看一個簡單的svnsync例子:
          SVN服務器: http://mastersvn/project1
          svnsync
          鏡像SVN服務器上的部署:http://backupsvn/project1

          第一步:建立倉庫
          cd /home/svn
          svnadmin create –fs-type fsfs /home/svn/project1
          chmod 777 –R project1
          第二步:鏡像初始化
          svnsync init http://backupsvn/project1
          http://mastersvn/project1
          第三步:更改配置文件
          cd /home/svn/project1/hooks
          cp pre-revprop-change.tmpl pre-revprop-change

          vi pre-revprop-change
          注銷所有語句,在語句前加入#即可,退出保存
          第四步:同步
          svnsync sync http://backupsvn/project1 --username username --password password
          已提交版本 9
          復制版本 9 屬性
          已提交版本 10。
          復制版本 10 的屬性
          ……………
          但是在實際運用中,經常會發生SVN庫被lock的情況
          svnsync: Couldn't get lock on destination repos after 10 attempts
          這不得不讓我們感覺頭痛地手動使用改命令解鎖
          svn propdel svn:sync-lock --revprop -r0 http://backupsvn/project1
          寫到這里,大家不由對svnsync有了個初步的認識了吧,就一個字,煩!?。《彝剿俣群苈。。?/font>
          ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          接下來是此文的重點部分:
          SVN
          新的鏡像備份方案:ssh + rsync + crontab(任務計劃))
          什么是SSH?
          SSH
          是更靈活、更安全的 telnet rlogin 替代品。它在開發項目中得到廣泛使用,以提供訪問控制和安全的數據傳輸。
          什么是rysnc?
          rsync
          是類unix系統下的數據鏡像備份工具,從軟件的命名上就可以看出來了——remote sync。它的特性如下:
          可以鏡像保存整個目錄樹和文件系統。
          可以很容易做到保持原來文件的權限、時間、軟硬鏈接等等。
          無須特殊權限即可安裝。
          優化的流程,文件傳輸效率高。
          可以使用rcp、ssh等方式來傳輸文件,當然也可以通過直接的socket連接。
          支持匿名傳輸,以方便進行網站鏡象。
          什么是crontab?
          Crontab
          Linux操作系統下的一個命令,可以用來根據時間、日期、月份、星期的組合來調度對重復任務的執行的守護進程。(類似windows下的任務計劃)
          方案拓撲圖:(請看附件)
          SVN服務器環境
          SVN
          倉庫根目錄: /home/svn (project1,project2,project3三個倉庫)
          SVN
          服務器IP 192.168.100.80
          鏡像SVN服務器環境:
          SVN
          倉庫根目錄:/home/svn (無倉庫,無需建立,鏡像時會直接復制過來并保持文件屬性)
          SVN
          服務器IP 192.168.100.81

          #
          SVN服務器安裝部分:
          1
          SVN安裝部分(略)
          2
          安裝rsync部分
          rpm -qa | grep rsync (
          所有系統是否有安裝過rsync)
          rpm -e rsyncxxx (
          刪除以前安裝過的rsync)
          wget
          http://samba.anu.edu.au/ftp/rsync/rsync-3.0.4.tar.gz (下載rsync源碼安裝包)
          tar zxvf rsync-3.0.4.tar.gz (
          解壓)
          cd rsync-3.0.4
          ./install.sh (
          安裝)
          接下來我們就可以輸入rsync --version命令來測試下是否安裝成功了。
          rsync
          version 3.0.3
          protocol version 30

          Copyright (C) 1996-2008 by Andrew Tridgell, Wayne Davison, and others.
          Web site:
          http://rsync.samba.org/
          Capabilities:
          64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
          socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
          append, ACLs, xattrs, iconv, no symtimes

          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.
          (3)
          開啟rsync服務器端
          /usr/local/bin/rsync --daemon (
          開啟rsync服務)
          vi /etc/rc.d/rc.local
          在末尾加入/usr/local/bin/rsync --daemon (目的是讓服務器每次重啟后都能自動運行此進程)

          #
          鏡像SVN服務器安裝部分:
          1SVN安裝部分(略)
          2安裝rsync部分
          rpm -qa | grep rsync (
          所有系統是否有安裝過rsync)
          rpm -e rsyncxxx (
          刪除以前安裝過的rsync)
          wget
          http://samba.anu.edu.au/ftp/rsync/rsync-3.0.4.tar.gz (下載rsync源碼安裝包)
          tar zxvf rsync-3.0.4.tar.gz (
          解壓)
          cd rsync-3.0.4
          ./install.sh (
          安裝)
          接下來我們就可以輸入rsync --version命令來測試下是否安裝成功了。
          接下來我們的配置就完成了,讓我們用命里那個測試下。
          同步命令:
          rsync -vzrtopgu --progress --delete
          root@192.168.100.80:/home/svn /home/
          輸入用戶root
          輸入root密碼。

          65309 100%
          224.57kB/s
          0:00:00 (xfer#507, to-check=2187/23106)

          svn/project1/db/revs/202

          29655 100%
          99.86kB/s
          0:00:00 (xfer#508, to-check=2186/23106)

          svn/project1/db/revs/203

          7242 100%
          23.19kB/s
          0:00:00 (xfer#509, to-check=2185/23106)

          sent 15928 bytes
          received 521860019 bytes
          4404016.43 bytes/sec

          total size is 12240235825
          speedup is 23.45

          傳輸完成,這次鏡像過程就結束了。
          讓我們看看所使用的參數:
          v
          復雜的輸出信息
          z
          壓縮模式, 當資料在傳送到目的端進行檔案壓縮.
          r
          復制所有下面的資料(透過)
          t
          保留時間點
          o
          保留檔案所有者(root only)
          p
          保留檔案權限
          g
          保留檔案群組
          u
          更新修改過的文件
          --progress
          顯示傳送的進度
          --delete
          刪除傳送斷已經不存在,而目的端存在的檔案

          root@192.168.100.80:/home/svn /home/
          root用戶訪問192.168.100.80/home/svn目錄,然后同步到本機的/home/目錄下,注意格式,那么鏡像SVN服務器就會把主SVN服務器上的/home目錄的svn文件夾整個復制到鏡像SVN服務器上的/home下,并保存原屬性不變。

          ###
          注意:為什么使用root的用戶呢,因為可以確保保證同步過來的文件可以保證檔案的具體屬性,這是我們比較關心的問題,但是root的用戶擁有的權限太大了,每次都需要輸入root的密碼,一方面這是非常危險的,一方面比較繁瑣。
          那么我們首先想到的不需要輸入用戶名和密碼就可以鏡像和傳輸文件,那么必須讓兩臺SVN服務器互相信任,那么我們需要采用ssh私鑰和公鑰加密技術。
          SVN服務器:
          ssh-keygen –d
          Enter file in which to save the key (/home/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_dsa.Your public key has been saved in /home/root/.ssh/id_dsa.pub.The key fingerprint is:32:21:e1:3b:7d:6e:de:4b:39:da:af:38:fe:90:40:61
          root@svnserver.com

          cd .ssh
          id_dsa ------------
          私鑰文件

          id_dsa.pub ------------ 公鑰文件

          cp id_dsa.pub authorized_keys2 (
          復制一個可以被root識別和讀取的公鑰文件)
          chmod 600 authorized_keys2 (
          因安全因為給予600權限)
          cp id_dsa.pub svnserver.pub (
          再做一份公鑰的副本)
          想辦法把這個公鑰的副本移動到鏡像SVN服務器上面。
          cat mirrorsvnserver.pub >> authorized_keys2 (
          把復制過來的鏡像SVN服務器上的公鑰導入到主SVN服務器的公鑰文件里)
          鏡像SVN服務器:
          ssh-keygen –d
          Enter file in which to save the key (/home/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_dsa.Your public key has been saved in /home/root/.ssh/id_dsa.pub.The key fingerprint is:32:21:e1:3b:7d:6e:de:4b:39:da:af:38:fe:90:40:61
          root@mirrorsvnserver.com

          cd .ssh
          id_dsa ------------
          私鑰文件

          id_dsa.pub ------------ 公鑰文件

          cp id_dsa.pub authorized_keys2 (
          復制一個可以被root識別和讀取的公鑰文件)
          chmod 600 authorized_keys2 (
          因安全因為給予600權限)
          cp id_dsa.pub mirrorsvnserver.pub (
          再做一份公鑰的副本)
          想辦法把這個公鑰的副本移動到主SVN服務器上面。
          cat svnserver.pub >> authorized_keys2 (
          把復制過來的主SVN服務器上的公鑰導入到鏡像SVN服務器的公鑰文件里)
          讓我們里驗證公鑰文件中的內容:
          cat /root/.ssh/authorized_keys2
          ssh-dss AAAAB3NzaC1kc3MAAACBAL9iAG+VZkXunZ5KzTivat1deDAQFKdrGY5P2rxRI+QeKClNgfukUNwQmU+a5FqfNsLKlWhGbIfFI1k00Zkc7nwMdG2dtcnWw7oUqPCGizMcoPLXXQhfOPaFoOkB5UPWNkgJobBPZBjJ7nhKZxzzMiujhOVYLvGNDEWI8x3NAAAAFQCqqtJaMgVyMgDexUKbHIBXsSghYIB5U82gTyGb2c4z4AsmQ5M0ds3YHHVLPHRUEn7DspzlNZ7fYWhKzQYWlhPJftuYTrYIEzuXx8Hl8kg7hCEl4hArAgMMcEtmuQ+3x5SkEht3077qUPdC/YzSk7cFNwQlt6nOeYELCIwhs1CXWQXi9E/XSlqepd+gSlAAhVzWc0MgAAAIAy4qWyaB6DT+XWtq23jrFrYeejJyFBVkNVUbEd3GNTHvwKTYuBa7nlh562g5r0riIrHW+a7WGd6U32RVLnqqIwddcHml4kXnondo0qjW4XijYI7jkHN9oAK5mNWnSCYAnot1nra3QXlh9472/l7kTmznumjsDDjAIa7OFY9w==
          root@svnserver.com
          ssh-dss AAAAB3NzaC1kc3MAAACBAPI3YFCQNBof9xA/Fi1S0U4jmliAg/TaWHnx9suaYb5Xc31jW3+axbNURIBnK7cA53q+qBME1DdddSBOq+I0oUpfjAXkOUl/ACRbSRqA1VOaKdI2AOH9tw4jSK0xSqYjj+ReuUnuVMSTOJTQzt1n6YsLj/kjAAAAFQCHE5NqPCIlr5xVFYOZmGysI+CtKQAAAIAb/gjP0f3Ifx0H2A3XzH9fG4YENLd+gz0l07Mq356+IBuPSYxi4JldxZ7j1OkH9j+7+t8AOSyqNqiOzKXpimo0NLjVsEkpn9RXFmzfHHwRholmauDKIbGLvJlTL0ZkjqH3w0plGmVC6YyxOpM4w7XklIvtq3rDZQE4O247yxgAAAIEA2rd2htKfO9I7F+rBxVgszeGrwCfP5gf8sdz32LDd+E4JxzI/b79Tn1ylILb0vGZhRCbFhoLnDIUMR3Lrr5FqGlTf8O2gsvproA5pLqUpgrkhR/7siycplOddftt553yBJNCBkq+E906AwQ72PNs2uLrbKHyVyD1akrD2/hfA=
          root@svnmirrorserver.com
          這樣我們的兩臺SVN服務器就得到信任了。
          讓我們再次執行同步命令:
          rsync -vzrtopgu --progress --delete
          root@192.168.100.80:/home/svn /home/
          發現了什么?
          已經不需要輸入用戶名和密碼了。
          最后我們需要設定人物計劃了。
          crontab –e
          */10 * * * * /usr/local/bin/rsync -vzrtopgu --progress --delete
          root@192.168.100.80:/home/svn /home/ &
          退出保存。
          這個例子是每10分鐘同步一次,當然我們也可以設置我們想要的時間。
          另外一個例子:每小時同步一次
          * */1 * * * /usr/local/bin/rsync -vzrtopgu --progress --delete
          [email=root@192.168.100.80:/home/svn]root@192.168.100.80:/home/svn /home/ &
          備注:
          (1)
          所有同步都為增量備份,筆者不建議大家都采用增量備份對SVN進行備份,這有可能導致SVN庫日后不可用,但筆者這里將盡有不下50SVN庫,同步幾月都沒發生任何問題,都能正常被使用。但是為了謹慎起見,希望大家再做一個定期全備份,建議每周一次。如有用戶因此丟失,筆者將不負任何責任。
          (2)
          此方法適應Windows上使用,rsync程序名稱為cwRsync


          (3) rsync有二種配置方式:一種是ssh,scp,stock等協議直接傳輸,無需修改配置文件(筆者用法),第二種是修改rsync配置文件,映射路徑和指定密碼(支持匿名)


          (4) ssh + rsync + crontab只是復制文件而已,無需依賴apachesubversion程序




          附件:
          rsync 所以試用參數列表:
          -h , --help 顯示rsync求助資訊
          --version 顯示rsync版本
          -v , --verbose 復雜的輸出信息
          -q , --quiet 安靜模式,幾乎沒有訊息產生,
          常用在以cron執行rsync
          -I, --ignore-times 通常rsync為了加快速度會忽略同樣檔案大小且同樣,同樣存取時間點的檔案
          可以通過此參數開關此快速檢查.
          --size-only rsync
          只檢查檔案大小是否改變,不管時間存取點是否改變
          通常用在mirror, 且對方時間不太正確時
          -c, --checksum 在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案(會托滿速度);
          -a, --archive archive mode 權限保存模式,相當于 -rlptgoD 參數.
          很快速的保存幾乎所有的權限設定,除了硬式連接(透過-H設定).
          -r, --recursive 復制所有下面的資料(透過)
          -R, --relative 使用相對路徑
          如: rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案
          rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案
          -R, --relative 不使用相對路徑
          -b, --backup 目的地端先前已經存在的檔案在傳輸或刪除前會被備份
          --backup-dir=DIR 設定備份的資料夾
          --suffix=SUFFIX 指定備份的檔案名稱字尾形式(預設為~)
          -K, --keep-dirlinks 接收方將連接到資料夾的檔案視為資料夾處理
          -l, --links 復制所有的連接
          -H, --hard-links 保留硬式連結
          -p, --perms 保留檔案權限
          -o, --owner 保留檔案所有者(root only)
          -g, --group 保留檔案群組
          -u –update 更新修改過的文件
          -D, --devices 保留device資訊(root only)
          -t, --times 保留時間點
          -n, --dry-run 不實際執行傳送, 只顯示將會有的傳輸動作
          -S, --sparse 嘗試去處理稀疏的檔案, 讓這些檔案在目的端占去較少的磁碟空間
          -W, --whole-file 復制所有的檔案, 不額外作檢查
          --no-whole-file 關閉 --whole-file 參數
          -x, --one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)
          -B, --block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce
          -e --rsh=COMMAND 定義所試用的remote shell
          --rsync-path=PATH 定義rsync在遠端機器存放資料的路徑
          --existing 只對比更新目的端已經存在的檔案
          --ignore-existing 忽略目的斷已經存在的檔案(也就是不更新)
          --delete 刪除傳送斷已經不存在,而目的端存在的檔案
          --delete-excluded 除了把傳送端已經不存在, 而目的端存在的檔案刪除之外, 也刪除 --exclude 參數所包含的檔案
          --delete-after rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,
          單可以透過 --delete-after 讓刪除動作在檔案傳送后在進行刪除
          --ignore-errors 忽略任何錯誤即使是I/O error 也進行 --delete 刪除動作
          --max-delete=NUM 定義rsync不要刪除超過NUM個檔案
          --partial rsync若遇到傳輸過程中斷時, 會把那些已經傳輸的檔案刪除.
          在某種狀況下保留那些部分傳送的檔案是令人高興的;
          你可以透過 --partial 參數達到這個目的.
          --partial-dir=DIR 在 --partial 參數啟動時, 你還是可以定義rsync把那些部分傳送的檔案
          寫入定義的資料夾, 而非直接寫入目的端,需要注意的是,
          此資料夾不應該被其他試用者可以寫入.(如:/tmp)
          --force 當目的端資料夾被傳送端非資料夾名稱覆蓋時, 強制rsync刪除資料夾, 即使該資料夾不是空的.
          --numeric-ids 不將傳送端檔案的uid及gid值, 與目的端的使用者/群組進行配對,
          若傳送端并沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),
          或目的端沒有相對應的帳號/群組, 保留數字型式的uid/gid
          --timeout=TIMEOUT 設定I/O 超時的時間(秒). 超過這個秒數而沒有資料傳送, rsync將會結束. 預設為0,也就是沒有定義超時時間
          -T, --temp-dir=DIR 定義rsync在接收端產生暫時性的復制檔案時使用資料夾暫存,
          預設時直接在接收端資料夾直接產生暫存檔案
          --compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.
          --link-dest=DIR 與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.
          -z, --compress 壓縮模式, 當資料在傳送到目的端進行檔案壓縮.
          -P -P參數和 --partial --progress 相同.只是為了把參數簡單化.
          -C, --cvs-exclude 排除那些通常不希望傳送的檔案, 定義的方式與CVS傳送相同:
          RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
          .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
          .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
          符合以上條件的都會被忽略不傳送.
          --exclude=PATTER 符合PATTERN(規則表示式)樣式的檔案不僅行傳送
          --exclude-from=FILE 和 --exclude 參數相同, 不過是把不進行傳送的檔案事先寫入某一檔案.
          執行時, 透過此參數讓rsync讀取.
          (; #開頭的行列或者空白會被rsync忽略)
          --include=PATTERN 定義rsync不要排除符合pattern樣式的檔案
          --include-from=FILE 和--include參數相同,只不過把要包含的檔案寫到某一檔案.
          --files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案, 讓rsync讀取.
          如: rsync -a --files-from=/tmp/foo /usr remote:/backup
          -0 --from0 定義檔案所要讀取的檔案時null字元結尾.
          --version 現四版本信息.
          --daemon 定義rsync以daemon型態執行
          --no-detach 當以daemon形態執行時,不要進行分裂且變成背景程序.
          --address=ADDRESS 定義所要連接(bind)的ip位置或者是host名稱(daemon限定)
          --config=FILE 定義所要讀取的設定檔rsyncd.conf位置(daemon限定)
          預設值為 /usr/local/etc/rsyncd.conf
          --port=PORT 定義rsyncd(daemon)要旨行的port(預設為tcp 873)
          --blocking-io 使用blocking I/O連結遠端的shell, 如rsh, remsh
          --no-blocking-io 使用non-blocking連結遠端的shell, 如ssh(預設值)
          --stats 顯示檔案傳送時的資訊狀態
          --progress 顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)
          --log-format=FORMAT 定義log的格式(在rsyncd.conf設定)
          --password-file=FILE 從檔案讀取與遠端rsync伺服務連結的密碼
          --bwlimit=KBPS 定義傳輸頻寬的大小(KBytes/秒)
          --write-batch=FILE 把記錄資料寫入一個檔案(給其他相同環境且相同需求的機器試用)
          --read-batch=FILE 透過讀取記錄檔案來進行傳輸.(檔案由 --write-batch 參數產生)
          --checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)
          -4 --ipv4 使用IPv4協定
          -6 --ipv6 使用IPv6協定
          svnmirror.jpg
          主站蜘蛛池模板: 托里县| 文安县| 无极县| 林州市| 响水县| 海丰县| 齐河县| 沛县| 福建省| 临潭县| 朝阳县| 历史| 元江| 定州市| 玛纳斯县| 阳东县| 荆州市| 海林市| 凭祥市| 美姑县| 曲水县| 中西区| 略阳县| 江山市| 教育| 全南县| 白银市| 竹山县| 罗平县| 玉田县| 昌平区| 家居| 林周县| 蕉岭县| 衡山县| 信宜市| 太白县| 郁南县| 淮北市| 策勒县| 饶阳县|