轉自:http://bangbangba.blog.51cto.com/3180873/1712061java
GlusterFS是一款很是易於使用的分佈式文件存儲系統,實現了所有標準POSIX接口,並用fuse實現虛擬化,讓用戶看起來就像是本地磁盤同樣。所以程序想從本地磁盤切換到GlusterFS時是不用修改任何代碼的,作到了無縫切換。而且讓多臺電腦的程序看起來在使用同一塊硬盤,簡化了不少邏輯。若是您的應用單機磁盤不夠放時,不妨考慮下GlusterFS。
1、 GlusterFS源碼安裝
1. glusterfs 依賴安裝
a. centos下yum安裝python
1
|
yum install -y flex bison openssl-devel libacl-devel sqlite-devel libxml2-devel libtool automake autoconf gcc attr
|
liburcu-bp需源碼安裝,yum源裏面沒有
先執行常規命令安裝,進入源碼目錄後linux
1
2
3
4
|
. /bootstrap
. /configure
make
sudo make install
|
執行完常規安裝命令後須要執行下面兩個命令,纔可讓系統找到urcu.sql
1
2
|
sudo ldconfig
sudo pkg-config --libs --cflags liburcu-bp liburcu
|
b. ubuntu下 apt-get安裝docker
1
|
sudo apt-get install flex bison libssl-dev libacl1-dev libsqlite3-dev libxml2-dev liburcu-dev automake autoconf gcc attr
|
d. 可選安裝
此外若是要geo 複製功能,須要額外安裝,並開啓ssh服務:bootstrap
1
|
yum install -y passwd openssh-client openssh-server
|
e. docker下安裝額外操做
若是機器只有一臺,又想測試集羣,能夠考慮用docker,然而docker對應用有些功能限制,因此不能直接使用,須要多操做一些。
①須要安裝attrubuntu
1
|
yum install attr -y
|
②沒有fuse的時候須要手動建一個centos
1
|
mknod /dev/fuse c 10 229
|
③運行容器的時候須要提高權限
docker run --privileged=true
例如:api
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
|
2、 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才比較安全。
3、 集羣關聯
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
......
|
這樣全部機器已經連在一塊兒,注意該命令的意思至關於集羣邀請某人加入本身的組織。
4、 卷/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
|
5、 系統特性
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文件。
爲了讓用戶名和用戶號不衝突,在建立系統用戶時,指定一個用戶號,而且是不容易被系統自動分配到的區間,這樣在集羣之間能使用一致的用戶權限。
6、 集羣規模
客戶端或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臺電腦做爲備用。
系統集羣較大時,要保證讓數據的多個備份在不一樣的機器上,這樣才能夠在系統的某臺機器宕機的狀況,整個系統仍是處於可用狀態。