2019年11月27日 星期三

Linux 使用 rsync 遠端檔案同步與備份工具教學與範例

資料來源:  https://blog.gtwang.org/linux/rsync-local-remote-file-synchronization-commands/

本篇介紹如何使用 Linux 的 rsync 同步與備份各種檔案,自動製作快照式累進備份。
rsync 是 Linux 系統上最常被用來複製與備份檔案的工具,它可以處理本機或遠端的檔案同步工作,藉由 rsync 指令可以讓管理者很方便的將兩地的資料同步,不管是同一台電腦或是透過網際網路連線的兩台伺服器,使用方式都類似,以下是 rsync 的使用教學以及常用的指令範例。

rsync 簡介

rsync 的角色就像是一般 Linux 的 cp 與 scp 指令,可以將檔案或目錄從來源位置複製到目的位置,不過 rsync 在複製檔案時會比 cp 與 scp 更有效率,並且支援連結檔與設備檔(devices),也可以保留檔案的擁有者、群組與權限設定,
rsync 在第一次複製檔案時,會複製完整的檔案內容,而之後再次複製檔案時,就會先以 delta transfer 演算法檢查新舊檔案之間的差異,只傳送有變動的部份,可加快備份速度,尤其是在累進備份大檔案時,效果更明顯。另外 rsync 在使用網路傳送資料時,也支援資料的自動壓縮與解壓縮,這樣可以有效減少耗費的網路頻寬。

安裝 rsync

大部分的 Linux 發行版都會內建 rsync 工具,如果您的系統沒有安裝,通常也都可以透過系統的套件來安裝。Red Hat 系列的 Linux 可用 yum 安裝:
sudo yum install rsync
Debian 系列的 Linux 則可用 apt-get
sudo apt-get install rsync

rsync 基本用法

rsync 的基本語法結構如下:
rsync 參數 來源檔案 目的檔案
以下是最常見的幾個參數:
  • -v:verbose 模式,輸出比較詳細的訊息。
  • -r:遞迴(recursive)備份所有子目錄下的目錄與檔案。
  • -a:封裝備份模式,相當於 -rlptgoD,遞迴備份所有子目錄下的目錄與檔案,保留連結檔、檔案的擁有者、群組、權限以及時間戳記。
  • -z:啟用壓縮。
  • -h:將數字以比較容易閱讀的格式輸出。
rsync 最簡單的用法就是複製本地端的檔案:
rsync -avh myfile.gz /home/pi/tmp/
sending incremental file list
myfile.gz

sent 14.34M bytes  received 35 bytes  28.67M bytes/sec
total size is 14.33M  speedup is 1.00
其效果就跟 cp -r 類似,可將 myfile.gz 複製到 /home/pi/tmp/ 目錄中,不過如果執行第二次時,rsync 就會自動跳過沒有變動的檔案:
rsync -avh myfile.gz /home/pi/tmp/
sending incremental file list

sent 74 bytes  received 12 bytes  172.00 bytes/sec
total size is 14.33M  speedup is 166,658.15
這種用法對於檔案或目錄都適用:
rsync -avh /path/to/myfolder /home/pi/tmp/

rsync 遠端備份

rsync 也可以用於不同台機器之間的遠端備份,這樣的用法就跟 scp 指令很像,不過 rsync 會更有效率:
rsync -avzh /mypath/myfile.gz pi@192.168.1.12:/mybackup/
這樣就會將本地端的 myfile.gz 備份至 pi@192.168.1.12 的 /mybackup/ 目錄中,在遇到這種遠端備份的狀況時,rsync 預設會以 ssh 的方式登入遠端的機器,所以在執行這行備份指令之後,要接著輸入pi@192.168.1.12 的密碼,接著就會開始備份資料,輸出會類似這樣:
pi@192.168.1.12's password: 
sending incremental file list
myfile.gz

sent 13.62M bytes  received 34 bytes  48.56K bytes/sec
total size is 14.33M  speedup is 1.05
而這裡我們多加入一個 -z 參數,目的是讓 rsync 可以自動將資料壓縮後再傳送,並在遠端接收到資料後自動解壓縮,減少網路傳輸的資料量。
rsync 也可以將遠端的檔案備份至本地端,其語法也跟 scp 類似:
rsync -avzh pi@192.168.1.12:/mypath/myfile.gz /mybackup/
pi@192.168.1.12's password: 
receiving incremental file list
myfile.gz

sent 30 bytes  received 23.74M bytes  571.98K bytes/sec
total size is 24.14M  speedup is 1.02
這裡的 rsync 在複製檔案時,由於我們加入了 -a 參數,所以可以用於檔案或是整個目錄的備份,相當於 scp -r 的效果,而且由於 rsync 只會傳輸有變動的部份,所以通常在異地備份資料時都會使用這種方式來處理。

限制網路頻寬

如果不想讓 rsync 在透過網路備份資料時,佔用太大的網路頻寬而影響正常的服務,可以加上 --bwlimit 參數來指定資料傳輸的速度上限:
rsync -avzh --bwlimit=100K pi@192.168.1.12:/mypath/myfile.gz /mybackup/
pi@192.168.1.12's password: 
receiving incremental file list
myfile.gz

sent 30 bytes  received 14.34M bytes  99.22K bytes/sec
total size is 14.33M  speedup is 1.00

自訂 SSH 連接埠

正常 ssh 遠端登入服務的連接埠(port)號碼是 22,但有些人為了保護伺服器避免受到太多的網路攻擊,會將 ssh 的連接埠改成其他的號碼,例如 12345,不過這樣的話在使用 rsync 進行遠端備份資料時,就也要跟著指定連接埠號碼。
假設 192.168.1.12 這台伺服器的 ssh 服務連接埠號碼為 12345,以下是透過 rsync 將資料備份資料的範例:
rsync -avzh -e 'ssh -p 12345' /mypath/myfile.gz pi@192.168.1.12:/mybackup/
這裡我們多加入一個 -e 參數,其用途是指定遠端登入所要使用的指令,預設的指令就是 ssh,而這裡我們將指令變更為 ssh -p 12345,也就是使用 12345 這個連接埠登入 ssh 的意思(請參考 ssh 指令的 -p 參數用法)。

顯示傳輸進度

如果要讓 rsync 在傳輸檔案時可以即時顯示進度,可以加上 --progress 參數:
rsync -avzh --progress pi@192.168.1.12:/mypath/myfile.gz /mybackup/
這樣在備份每的檔案的過程就會顯示傳輸的進度、傳輸速度與剩餘時間等資訊:
pi@192.168.1.12's password: 
receiving incremental file list
myfile.gz
         24.14M 100%  623.52kB/s    0:00:37 (xfr#1, to-chk=0/1)

sent 30 bytes  received 23.74M bytes  558.52K bytes/sec
total size is 24.14M  speedup is 1.02

同步刪除檔案

rsync 預設只會將來源端現存的檔案同步更新至目的端(同步所有新增或修改的檔案),但是如果在來源端有檔案被刪除的話,rsync 並不會主動刪除目的端的檔案,這樣可以確保資料被勿刪時,備份檔不會也跟著被刪除。
如果您想要讓 rsync 也同步將不存在於來源端的檔案刪除的話,可以加上 --delete 參數,如果沒有來源檔案只有新增、沒有減少的話,它就跟一般的複製動作相同:
rsync -avh --delete myfolder/ backup/
sending incremental file list
./
data1.txt
data2.txt
data3.txt
data4.txt

sent 432 bytes  received 95 bytes  1.05K bytes/sec
total size is 116  speedup is 0.22
這時候若我們將來源檔案的 data1.txt 與 data2.txt 刪除,並且增加 data5.txt,在執行一次 rsync
rsync -avh --delete myfolder/ backup/
sending incremental file list
deleting data2.txt
deleting data1.txt
./
data5.txt

sent 190 bytes  received 64 bytes  508.00 bytes/sec
total size is 87  speedup is 0.34
這時候 rsync 就會同步將備份端的 data1.txt 與 data2.txt 刪除,並且同時新增 data5.txt
如果這裡我們沒有加上 --delete 參數的話,rsync 就只會新增 data5.txt,不會刪除任何檔案。

備份特定檔案

假設我們的檔案與目錄結構如下:
tree myfolder
myfolder
├── chinese.py
├── data1.txt
├── data2.txt
├── find_edimax.c
└── src
    ├── pack.c
    ├── test1.txt
    └── test2.txt
若要讓 rsync 在備份檔案時,排除所有 *.txt 的文字檔檔案,可以使用 --exclude 參數:
rsync -avh --exclude '*.txt' myfolder/ backup/
sending incremental file list
./
chinese.py
find_edimax.c
src/
src/pack.c

sent 3.91K bytes  received 88 bytes  7.99K bytes/sec
total size is 3.59K  speedup is 0.90
我們可以使用多個 --exclude 來排除多種檔案,例如:
rsync -avh --exclude '*.txt' --exclude '*.py' myfolder/ backup/
sending incremental file list
./
find_edimax.c
src/
src/pack.c

sent 3.74K bytes  received 65 bytes  7.61K bytes/sec
total size is 3.50K  speedup is 0.92
如果只想要備份某些特定的檔案,可以將 --exclude 與 --include 配合使用,例如只備份所有 *.c 的 C 語言原始碼:
rsync -avh --include '*.c' --include '*/' --exclude '*' myfolder/ backup/
sending incremental file list
./
find_edimax.c
src/
src/pack.c

sent 3.74K bytes  received 69 bytes  7.62K bytes/sec
total size is 3.50K  speedup is 0.92
這裡我們加入兩個 --include 來指定要備份的檔案比對規則,*.c 就是包含所有 C 語言的原始碼檔案,而另外一個 */ 的意思是指包含所有的目錄,若沒有加上包含目錄的參數,所有的目錄就會被後面 --exclude 排除,造成所有子目錄中的 *.c 也跟著被排除。最後加上一個 --exclude 排除其餘所有的檔案,請注意 --exclude 要放在 --include 之後,順序不可以對調。

限定備份檔案大小

rsync 也可以依照檔案的大小來選擇備份的檔案,假設在 myfolder 目錄中有以下這些檔案:
ls -l myfolder/
total 15632
-rw-r--r-- 1 pi pi  1658348 Feb  5 09:09 bluez-5.43.tar.xz
-rw-r--r-- 1 pi pi       94 Feb  5 07:57 chinese.py
-rw-r--r-- 1 pi pi     2736 Feb  5 07:57 find_edimax.c
-rw-r--r-- 1 pi pi 14332601 Feb  5 09:09 myfile.gz
-rw-r--r-- 1 pi pi      763 Feb  5 08:02 pack.c
--min-size 可以指定備份檔案的大小下限,例如只備份 1MB 以上的檔案:
rsync -avh --min-size=1M myfolder/ backup/
sending incremental file list
./
bluez-5.43.tar.xz
myfile.gz

sent 16.00M bytes  received 57 bytes  31.99M bytes/sec
total size is 15.99M  speedup is 1.00
而 --max-size 可以指定備份檔案的大小上限,例如只備份 4KB 以下的檔案:
rsync -avh --max-size=4K myfolder/ backup/
sending incremental file list
./
chinese.py
find_edimax.c
pack.c

sent 3.91K bytes  received 76 bytes  7.97K bytes/sec
total size is 15.99M  speedup is 4,012.68
--min-size 與 --max-size 也可以同時使用,例如只備份 1KB 到 2MB 之間的檔案:
rsync -avh --min-size=1K --max-size=2M myfolder/ backup/
sending incremental file list
./
bluez-5.43.tar.xz
find_edimax.c

sent 1.66M bytes  received 57 bytes  3.32M bytes/sec
total size is 15.99M  speedup is 9.62

自動刪除來源檔案

如果想讓 rsync 在備份檔案之後,自動將來源檔案刪除(也就是相當於 mv 的效果),可以加上 --remove-source-files 參數:
rsync -avh --remove-source-files myfolder/ backup/
sending incremental file list
./
bluez-5.43.tar.xz
chinese.py
find_edimax.c
myfile.gz
pack.c

sent 16.00M bytes  received 154 bytes  10.67M bytes/sec
total size is 15.99M  speedup is 1.00
這樣執行 rsync 之後,myfolder/ 目錄會被清空,所有的資料都會被移到 backup/ 目錄中,所以請小心使用,別勿刪重要檔案。

測試 rsync 參數

初學者如果不確定自己的 rsync 參數是否正確,在實際執行之前可以加上 --dry-run 來測試一下,加上這個參數之後 rsync 執行時還是會輸出正常的訊息,不過並不會更動到任何的檔案:
rsync -avh --dry-run --remove-source-files myfolder/ backup/
sending incremental file list
bluez-5.43.tar.xz
chinese.py
find_edimax.c
myfile.gz
pack.c

sent 194 bytes  received 31 bytes  450.00 bytes/sec
total size is 15.99M  speedup is 71,086.85 (DRY RUN)
這樣可以方便使用者檢查自己的參數是否配置得宜。

crontab 定期備份

通常如果要在本地端進行備份,就可以在 crontab 中定期執行這樣的指令,將重要的資料定期備份至指定目錄:
# m h  dom mon dow   command
0 5 * * 1 rsync -a /path/to/folder /path/to/backup/
這樣系統就會在每週一的早上 5 點執行 rsync 備份檔案。

只更新既有檔案

如果在備份檔案時,只想要更新過去已經備份過得檔案,排出新增的檔案,可以使用 --existing 參數。
假設我們過去已經將 myfolder/ 的檔案備份至 backup/ 了:
rsync -avh myfolder/ backup/
而這時候又新增了一個新的檔案:
touch myfolder/new.file
若此時我們只要更新 backup/ 中已經存在的檔案,排除後來新增的,就可以使用 --existing 參數:
rsync -avh --existing myfolder/ backup/
sending incremental file list
./

sent 201 bytes  received 19 bytes  440.00 bytes/sec
total size is 15.99M  speedup is 72,702.46

顯示檔案變動資訊

執行 rsync 時加入 -i 參數可以個別檔案變動的資訊:
rsync -avhi myfolder/ backup/
sending incremental file list
.d..t...... ./
.f...p..... find_edimax.c
>f..t...... myfile.gz
>f+++++++++ new.file
>f.st...... pack.c

sent 14.34M bytes  received 79 bytes  3.19M bytes/sec
total size is 15.99M  speedup is 1.12
加入 -i 之後,每個檔案項目之前會多出一個標示字串,而這個標示字串的欄位有 11 個,分別為 YXcstpoguax,其意義如下:
  • Y< 代表檔案傳送至遠端,> 代表檔案傳送至本地端,c 代表本地端變動(建立目錄等),h 代表硬式連結(hard link),. 代表沒有變動,* 代表其餘欄位有包含訊息(例如 deleting)。
  • X:檔案類型,f 為一般檔案,d 為目錄,L 為連結檔,D 為設備檔(device),S 為特殊檔案(如 sockets 或 fifo)。
  • c:代表檔案內容有變動。
  • s:代表檔案大小有變動。
  • t:代表檔案時間戳記有變動。
  • p:代表檔案權限有變動。
  • o:代表檔案擁有者有變動。
  • g:代表檔案群組有變動。
  • u:保留欄位。
  • a:代表檔案 ACL 資訊有變動。
  • x:代表檔案擴充屬性(extended attribute)有變動。

[CentOS5] 解決yum 停止支援的問題


這近要用yum更新套件時,發現不能更新。

OS

# lsb_release -a
LSB Version:    :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-ia32:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 5.8 (Final)
Release:        5.8  <==太舊了
Codename:       Final
# yum install package
Loaded plugins: fastestmirror
Determining fastest mirrors
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/
removing mirrorlist with no valid mirrors: /var/cache/yum/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base
我以為是我的yum 壞掉了,到repository去看才知道是停止支援。該版本的目錄還在,只是沒檔案,留了一個字條:
This directory (and version of CentOS) is depreciated. CentOS-5 is now past EOL You can get the last released version of centos 5.11 here: http://vault.centos.org/5.11/ Please NOTE: this is not being maintained for security since moving to Vault. It will have security issues, you should upgrade to a new version instead.
好的,至少還有「遺跡」可以用。

修改

# vi /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://vault.centos.org/5.8/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=http://vault.centos.org/5.8/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://vault.centos.org/5.8/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
把原本的註解或刪掉,加上上面黃色的。
勉強能用

[相關連結]

http://blog.sina.com.cn/s/blog_541a3cf10101h245.html

2019年9月3日 星期二

Software Raid: 分散式檔案系統

分散式檔案系統

歷史
第一個檔案伺服器在1970年代被發展出來。在1976年迪吉多公司設計出File Access Listener(FAL)做為第二代DECnet的一部分。
這個系統實作了Data Access Protocol,是第一個被廣為使用的網路檔案系統。在1985年昇陽電腦建立了網路檔案系統(Network File System,NFS),
這是第一個基於網際協定(Internet Protocol)而被廣泛使用的網路檔案系統。在相關技術的演進過程中,
其他值得一提的網路檔案系統還有安德魯檔案系統(AFS)、Apple Filing Protocol(AFP)、NetWare核心協定(NCP)、
和一般被稱為網路檔案分享系統(CIFS)的伺服器訊息區塊(Server Message Block,SMB)等。

相對於本機端的檔案系統而言,分散式檔案系統(英語:Distributed file system, DFS),或是網路檔案系統(英語:Network File System),
是一種允許檔案透過網路在多台主機上分享的檔案系統,可讓多機器上的多使用者分享檔案和儲存空間。
在這樣的檔案系統中,客戶端並非直接存取底層的資料儲存區段,而是透過網路,以特定的通訊協定和伺服器溝通。
藉由通訊協定的設計,可以讓客戶端和伺服器端都能根據存取控制清單或是授權,來限制對於檔案系統的存取。
相對地,在一個分享的磁碟檔案系統中,所有節點對資料儲存區段都有相同的存取權,在這樣的系統中,存取權限就必須由客戶端程式來控制。
分散式檔案系統可能包含的功能有:透通的資料複製與容錯。也就是說,即使系統中有一小部份的節點離線,整體來說系統仍然可以持續運作而不會有資料損失。
分散式檔案系統和分散式資料儲存的界線是模糊的,但一般來說,分散式檔案系統是被設計用在區域網路[1],比較強調的是傳統檔案系統概念的延伸,並透過軟體方法來達成容錯。
而分散式資料儲存,則是泛指應用分散式運算技術的檔案和資料庫等提供資料儲存服務的系統。

資料來源: 維基百科,自由的百科全書

Redundant Arrays of Inexpensive Disks, RAID

磁碟陣列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,
英翻中的意思是:容錯式廉價磁碟陣列。 RAID 可以透過一個技術(軟體或硬體),將多個較小的磁碟整合成為一個較大的磁碟裝置;
而這個較大的磁碟功能可不止是儲存而已,他還具有資料保護的功能呢。整個 RAID 由於選擇的等級 (level) 不同,而使得整合後的磁碟具有不同的功能,基本常見的 level 有這幾種(註1):

RAID-0 (等量模式, stripe):效能最佳
這種模式如果使用相同型號與容量的磁碟來組成時,達到儲存容量全部使用兩倍容量,讀取速度有機會兩倍,寫入速度1.5倍最高。

RAID-1 (映射模式, mirror):完整備份
這種模式也是需要相同的磁碟容量的,最好是一模一樣的磁碟啦!如果是不同容量的磁碟組成 RAID-1 時,那麼總容量將以最小的那一顆磁碟為主!
這種模式主要是『讓同一份資料,完整的保存在兩顆磁碟上頭』。舉例來說,如果我有一個 100MB 的檔案,且我僅有兩顆磁碟組成 RAID-1 時, 那麼這兩顆磁碟將會同步寫入 100MB 到他們的儲存空間去。
因此,整體 RAID 的容量幾乎少了 50%。由於兩顆硬碟內容一模一樣,好像鏡子映照出來一樣, 所以我們也稱他為 mirror 模式囉~
由於兩顆磁碟內的資料一模一樣,所以任何一顆硬碟損毀時,你的資料還是可以完整的保留下來的!
所以我們可以說, RAID-1 最大的優點大概就在於資料的備份吧!不過由於磁碟容量有一半用在備份,因此總容量會是全部磁碟容量的一半而已。
雖然 RAID-1 的寫入效能不佳,不過讀取的效能則還可以啦!這是因為資料有兩份在不同的磁碟上面,如果多個 processes 在讀取同一筆資料時, RAID 會自行取得最佳的讀取平衡。

RAID 5:效能與資料備份的均衡考量
RAID-5 至少需要三顆以上的磁碟才能夠組成這種類型的磁碟陣列。這種磁碟陣列的資料寫入有點類似 RAID-0 , 不過每個循環的寫入過程中,在每顆磁碟還加入一個同位檢查資料 (Parity),
這個資料會記錄其他磁碟的備份資料, 用於當有磁碟損毀時的救援。RAID-5 讀寫的情況有點像底下這樣:
在讀寫效能的比較上,讀取的效能還不賴!與 RAID-0 有的比!不過寫的效能就不見得能夠增加很多! 這是因為要寫入 RAID 5 的資料還得要經過計算同位檢查碼 (parity) 的關係。
由於加上這個計算的動作, 所以寫入的效能與系統的硬體關係較大!尤其當使用軟體磁碟陣列時,同位檢查碼是透過 CPU 去計算而非專職的磁碟陣列卡, 因此效能方面還需要評估。

RAID 6:效能與資料備份的均衡考量,容錯提升容量減少!
另外,由於 RAID 5 僅能支援一顆磁碟的損毀,因此近來還有發展出另外一種等級,就是 RAID 6 ,
這個 RAID 6 則使用兩顆磁碟的容量作為 parity 的儲存,因此整體的磁碟容量就會少兩顆,但是允許出錯的磁碟數量就可以達到兩顆了!
也就是在 RAID 6 的情況下,同時兩顆磁碟損毀時,資料還是可以救回來!

Spare Disk:預備磁碟的功能:
當磁碟陣列的磁碟損毀時,就得要將壞掉的磁碟拔除,然後換一顆新的磁碟。換成新磁碟並且順利啟動磁碟陣列後,
磁碟陣列就會開始主動的重建 (rebuild) 原本壞掉的那顆磁碟資料到新的磁碟上!然後你磁碟陣列上面的資料就復原了!
這就是磁碟陣列的優點。不過,我們還是得要動手拔插硬碟,此時通常得要關機才能這麼做。
為了讓系統可以即時的在壞掉硬碟時主動的重建,因此就需要預備磁碟 (spare disk) 的輔助。
所謂的 spare disk 就是一顆或多顆沒有包含在原本磁碟陣列等級中的磁碟,這顆磁碟平時並不會被磁碟陣列所使用,
當磁碟陣列有任何磁碟損毀時,則這顆 spare disk 會被主動的拉進磁碟陣列中,並將壞掉的那顆硬碟移出磁碟陣列! 然後立即重建資料系統。
如此你的系統則可以永保安康啊!若你的磁碟陣列有支援熱拔插那就更完美了! 直接將壞掉的那顆磁碟拔除換一顆新的,再將那顆新的設定成為 spare disk ,就完成了!

磁碟陣列的優點
說的口沫橫飛,重點在哪裡呢?其實你的系統如果需要磁碟陣列的話,其實重點在於:

資料安全與可靠性:指的並非資訊安全,而是當硬體 (指磁碟) 損毀時,資料是否還能夠安全的救援或使用之意;
讀寫效能:例如 RAID 0 可以加強讀寫效能,讓你的系統 I/O 部分得以改善;
容量:可以讓多顆磁碟組合起來,故單一檔案系統可以有相當大的容量。
尤其資料的可靠性與完整性更是使用 RAID 的考量重點!畢竟硬體壞掉換掉就好了,軟體資料損毀那可不是鬧著玩的! 所以企業界為何需要大量的 RAID 來做為檔案系統的硬體基準,現在您有點瞭解了吧?

為何磁碟陣列又分為硬體與軟體呢?所謂的硬體磁碟陣列 (hardware RAID) 是透過磁碟陣列卡來達成陣列的目的。
磁碟陣列卡上面有一塊專門的晶片在處理 RAID 的任務,因此在效能方面會比較好。在很多任務 (例如 RAID 5 的同位檢查碼計算) 磁碟陣列並不會重複消耗原本系統的 I/O 匯流排,
理論上效能會較佳。此外目前一般的中高階磁碟陣列卡都支援熱拔插, 亦即在不關機的情況下抽換損壞的磁碟,對於系統的復原與資料的可靠性方面非常的好用。
不過一塊好的磁碟陣列卡動不動就上萬元台幣,便宜的在主機板上面『附贈』的磁碟陣列功能可能又不支援某些高階功能,
由於磁碟陣列有很多優秀的功能,然而硬體磁碟陣列卡偏偏又貴的很~因此就有發展出利用軟體來模擬磁碟陣列的功能, 這就是所謂的軟體磁碟陣列 (software RAID)。
軟體磁碟陣列主要是透過軟體來模擬陣列的任務, 因此會損耗較多的系統資源,比如說 CPU 的運算與 I/O 匯流排的資源等。
不過目前我們的個人電腦實在已經非常快速了, 因此以前的速度限制現在已經不存在!所以我們可以來玩一玩軟體磁碟陣列!

參考來源:  鳥哥 linux 私房菜!

Software Raid: ZFS


ZFS:

歷史
ZFS的設計與開發由Sun公司的Jeff Bonwick所領導的一支團隊完成。
最早宣布於2004年9月14日,[1]於2005年10月31日併入了Solaris開發的主幹原始碼。
[2]並在2005年11月16日作為OpenSolaris build 27的一部分釋出。Sun在OpenSolaris社群開張1年後的2006年六月,將ZFS整合進了Solaris 10 6/06版本更新。[3]
ZFS的命名來源發想於"Zettabyte File System"的首字母縮寫。[4]但ZFS本身並不具備任何的縮寫意涵,只是作者想闡述做為一個具備高擴充容量檔案系統且還有支援許多延伸功能的一個產品。

儲存池
不同於傳統檔案系統需要駐留於單獨裝置或者需要一個卷管理系統去使用一個以上的裝置,
ZFS建立在虛擬的,被稱為「zpools」的儲存池之上(儲存池最早在AdvFS實現[5],並且加到後來的Btrfs)。
每個儲存池由若干虛擬裝置(virtual devices,vdevs)組成。這些虛擬裝置可以是原始磁碟,也可能是一個RAID1鏡像裝置,或是非標準RAID等級的多磁碟組。
於是zpool上的檔案系統可以使用這些虛擬裝置的總儲存容量。

可以使用磁碟限額以及設定磁碟預留空間來限制儲存池中單個檔案系統所占用的空間。

ZFS 是一個從本質上與眾不同的檔案系統,由於它並非只是一個檔案系統,
ZFS 結合了檔案系統及磁碟區管理程式,讓額外的儲存裝置可以即時的加入到系統並可讓既有的檔案系統立即使用這些在儲存池中空間。
透過結合傳統區分為二的兩個角色,ZFS 能夠克服以往 RAID 磁碟群組無法擴充的限制。每個在儲存池頂層的裝置稱作 vdev,其可以是一個簡單的磁碟或是一個 RAID 如鏡像或 RAID-Z 陣列。

ZFS 的檔案系統 (稱作 資料集 (Dataset)) 每一個資料集均可存取整個存池所共通的可用空間,隨著使用儲存池來配置空間區塊,儲存池能給每個檔案系統使用的可用空間就會減少,這個方法可以避免擴大分割區會使的可用空間分散分割區之間的常見問題。


Software Raid: Gluster FS

Gluster FS:

歷史
Gluster 在 2011 年被 Red Hat 所購買並且成為產品線的一部份,因為分散式檔案系統可以解決傳統上所有檔案存放於單一主機時不易擴充的問題,並且可以增進檔案存取的速度。
Gluster 的導入解決了資料量增加,空間不易同時擴充的問題,也解決所有流量儲存於同一節點時資源消耗的問題。
在檔案可靠性方面,Gluster 提供了 Replicated 模式將同一份資料同時寫入兩個節點,所以就算其中一組異常其檔案存取仍可以正常運作,而且資料不會不見。

Gluster 是一個分散式的檔案系統,擁有下列明顯的特性:
1.可以線上擴增使用空間。
2.線上修改架構。
3.不需要 metadata 伺服器。

4.線上增加、刪除、取代儲存庫成員。

可以線上擴增使用空間
通常在更換硬體設備時需要將伺服器關機然後安裝相關硬體後再上線,在關機的這段時間裡,客戶端無法存取資料與操作檔案。
Gluster 可以彈性擴充增加伺服器節點,將新的節點加入到原本的 Gluster 儲存庫中,使用者不用擔心檔案操作的問題。

線上修改架構
Gluster 支援了分散式架構、複本架構與分散複本架構,在現行的環境中可以將這些架構任意的更改而且不用中斷服務,客戶端仍可以正常的操作檔案。

Distributed 分散式架構
分散式架構是 Gluster 預設的架構模式,建立完成之後客戶端會將檔案分散到不同的節點存放,如此一來可以增加檔案的存取速度。

Replication 複本架構
Gluster 允許的複本(Replication)機制設定後,同一時間將檔案寫入到兩個節點,製作複本是由客戶端進行,當檔案在寫入或修改時會同時操作兩個節點資料。
當複本架構中的任一節點故障時,整個存儲空間不會損壞,Gluster 會自動從所對應中的節點取得檔案。

Distributed-Replication 分散複本架構
分散複本架構同時擁有分散式與複本的優點(但是也需要更多節點),您可以在一個複本架構中增加多個分散式節點,如此資料會分散到更多的節點中,可以增加更多的讀取效能。

不需要 metadata 伺服器
Gluster 使用了 Elastic Hash Algorithm 演算法將檔案與目錄算出獨一的結果,此一結果能夠決定檔案是存放在哪一個節點上。
當客戶端要存取檔案的時候不就可以直接到檔案所存放的節點中存取,達到平行存取的機制。
因為每一個檔案都可以被計算出其真正的儲存位置,所以不需要獨立的 metadata 用來儲存檔案與伺服器位置的關係對應,這樣可以減少 metadata 伺服器效能與損毀的問題。

線上增加、刪除、取代儲存池成員
以往的儲存設備在空間不足時用時,擴充方式通常是使用一個更大的儲存空間取代,在進行空間儲存時必需中斷現有的儲存服務,
使用者無法存取儲存空間與檔案,在建立完成後還要面對一個長時間的等待-檔案複製與權限設定。
在 Gluster 儲存服務中,您可以很有彈性的增加空間,而且不用停機、不用將現有檔案重新複製到新的空間、不用重新設定檔案權限,使用者依然正常的使用者儲存服務而沒有任何的感覺。

新增節點空間
使用 Gluster 可以將新的節點空間加入已存在的儲存庫,客戶端不用異動任何檔案與資料。
新加入的空間馬上可以反應在客戶端的可用容量上並且開始使用。您不用擔心浪費即有還能使用的儲存設備,也可以增加檔案存取的效能。
在您新增節點空間後,可以使用內建的 rebalance 功能重新分配 Gluster 檔案配置的位置,重新分配完成之後也可以取得較佳的效態(不論是讀取或是寫入)。

節點取代
任何的伺服器都有故障的時候,就算您使用了最高階的儲存設備也是一樣。經由 Gluster 架構,您可以很容易的使用新節點伺服器取代舊有的設備,
所有的檔案同步作業會自動進行不必使用人工進行檔案複製,這樣不旦保有了檔案並且權限也會一併保留。

節點刪除
在大部份的情況之下都是新增容量而不是減少容量,但是 Gluster 提供了節點刪除的功能,刪除節點會減少可用空間,被刪除的節點伺服器可以重新分配應用。

在節點刪除的時候,Gluster 將所有的檔案進行重新分配(rebalance),將它們重新放置在沒有被刪除的節點伺服器上。

來源參考: http://www.l-penguin.idv.tw/book/Gluster-Storage_GitBook/index.html