轉自:http://bangbangba.blog.51cto.com/3180873/1712061
GlusterFS是一款非常易於使用的分布式文件存儲系統,實現了全部標准POSIX接口,並用fuse實現虛擬化,讓用戶看起來就像是本地磁盤一樣。因此程序想從本地磁盤切換到GlusterFS時是不用修改任何代碼的,做到了無縫切換。並且讓多台電腦的程序看起來在使用同一塊硬盤,簡化了很多邏輯。如果您的應用單機磁盤不夠放時,不妨考慮下GlusterFS。
一、 GlusterFS源碼安裝
1. glusterfs 依賴安裝
a. centos下yum安裝
1
|
yum install -y flex bison openssl-devel libacl-devel sqlite-devel libxml2-devel libtool automake autoconf gcc attr
|
liburcu-bp需源碼安裝,yum源里面沒有
先執行常規命令安裝,進入源碼目錄后
1
2
3
4
|
. /bootstrap
. /configure
make
sudo make install
|
執行完常規安裝命令后需要執行下面兩個命令,才可以讓系統找到urcu.
1
2
|
sudo ldconfig
sudo pkg-config --libs --cflags liburcu-bp liburcu
|
b. ubuntu下 apt-get安裝
1
|
sudo apt-get install flex bison libssl-dev libacl1-dev libsqlite3-dev libxml2-dev liburcu-dev automake autoconf gcc attr
|
d. 可選安裝
此外如果要geo 復制功能,需要額外安裝,並開啟ssh服務:
1
|
yum install -y passwd openssh-client openssh-server
|
e. docker下安裝額外操作
如果機器只有一台,又想測試集群,可以考慮用docker,然而docker對應用有些功能限制,所以不能直接使用,需要多操作一些。
①需要安裝attr
1
|
yum install attr -y
|
②沒有fuse的時候需要手動建一個
1
|
mknod /dev/fuse c 10 229
|
③運行容器的時候需要提升權限
docker run --privileged=true
例如:
1
2
3
|
sudo docker run --privileged= true -it -h glfs0 - v /dk/d0 : /d --name=glfs0 gfs7:2 /bin/bash
或
sudo docker run --privileged= true -it -- rm - v /dk/rm0 : /d gfs7:2 /bin/bash
|
④. 需要加載一個本地卷,將數據文件放在本地卷的目錄中,否則磁盤的額外屬性不能使用。
2. glusterfs編譯安裝
安裝完以上依賴后,我們從官網 http://www.gluster.org/download/ 下載源碼,再編譯glusterfs,gluserfs編譯命令為常規命令,配置時加上--enable-debug表示編譯為帶debug信息的調試版本
1
2
3
|
. /configure --prefix= /usr
make
sudo make install
|
二、 GlusterFS服務啟停
glusterfs的大部分命令都需要在root權限下運行,沒有root權限會出現各種錯誤,因此我這里的命令前面都加了sudo,如果您直接用root登錄,需免去sudo。
1. 啟動命令
1
2
3
4
5
|
sudo service glusterd start
或
sudo /etc/init .d /glusterd start
或
sudo glusterd
|
2. 停止命令
1
2
3
4
5
6
7
8
|
sudo service glusterd stop
或
sudo /etc/init .d /glusterd stop
或
ps aux| grep glusterd
sudo kill xxxxxx-pid
或ubuntu下
sudo killall glusterd
|
直接kill需要先停止各volume才比較安全。
三、 集群關聯
1. 准備機器(或虛擬機、docker)若干台,我這里啟動了4個docker,IP為172.17.0.2 ~ 172.17.0.5
2. 在每台機器上啟動glusterFS服務,如上一節。
3. 得到每一台機器的ip或hostname
4. 在第一台機器(172.17.0.2)上執行關聯命令,
1
2
3
4
|
sudo gluster peer probe 172.17.0.3
sudo gluster peer probe 172.17.0.4
sudo gluster peer probe 172.17.0.5
......
|
這樣所有機器已經連在一起,注意該命令的意思相當於集群邀請某人加入自己的組織。
四、 卷/volume操作
1.創建volume
a. 單磁盤,調試環境推薦
1
|
sudo gluster volume create vol_name 172.17.0.2: /d/disk0
|
b. 多磁盤,無raid,試驗、測試環境推薦。
1
|
sudo gluster volume create vol_name 172.17.0.2: /d/disk0 172.17.0.3: /d/disk0 172.17.0.4: /d/disk0 172.17.0.5: /d/disk0
|
c. 多磁盤,有raid1。線上高並發環境推薦。
1
|
sudo gluster volume create vol_name replica 2 172.17.0.2: /d/disk0 172.17.0.3: /d/disk0 172.17.0.4: /d/disk0 172.17.0.5: /d/disk0
|
注意:以上命令中,磁盤數量必須為復制份數的整數倍。
此外有raid0,raid10,raid5,raid6等方法,但是在線上小文件集群不推薦使用。
2.啟動volume
剛創建好的volume還沒有運行,需要執行運行命令方可使用。
1
|
sudo gluster volume start vol_name
|
3.掛載volume
1
2
|
sudo mkdir /local_mount_dir
sudo mount -t glusterfs -o acl 172.17.0.2: /vol_name /local_mount_dir
|
4.使用GlusterFS
a. 掛載了GlusterFS的某個卷后,就可以將其當做本地文件訪問,代碼中只需使用原生的文件api即可。這種方式使用不一定需要root權限,只要擁有對應目錄或文件的權限即可。
b. 直接API方式,這種方式需要root權限才能使用,並且java、python、ruby的api包裝目前都不夠完整,一般情況不推薦使用。
5.卸載volume
卸載與掛載操作是一對。雖然沒有卸載也可以停止volume,但是這樣做是會出問題,如果集群較大,可能導致后面volume啟動失敗。
1
|
sudo umount /local_mount_dir
|
6.停止volume
停止與啟動操作是一對。停止前最好先卸載所有客戶端。
1
|
sudo gluster volume stop vol_name
|
7.刪除volume
刪除與創建操作是一對。刪除前需要先停止volume。在生產上一般不會刪除volume
1
|
sudo gluster volume delete vol_name
|
8.在線修復
當某塊磁盤損壞后,需要換一塊新的磁盤回去,這時集群中恰好還預留了備用磁盤,因此用備用磁盤替換損壞的磁盤,命令如下兩條命令
1
2
|
sudo gluster volume replace-brick vol_name 172.17.0.3: /d/damaged_disk 172.17.0.16: /d/new_disk commit
sudo gluster volume heal vol_name full
|
9.在線擴容
隨着業務的增長,集群容量不夠時,需要添加更多的機器和磁盤到集群中來。
a. 普通情況只需要增加分布的廣度就可以,增加的磁盤數量必須為最小擴容單元的整數倍,即replica×stripe,或disperse數的整數倍:
1
|
sudo gluster volume add-brick vol_name 172.17.0.11: /d/disk0 172.17.0.12: /d/disk0 172.17.0.13: /d/disk0 172.17.0.14: /d/disk0
|
該方法執行完后,需要新增的磁盤可能還沒有被實際使用,這時需要平衡數據:
1
|
sudo gluster volume rebalance vol_name start
|
b. 當集群達到一定規模,希望增加備份數時,增加的磁盤數量必須為原分布數量的整數倍。gluster volume info中看到的第一個值,這時需要增加一個參數讓系統知道是修改了數據的備份數。假設原先的replica是2,想要改為3,命令如下:
1
|
sudo gluster volume add-brick vol_name replica 3 172.17.0.11: /d/disk0 172.17.0.12: /d/disk0 172.17.0.13: /d/disk0 172.17.0.14: /d/disk0
|
執行完add-brick命令后,新增的磁盤還沒有被實際使用,且系統不會自動復制,這時需要修復數據,讓系統達到新指定的備份數
1
|
sudo gluster volume heal vol_name full
|
注意:一次只增加一個備份,如果一次增加多個備份,目前版本可能出錯。
10.在線收縮
可能原先配置比例不合理,打算將部分存儲機器用於其他用途時,跟擴容一樣,也分兩種情況。
a. 降低分布廣度,移除的磁盤必須是一整個或多個存儲單元,在volume info的結果列表中是連續的多塊磁盤。該命令會自動均衡數據。
1
|
sudo gluster volume remove-brick vol_name 172.17.0.11: /d/disk0 172.17.0.12: /d/disk0 172.17.0.13: /d/disk0 172.17.0.14: /d/disk0 start
|
啟動后需要查看刪除的狀態,實際是自動均衡的狀態,直到狀態從in progress變為completed。
1
|
sudo gluster volume remove-brick vol_name 172.17.0.11: /d/disk0 172.17.0.12: /d/disk0 172.17.0.13: /d/disk0 172.17.0.14: /d/disk0 status
|
狀態顯示執行完成后,提交該移除操作。
1
|
sudo gluster volume remove-brick vol_name commit
|
b. 降低備份數,移除磁盤必須是符合要求(好難表達)。在volume info的結果列表中一般是零散的多塊磁盤(ip可能是連續的)。該命令不需要均衡數據。
1
|
sudo gluster volume remove-brick vol_name replica 2 172.17.0.11: /d/disk0 172.17.0.12: /d/disk0 172.17.0.13: /d/disk0 172.17.0.14: /d/disk0 force
|
降低備份數時,只是簡單刪除,而且命令最后用的也是force參數,如果原先系統數據沒有復制好,那么也就會出現部分丟失。因此該操作需要極其謹慎。必須先保證數據完整,執行sudo gluster volume heal vol_name full命令修復,並執行sudo gluster volume heal vol_name info,和 sudo gluster volume status檢查,確保數據正常情況下再進行。
11.配額設定
a. 一個volume經常會讓多個系統去同時使用,這時為了方便管理,可以為一級或二級目錄加上磁盤配額,避免因某個系統的過量使用,而影響其他系統的正常使用。
1
2
3
|
sudo gluster volume quota vol_name enable
sudo gluster volume quota vol_name limit-usage /srv_a 10GB
sudo gluster volume quota vol_name limit-usage /srv_b 200MB
|
b. 查看當前配額使用量,會以相當直觀的列表展示。
1
|
sudo gluster volume quota vol_name list
|
c. 去掉某個目錄的配額,
1
|
sudo gluster volume quota vol_name remove /srv_a
|
d. 停止配額,該方法慎用,否則會全部清除,往往不是自己想要的結果,因為重新enable后,原先設定的配額都已消失。當然,如果打算重新配置所有目錄時則比較合適。
1
|
sudo gluster volume quota vol_name disable
|
e. 如果系統不打算將所有磁盤都用於GlusterFS,那么可以在根目錄上設置配額。考慮到glusterFS不能充分利用所有的磁盤空間,因此最好將大小設置的比實際空間稍小。
1
|
sudo gluster volume quota vol_name limit-usage / 100TB
|
f. 並且想將這個配額當做磁盤的大小使用,需要執行如下命令,這樣df時顯示的磁盤大小就是配額了。配額使用的是1024進制的,而非磁盤的1000進制。當配額量超過磁盤量時,df也會顯示配額量,因此一定不能這樣設置。
1
|
gluster volume set vol_name quota -deem-statfs on
|
以上配額是針對磁盤使用量,另外glusterFS提供文件數量的配額,limit-objects,list-object。可以根據場景使用。
磁盤配額功能gluster volume quota 目錄容量達到目標大小時,不是馬上生效,而是有一定的時間窗口,(若干秒),在這個時間內,數據還可以寫入。這樣的特性在配額比較大的時候並不影響,一般不會在短時間內超過太多。
12.raid選型
raid1:適合線上中小文件場景,創建命令如前文。
單磁盤,無raid,raid0三種方式只適合於實驗環境,允許數據的丟失,一旦數據丟失,基本上需要從頭來過。
raid0:適合大文件實驗環境。
1
|
sudo gluster volume create vol_name stripe 3 172.17.0.2: /d/disk0 172.17.0.3: /d/disk0 172.17.0.4: /d/disk0 172.17.0.5: /d/disk0 172.17.0.6: /d/disk0 172.17.0.7: /d/disk0
|
raid10:適合大文件場景。
1
|
sudo gluster volume create vol_name replica 2 stripe 3 172.17.0.2: /d/disk0 172.17.0.3: /d/disk0 172.17.0.4: /d/disk0 172.17.0.5: /d/disk0 172.17.0.6: /d/disk0 172.17.0.7: /d/disk0
|
raid5,raid6等,一般不適合線上環境,但適合geo備份環境,因為是用軟件的方式實現raid5等功能,因此cpu開銷較大,而且一旦有磁盤損壞,計算的cpu開銷更加大,如果在壓力較大的線上環境跑,容易造成較大延遲。如果線上的讀寫壓力很小,也可以考慮使用。
raid5:不很推薦,因為不夠平衡,容錯性太低,而且開銷比較大。
1
|
sudo gluster volume create vol_name disperse 6 redundancy 1 172.17.0.2: /d/disk0 172.17.0.3: /d/disk0 172.17.0.4: /d/disk0 172.17.0.5: /d/disk0 172.17.0.6: /d/disk0 172.17.0.7: /d/disk0
|
raid6:可以使用,比raid5平衡,容錯性比raid5高很多,開銷只是稍大。
1
|
sudo gluster volume create vol_name disperse 7 redundancy 2 172.17.0.2: /d/disk0 172.17.0.3: /d/disk0 172.17.0.4: /d/disk0 172.17.0.5: /d/disk0 172.17.0.6: /d/disk0 172.17.0.7: /d/disk0 172.17.0.8: /d/disk0
|
更為安全的離線geo備份集群raid推薦:(最大可以允許一半的磁盤損壞,具有極高容錯性,數據可用性可達10個9)
1
|
sudo gluster volume create vol_name disperse 10 redundancy 5 172.17.0.2: /d/disk0 172.17.0.3: /d/disk0 172.17.0.4: /d/disk0 172.17.0.5: /d/disk0 172.17.0.6: /d/disk0 172.17.0.7: /d/disk0 172.17.0.8: /d/disk0 172.17.0.9: /d/disk0 172.17.0.10: /d/disk0 172.17.0.11: /d/disk0
|
五、 系統特性
1.cache、數據一致性
客戶端帶有cache,但是該cache並不具備數據一致性,cache的更新是定時更新,默認間隔1秒,也就是說,某個客戶端修改或刪除一個文件后,需要1秒鍾以后,整個集群才能全部感知到,這一秒鍾內會存在數據的不一致。因此GlusterFS不適用於數據一致性要求強的數據。對於圖片、語音等文件,在應用中做限定,不修改圖片,只增加圖片,這樣數據的一致性問題就不會出現。
客戶端的cache會帶來性能的提升,因此當集群有一定規模時,合理的規划客戶端訪問的文件也是有必要的,能夠增強cache的利用率。
2.用戶、權限
GlusterFS所用的用戶是linux自身的用戶,linux用戶有兩個屬性,一個是用戶名,一個是用戶號,linux在文件系統總標識一個文件的權限是用用戶號的,而這個用戶號可以在GlusterFS之間傳遞。比如某用戶名user1,用戶號1001,user1用戶創建了文件A,權限是0600。
這時另外一台電腦,有用戶名user1,用戶號1002,這時該用戶不能訪問A文件。
但是該電腦有一個用戶user3,用戶號是1001,該用戶號與前面的user1用戶號相同,可以訪問A文件。
為了讓用戶名和用戶號不沖突,在創建系統用戶時,指定一個用戶號,並且是不容易被系統自動分配到的區間,這樣在集群之間能使用一致的用戶權限。
六、 集群規模
客戶端或mount進程會跟所有brick連接,並且端口是小於1024的,因此brick數量一定不能超過1024,
在replica模式下,每個服務器有個glusterfs進程會以客戶端形式連接每個brick,如果再在這些服務器上要進行mount,那么最大brick數小於500.
由於端口是使用有限的小於1024的端口,因此要注意保留部分常用的端口,如21,22,80,443端口。避免由於端口被占用導致重要服務無法啟動。
修改 /etc/sysctl.conf 文件,添加一行,具體端口更據需要設定。
1
|
net.ipv4.ip_local_reserved_ports=0-25,80,443
|
然后執行 sysctl 命令使其生效:
1
|
sudo sysctl -p
|
線上集群,不同規模下,集群配置如下表。假設表中的每台機器擁有12塊磁盤,平均可用於存儲的磁盤10塊。另外2塊用於安裝系統、記錄日志、備用等功能。
系統根據不同時期,不斷進行擴容,最大規模可達500台。
系統需要准備一定的備用磁盤或備用機器,以備磁盤或機器損壞時可以及時修復數據。當規模在2-15台時,准備1-3塊磁盤作為備用;當規模在15-500台時,准備1-3台電腦作為備用。
系統集群較大時,要保證讓數據的多個備份在不同的機器上,這樣才可以在系統的某台機器宕機的情況,整個系統還是處於可用狀態。