1. 程式人生 > >GlusterFS分散式儲存系統

GlusterFS分散式儲存系統

一,分散式檔案系統理論基礎

1.1 分散式檔案系統出現

  • 計算機通過檔案系統管理,儲存資料,而現在資料資訊爆炸的時代中人們可以獲取的資料成指數倍的增長,單純通過增加硬碟個數來擴充套件計算機檔案系統的儲存容量的方式,已經不能滿足目前的需求。
  • 分散式檔案系統可以有效解決資料的儲存和管理難題,將固定於某個地點的某個檔案系統,擴充套件到任意多個地點/多個檔案系統,眾多的節點組成一個檔案系統網路。每個節點可以分佈在不同的地點,通過網路進行節點間的通訊和資料傳輸。人們在使用分散式檔案系統時,無需關心資料是儲存在哪個節點上,或者是從哪個節點從獲取的,只需要像使用本地檔案系統一樣管理和儲存檔案系統中的資料。

1.2 典型代表NFS

NFS(Network File System)即網路檔案系統,它允許網路中的計算機之間通過TCP/IP網路共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS伺服器上的檔案,就像訪問本地檔案一樣。NFS的優點如下:

(1)節約使用的磁碟空間

客戶端經常使用的資料可以集中存放在一臺機器上,並使用NFS釋出,那麼網路內部所有計算機可以通過網路訪問,不必單獨儲存。

(2)節約硬體資源

NFS還可以共享軟碟機,CDROM和ZIP等的儲存裝置,減少整個網路上的可移動裝置的數量。

(3)使用者主目錄設定

對於特殊使用者,如管理員等,為了管理的需要,可能會經常登陸到網路中所有的計算機,若每個客戶端,均儲存這個使用者的主目錄很繁瑣,而且不能保證資料的一致性。實際上,經過NFS服務的設定,然後在客戶端指定這個使用者的主目錄位置,並自動掛載,就可以在任何計算機上使用使用者主目錄的檔案。

1.3 面臨的問題

儲存空間不足,需要更大容量的儲存 
直接用NFS掛載儲存,有一定風險,存在單點故障 
某些場景不能滿足需求,大量的訪問磁碟IO是瓶頸

1.4 GlusterFS概述

  • GlusterFS是Scale-Out儲存解決方案Gluster的核心,它是一個開源的分散式檔案系統,具有強大的橫向擴充套件能力,通過擴充套件能夠支援數PB儲存容量和處理數千客戶端。GlusterFS藉助TCP/IP或InfiniBand RDMA網路將物理分佈的儲存資源聚集在一起,使用單一全域性名稱空間來管理資料。
  • GlusterFS支援執行在任何標準IP網路上標準應用程式的標準客戶端,使用者可以在全域性統一的命令空間中使用NFS/CIFS等標準協議來訪問應用程式。GlusterFS使得使用者可擺脫原有的獨立,高成本的封閉儲存系統,能夠利用普通廉價的儲存裝置來部署可集中管理,橫向擴充套件,虛擬化的儲存池,儲存容量可擴充套件至TB/PB級。
  • 目前glusterfs已被redhat收購,它的官方網站是:http://www.gluster.org/

超高效能(64個節點時吞吐量也就是頻寬甚至達到32GB/s

 

 

1.5 GlusterFS企業主要應用場景

 

 

 

理論和實踐上分析,GlusterFS目前主要適用大檔案儲存場景,對於小檔案尤其是海量小檔案(小於1M),儲存效率和訪問效能都表現不佳。海量小檔案LOSF問題是工業界和學術界公認的難題,GlusterFS作為通用的分散式檔案系統,並沒有對小檔案作額外的優化措施(小於1M),效能不好也是可以理解的。

  • Media

文件,圖片,音訊,視訊

  • Shared storage

雲端儲存,虛擬化儲存,HPC(高效能運算)

  • Big data

日誌檔案,RFID(射頻識別)資料

二,部署安裝

2.1 GlusterFS 安裝前的準備

  1. 電腦一臺,記憶體>=4G,可用磁碟空間大於50G
  2. 安裝VMWARE Workstation虛擬機器軟體
  3. 安裝好四臺CentOS-6-x86_64(6.2-6.8都可以)的虛擬機器
  4. 基本系統:1核CPU+1024M記憶體+10G硬碟
  5. 網路選擇:網路地址轉換(NAT)
  6. 關閉iptables和SELinux
  7. 預裝glusterfs軟體包

描述

IP

主機名

需求

Linux_node1

10.1.1.136

Glusterfs01

多新增兩塊各10G的sdb和sdc

Linux_node2

10.1.1.137

Glusterfs02

多新增兩塊各10G的sdb和sdc

Linux_node3

10.1.1.138

Glusterfs03

多新增兩塊各10G的sdb和sdc

Linux_node4

10.1.1.139

Glusterfs04

多新增兩塊各10G的sdb和sdc

  1. #為了實驗的準確性,請儘量和我用一個版本的Linux作業系統
  2. #並用實驗給的rpm包作為yum源

以下01上的操作步驟,其他三臺伺服器也要做

[[email protected] ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[[email protected] ~]# uname -r
2.6.32-431.el6.x86_64
[[email protected] ~]# cd rpm/
[[email protected] rpm]# ls
dbench-4.0-12.el6.x86_64.rpm
glusterfs-3.7.20-1.el6.x86_64.rpm
glusterfs-api-3.7.20-1.el6.x86_64.rpm
glusterfs-api-devel-3.7.20-1.el6.x86_64.rpm
glusterfs-cli-3.7.20-1.el6.x86_64.rpm
glusterfs-client-xlators-3.7.20-1.el6.x86_64.rpm
glusterfs-coreutils-0.0.1-0.1.git0c86f7f.el6.x86_64.rpm
glusterfs-coreutils-0.2.0-1.el6_37.x86_64.rpm
glusterfs-devel-3.7.20-1.el6.x86_64.rpm
glusterfs-extra-xlators-3.7.20-1.el6.x86_64.rpm
glusterfs-fuse-3.7.20-1.el6.x86_64.rpm
glusterfs-ganesha-3.7.20-1.el6.x86_64.rpm
glusterfs-geo-replication-3.7.20-1.el6.x86_64.rpm
glusterfs-libs-3.7.20-1.el6.x86_64.rpm
glusterfs-rdma-3.7.20-1.el6.x86_64.rpm
glusterfs-resource-agents-3.7.20-1.el6.noarch.rpm
glusterfs-server-3.7.20-1.el6.x86_64.rpm
keyutils-1.4-5.el6.x86_64.rpm
keyutils-libs-1.4-5.el6.x86_64.rpm
libaio-0.3.107-10.el6.x86_64.rpm
libevent-1.4.13-4.el6.x86_64.rpm
libgssglue-0.1-11.el6.x86_64.rpm
libntirpc-1.3.1-1.el6.x86_64.rpm
libntirpc-devel-1.3.1-1.el6.x86_64.rpm
libtirpc-0.2.1-13.el6_9.x86_64.rpm
nfs-utils-1.2.3-75.el6_9.x86_64.rpm
nfs-utils-lib-1.1.5-13.el6.x86_64.rpm
python-argparse-1.2.1-2.1.el6.noarch.rpm
python-gluster-3.7.20-1.el6.noarch.rpm
pyxattr-0.5.0-1.el6.x86_64.rpm
rpcbind-0.2.0-13.el6_9.1.x86_64.rpm
rsync-3.0.6-12.el6.x86_64.rpm
userspace-rcu-0.7.16-2.el6.x86_64.rpm
userspace-rcu-0.7.7-1.el6.x86_64.rpm
userspace-rcu-devel-0.7.16-2.el6.x86_64.rpm
userspace-rcu-devel-0.7.7-1.el6.x86_64.rpm
[[email protected] rpm]# yum -y install createrepo
[[email protected] rpm]# createrepo -v .

2.2 GlusterFS 安裝

2.2.1 修改主機名

2.2.2 新增hosts檔案實現叢集主機之間相互能夠解析

[[email protected] ~]# vim /etc/hosts
[[email protected] ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.1.136 glusterfs01
10.1.1.137 glusterfs02
10.1.1.138 glusterfs03
10.1.1.139 glusterfs04

2.2.3 關閉selinux和防火牆

[[email protected]~]# service iptables stop

[[email protected] ~]# chkconfig iptables off
[[email protected] ~]# setenforce 0
setenforce: SELinux is disabled

關閉selinux:sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/sysconfig/selinux

2.2.4 利用教程附帶的rpm軟體包組,充當本地定製化yum源

[[email protected] rpm]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# vim CentOS-Media.repo

[[email protected] yum.repos.d]# cat CentOS-Media.repo | grep -v "#"
 
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
              file:///media/cdrom/
              file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[rpm]
name=rpm
baseurl=file:///root/rpm
gpgcheck=0
enabled=1
[[email protected] yum.repos.d]# yum -y clean all && yum makecache
[[email protected] yum.repos.d]# yum -y install glusterfs-server glusterfs-cli glusterfs-geo-r
eplication

2.3 配置glusterfs

2.3.1 檢視glusterfs版本資訊

[[email protected] ~]# which glusterfs
/usr/sbin/glusterfs
[[email protected] ~]# glusterfs -V
glusterfs 3.7.20 built on Jan 30 2017 15:39:27
Repository revision: git://git.gluster.com/glusterfs.git
Copyright (c) 2006-2013 Red Hat, Inc. <http://www.redhat.com/>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
It is licensed to you under your choice of the GNU Lesser
General Public License, version 3 or any later version (LGPLv3
or later), or the GNU General Public License, version 2 (GPLv2),
in all cases as published by the Free Software Foundation.

2.3.2 啟動停止服務

[[email protected] ~]# /etc/init.d/glusterd status
glusterd is stopped
[[email protected] ~]# /etc/init.d/glusterd start
Starting glusterd:                                         [  OK  ]
[[email protected] ~]# /etc/init.d/glusterd stop
Stopping glusterd:                                         [  OK  ]
[[email protected] ~]# /etc/init.d/glusterd start
Starting glusterd:                                         [  OK  ]
[[email protected] ~]# chkconfig glusterd on            #新增開機啟動

2.3.3 儲存主機加入信任儲存池

虛擬機器新增信任儲存池 
特別提示:只需要讓一個虛擬機器進行新增操作即可。但自己並不需要新增信任自己

確保所有的虛擬機器的glusterd服務都處於開啟狀態,然後執行如下操作

[[email protected] ~]# gluster peer probe glusterfs02
peer probe: success.
[[email protected] ~]# gluster peer probe glusterfs03
peer probe: success.
[[email protected] ~]# gluster peer probe glusterfs04
peer probe: success.

2.3.4 檢視虛擬機器信任狀態新增結果

[[email protected] ~]# gluster peer status
Number of Peers: 3

Hostname: glusterfs02
Uuid: 7dd28ae9-f31d-4b86-9c82-1e40afac7968
State: Peer in Cluster (Connected)

Hostname: glusterfs03
Uuid: 6cb71933-f9d1-436d-90e0-06d505f9838b
State: Peer in Cluster (Connected)

Hostname: glusterfs04
Uuid: d983c0c1-5f58-4e2b-87ec-9448b3fa49e6
State: Peer in Cluster (Connected)
這時我們可以檢視每臺虛擬機器的信任狀態,他們此時彼此都應該已經互有信任記錄了

2.3.5 配置前的準備工作

在企業裡我們還需要分割槽然後才能進行格式化。但是我們這裡就省略了,我們直接格式化每臺虛擬機器的那塊10G硬碟。

[[email protected] ~]# ll /dev/sd*
brw-rw---- 1 root disk 8,  0 Jan  1 00:55 /dev/sda
brw-rw---- 1 root disk 8,  1 Jan  1 00:55 /dev/sda1
brw-rw---- 1 root disk 8,  2 Jan  1 00:55 /dev/sda2
brw-rw---- 1 root disk 8, 16 Jan  1 00:55 /dev/sdb
brw-rw---- 1 root disk 8, 32 Jan  1 00:55 /dev/sdc
[[email protected] ~]# mkfs.ext4 /dev/sdb
mke2fs 1.41.12 (17-May-2010)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

在四臺機器上執行mkdir -p /gluster/brick1 建立掛在塊裝置的目錄 
掛載磁碟到檔案系統(4臺都做,步驟相同)

[[email protected] ~]# mkdir -p /gluster/brick1
[[email protected] ~]# mount /dev/sdb /gluster/brick1
[[email protected] ~]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_mini-lv_root   36G  1.1G   33G   4% /
tmpfs                        931M     0  931M   0% /dev/shm
/dev/sda1                    485M   33M  427M   8% /boot
/dev/sr0                     4.2G  4.2G     0 100% /media/cdrom
/dev/sdb                     9.9G  151M  9.2G   2% /gluster/brick1

繼續重複以上步驟,將第二塊磁碟sdc格式化,並掛載到每臺虛擬機器的/gluster/brick2

4臺虛擬機器加入開機自動掛載

[[email protected] ~]# echo "mount /dev/sdb /gluster/brick1" >> /etc/rc.local
[[email protected] ~]# echo "mount /dev/sdc /gluster/brick2" >> /etc/rc.local

2.3.6 建立volume分散式卷

  • 基本卷: 
    • 分散式卷(Distributed):(相當於raid0讀寫速度)
    • 複製卷(Replicated):(相當於raid1)
    • 條帶式卷(Striped):(針對大檔案才會用)
  • 複合卷: 
    • 分散式複製卷(Distributed Replicated):(相當於raid1+0)
    • 分散式條帶卷(Distributed Striped):(針對大檔案)
    • 複製條帶卷(Replicated Striped):
    • 分散式複製條帶卷(Distributed Replicated Striped):(最安全的)

建立分散式卷(在glusterfs01上操作)

[[email protected] ~]# gluster volume create gs1 glusterfs01:/gluster/brick1 gluste
rfs02:/gluster/brick1 forcevolume create: gs1: success: please start the volume to access data

啟動建立的卷(在glusterfs01上操作)

[[email protected] ~]# gluster volume start gs1
volume start: gs1: success

然後我們發現4臺虛擬機器都能看到如下資訊(在任意虛擬機器上操作)

[[email protected] ~]# gluster volume info
 
Volume Name: gs1  #卷名


Type: Distribute    #分散式
Volume ID: cfca2f8b-a522-49ae-9f46-b1f50ac61f81      #ID號
Status: Started   #啟動狀態
Number of Bricks: 2     #一共兩個塊裝置
Transport-type: tcp   #tcp的連線方式
Bricks:      #塊資訊
Brick1: glusterfs01:/gluster/brick1
Brick2: glusterfs02:/gluster/brick1
Options Reconfigured:
performance.readdir-ahead: on

2.3.7 volume的兩種掛載方式

1)以glusterfs方式掛載

掛載捲到目錄(在glusterfs01上操作),將本地的分散式卷gs1掛載到/mnt目錄下

[[email protected] ~]# mount -t glusterfs 127.0.0.1:/gs1 /mnt
[[email protected] ~]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_mini-lv_root   36G  1.1G   33G   4% /
tmpfs                        931M     0  931M   0% /dev/shm
/dev/sda1                    485M   33M  427M   8% /boot
/dev/sr0                     4.2G  4.2G     0 100% /media/cdrom
/dev/sdb                     9.9G  151M  9.2G   2% /gluster/brick1
/dev/sdc                     9.9G  151M  9.2G   2% /gluster/brick2
127.0.0.1:/gs1                20G  302M   19G   2% /mnt        #掛載成功,我們看到磁碟空間已經整合

在掛載好的/mnt目錄裡建立實驗檔案(在glusterfs01上操作)

[[email protected] ~]# touch /mnt/{1..5}
[[email protected] ~]# ls /mnt
1  2  3  4  5  lost+found
在其他虛擬機器上掛載分散式卷gs1,檢視同步掛載結果

[[email protected] ~]# mount -t glusterfs 127.0.0.1:/gs1 /mnt
[[email protected] ~]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_mini-lv_root   36G  1.1G   33G   4% /
tmpfs                        931M     0  931M   0% /dev/shm
/dev/sda1                    485M   33M  427M   8% /boot
/dev/sr0                     4.2G  4.2G     0 100% /media/cdrom
/dev/sdb                     9.9G  151M  9.2G   2% /gluster/brick1
/dev/sdc                     9.9G  151M  9.2G   2% /gluster/brick2
127.0.0.1:/gs1                20G  302M   19G   2% /mnt
[[email protected] ~]# ls /mnt
1  2  3  4  5  lost+found
去其他節點上看這5個檔案到底在哪

[[email protected] ~]# ll -d /gluster/brick1
drwxr-xr-x 5 root root 4096 Jan  1 04:25 /gluster/brick1
[[email protected] ~]# ls /gluster/brick1
1  5  lost+found
[[email protected] ~]# ls /gluster/brick1
2  3  4  lost+found
我們發現檔案都是分散式寫的,互相不重複,就意味著可以它可以併發寫,但是這種情況下壞一個數據就完了,就相當於raid0,分佈卷直接組5張盤的話,就會同時往5個盤裡寫,讀寫速度是5倍。但是其中壞一個盤資料就完了,這就是分佈卷。

2)以NFS方式進行掛載

在掛載之前我們先來看一下如何開啟glusterfs的NFS掛載方式

在glusterfs01上執行如下操作

[[email protected] ~]# gluster volume status     #檢視分散式卷的狀態
Status of volume: gs1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick glusterfs01:/gluster/brick1           49152     0          Y       2815
Brick glusterfs02:/gluster/brick1           49152     0          Y       2035
NFS Server on localhost                      N/A       N/A         N       N/A    #本地分散式卷NFS掛載未開啟
NFS Server on glusterfs02                   N/A       N/A        N       N/A  
NFS Server on glusterfs03                   N/A       N/A        N       N/A  
NFS Server on glusterfs04                   N/A       N/A        N       N/A  
 
Task Status of Volume gs1
------------------------------------------------------------------------------
There are no active volume tasks

以上結果是是什麼原因呢? 
如果NFS Server的掛載埠顯示N/A表示未開啟掛載功能,這是由於要先進行nfs掛載是需要裝兩個nfs的軟體包的rpcbind和nfs-utils 
當然就算系統裝了這兩個軟體包,那麼我們也需要開啟rpcbind服務,然後在重啟glusterfs服務才能夠進行nfs掛載的操作。 
現在我們就來開啟glusterfs01的nfs掛載功能,如下:

在glusterfs01上執行如下操作

[[email protected] ~]# rpm -qa nfs-utils   #檢視是否安裝nfs-utils
nfs-utils-1.2.3-75.el6_9.x86_64
[[email protected] ~]# rpm -qa rpcbind    #檢視是否安裝rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
[[email protected] ~]# /etc/init.d/rpcbind status   #檢視rpcbind服務狀態
rpcbind is stopped
[[email protected] ~]# /etc/init.d/rpcbind start     #開啟rpcbind服務
Starting rpcbind:                                          [  OK  ]
[[email protected] ~]# /etc/init.d/glusterd stop    #停止glusterd服務
Stopping glusterd:                                         [  OK  ]
[[email protected] ~]# /etc/init.d/glusterd start     #開啟glusterd服務
Starting glusterd:                                         [  OK  ]

這裡需要等幾秒再檢視,就會發現nfs掛載方式開啟了

[[email protected] ~]# gluster volume status
Status of volume: gs1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick glusterfs01:/gluster/brick1           49152     0          Y       2815
Brick glusterfs02:/gluster/brick1           49152     0          Y       2035
NFS Server on localhost                     2049      0          Y       3352      #已經開啟
NFS Server on glusterfs03                   N/A       N/A        N       N/A  
NFS Server on glusterfs04                   N/A       N/A        N       N/A  
NFS Server on glusterfs02                   N/A       N/A        N       N/A  
 
Task Status of Volume gs1
------------------------------------------------------------------------------
There are no active volume tasks


 為了驗證再起一臺虛擬機器,充當realserver,web節點,把realserver節點開啟
WebClient     10.1.1.140

接下來,我們嘗試在準備好的第五臺虛擬機器WebClient上進行nfs方式的掛載

在WebClient上進行如下操作(客戶端要有nfs-utils)

[[email protected] ~]# rpm -qa nfs-utils
[[email protected] ~]# mount /dev/sr0 /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
[[email protected] ~]# yum -y install nfs-utils
[[email protected] ~]# mount -t nfs 10.1.1.136:/gs1 /mnt    #以nfs方式遠端掛載分散式卷
mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified
[[email protected] ~]# mount -o nolock -t nfs 10.1.1.136:/gs1 /mnt  #根據提示我們加上-o nolock引數
[[email protected] ~]# df -hT
Filesystem                  Type     Size  Used Avail Use% Mounted on
/dev/mapper/vg_mini-lv_root ext4      36G  1.1G   33G   4% /
tmpfs                       tmpfs    931M     0  931M   0% /dev/shm
/dev/sda1                   ext4     485M   33M  427M   8% /boot
/dev/sr0                    iso9660  4.2G  4.2G     0 100% /media/cdrom
10.1.1.136:/gs1             nfs       20G  301M   19G   2% /mnt
[[email protected] ~]# ls /mnt   #掛載成功
1  2  3  4  5  lost+found

2.3.8 建立分散式複製卷

在glusterfs任意虛擬機器上進行如下操作

[[email protected] ~]# gluster volume create gs2 replica 2 glusterfs03:/gluster
/brick1 glusterfs04:/gluster/brick1 forcevolume create: gs2: success: please start the volume to access data
[[email protected] ~]# gluster volume info gs2
 
Volume Name: gs2
Type: Replicate      #複製卷
Volume ID: 44a22292-faa6-4dd1-8ed5-9038e8e01d1f
Status: Created
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: glusterfs03:/gluster/brick1
Brick2: glusterfs04:/gluster/brick1
Options Reconfigured:
performance.readdir-ahead: on
[[email protected] ~]# gluster volume start gs2    #啟動卷
volume start: gs2: success
[[email protected] ~]# umount /mnt
[[email protected] ~]# df -hT
Filesystem                  Type     Size  Used Avail Use% Mounted on
/dev/mapper/vg_mini-lv_root ext4      36G  1.1G   33G   4% /
tmpfs                       tmpfs    931M     0  931M   0% /dev/shm
/dev/sda1                   ext4     485M   33M  427M   8% /boot
/dev/sr0                    iso9660  4.2G  4.2G     0 100% /media/cdrom
/dev/sdb                    ext4     9.9G  151M  9.2G   2% /gluster/brick1
/dev/sdc                    ext4     9.9G  151M  9.2G   2% /gluster/brick2
[[email protected] ~]# mount -t glusterfs 127.0.0.1:gs2 /mnt
[[email protected] ~]# df -hT
Filesystem                  Type            Size  Used Avail Use% Mounted on
/dev/mapper/vg_mini-lv_root ext4             36G  1.1G   33G   4% /
tmpfs                       tmpfs           931M     0  931M   0% /dev/shm
/dev/sda1                   ext4            485M   33M  427M   8% /boot
/dev/sr0                    iso9660         4.2G  4.2G     0 100% /media/cdrom
/dev/sdb                    ext4            9.9G  151M  9.2G   2% /gluster/bri
ck1/dev/sdc                    ext4            9.9G  151M  9.2G   2% /gluster/bri
ck2127.0.0.1:gs2               fuse.glusterfs  9.9G  151M  9.2G   2% /mnt
建立檔案測試
[[email protected] ~]# touch /mnt/{1..6}
[[email protected] ~]# ls /mnt/
1  2  3  4  5  6  lost+found
再看看它是怎麼存的
[[email protected] ~]# ls /gluster/brick1
1  2  3  4  5  6  lost+found
[[email protected] ~]# ls /gluster/brick1
1  2  3  4  5  6  lost+found
複製卷,這就是raid1。安全,但是容量減半

分散式複製卷,這裡測試只用了兩個,如果用四個就會出現它是兩兩組合的,兩個之間是共享,兩個1之間又是0,又是分散式的。這就是分散式複製卷。

2.3.9 建立分散式條帶卷

[[email protected] ~]# gluster volume create gs3 stripe 2 glusterfs01:/gluste
r/brick2 glusterfs02:/gluster/brick2 forcevolume create: gs3: success: please start the volume to access data
[[email protected] ~]# gluster volume start gs3
volume start: gs3: success
[[email protected] ~]# gluster volume info gs3
 
Volume Name: gs3
Type: Stripe     #條帶卷
Volume ID: d3f57ff2-6968-46eb-8ab4-e0bfef747551
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: glusterfs01:/gluster/brick2
Brick2: glusterfs02:/gluster/brick2
Options Reconfigured:
performance.readdir-ahead: on

三,進行條帶卷的資料寫入測試

[[email protected] ~]# umount /mnt
[[email protected] ~]# mount -t glusterfs 127.0.0.1:/gs3 /mnt
[[email protected] ~]# ls /mnt/
lost+found
[[email protected] ~]# df -Th
Filesystem                  Type            Size  Used Avail Use% Mounted on
/dev/mapper/vg_mini-lv_root ext4             36G  1.1G   33G   4% /
tmpfs                       tmpfs           931M     0  931M   0% /dev/shm
/dev/sda1                   ext4            485M   33M  427M   8% /boot
/dev/sr0                    iso9660         4.2G  4.2G     0 100% /media/cdrom
/dev/sdb                    ext4            9.9G  151M  9.2G   2% /gluster/brick1
/dev/sdc                    ext4            9.9G  151M  9.2G   2% /gluster/brick2
127.0.0.1:/gs3          fuse.glusterfs   20G  302M   19G   2% /mnt

建立大小為256M的檔案
[[email protected] ~]# dd if=/dev/zero of=/mnt/test bs=1024 count=262144
262144+0 records in
262144+0 records out
268435456 bytes (268 MB) copied, 22.295 s, 12.0 MB/s
[[email protected] ~]# ls /mnt
lost+found  test
[[email protected] ~]# du -sh /mnt/test
256M    /mnt/test
[[email protected] ~]# ls /gluster/brick2
lost+found  test
[[email protected] ~]# du -sh /gluster/brick2/test
129M    /gluster/brick2/test
條帶卷會把大檔案給分半,之前的分散式卷他是按檔案個數,不會把單個檔案給拆分,但是條帶卷針對大檔案它會分半,所以條帶卷是專門針對大檔案大資料用的

綜上,我們得知:

分散式卷的資料儲存方式是將資料平均寫入到每個整合的磁碟中,類似於raid0,寫入速度快,但這樣磁碟一旦損壞沒有糾錯能力。

分散式複製卷的資料儲存方式為,每個整合的磁碟中都寫入同樣的資料內容,類似於raid1,資料非常安全,讀取效能高,佔磁碟容量。

我們發現分散式條帶卷,是將資料的容量平均分配到了每個整合的磁碟節點上。大幅提高大檔案的併發讀訪問。

四,儲存卷中brick塊裝置的擴容

4.1 分散式複製卷的擴容

先將各個虛擬機器上掛載的解除安裝掉,免得有處於使用狀態的
[[email protected] ~]# umount /mnt
[[email protected] ~]# gluster volume add-brick gs2 replica 2 glusterfs03:/gluster/brick2 gluste
rfs04:/gluster/brick2 force     #新增兩個塊

volume add-brick: success
[[email protected] ~]# gluster volume info gs2
 
Volume Name: gs2
Type: Distributed-Replicate
Volume ID: 44a22292-faa6-4dd1-8ed5-9038e8e01d1f
Status: Started
Number of Bricks: 2 x 2 = 4   #已經擴容
Transport-type: tcp
Bricks:
Brick1: glusterfs03:/gluster/brick1
Brick2: glusterfs04:/gluster/brick1
Brick3: glusterfs03:/gluster/brick2
Brick4: glusterfs04:/gluster/brick2
Options Reconfigured:
performance.readdir-ahead: on

特別提示: 
對分散式複製卷和分散式條帶捲進行擴容時,要特別注意,如果建立卷之初的時候選擇的是replica 2 或者stripe 2。那麼擴容時,就必須一次性擴容兩個或兩個的倍數的塊裝置。 
例如你給一個分散式複製卷的replica為2,你在增加bricks的時候數量必須為2,4,6,8等。

4.2 檢視擴容後的容量並進行寫入測試

在WebClient上掛載gs2並檢視掛載目錄的容量

[[email protected] ~]# mount -o nolock -t nfs 10.1.1.136:/gs2 /mnt
[[email protected] ~]# df -Th
Filesystem                  Type     Size  Used Avail Use% Mounted on
/dev/mapper/vg_mini-lv_root ext4      36G  1.1G   33G   4% /
tmpfs                       tmpfs    931M     0  931M   0% /dev/shm
/dev/sda1                   ext4     485M   33M  427M   8% /boot
/dev/sr0                    iso9660  4.2G  4.2G     0 100% /media/cdrom
10.1.1.136:/gs2             nfs       20G  301M   19G   2% /mnt

我們再次寫入資料

在WebClient上進行資料寫入操作

[[email protected] ~]# gluster volume info gs2
 
Volume Name: gs2
Type: Distributed-Replicate
Volume ID: 44a22292-faa6-4dd1-8ed5-9038e8e01d1f
Status: Started
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: glusterfs03:/gluster/brick1
Brick2: glusterfs04:/gluster/brick1
Brick3: glusterfs03:/gluster/brick2
Brick4: glusterfs04:/gluster/brick2
Options Reconfigured:
performance.readdir-ahead: on
看真實儲存

[[email protected] ~]# ls /gluster/brick1
1  2  3  4  5  6  lost+found
[[email protected] ~]# ls /gluster/brick2
lost+found
[[email protected] ~]# ls /gluster/brick1
1  2  3  4  5  6  lost+found
[[email protected] ~]# ls /gluster/brick2
lost+found
brick2都是空的也就是說,我們啟用的新節點沒有進行復制
現在往裡面寫入資料,從11寫到20,看它是怎麼存的

[[email protected] ~]# touch /mnt/{11..20}
[[email protected] ~]# ls /mnt
1  11  12  13  14  15  16  17  18  19  2  20  3  4  5  6  lost+found

再看看他是怎麼存的

[[email protected] ~]# ls /gluster/brick1
1  11  12  13  14  15  16  17  18  19  2  20  3  4  5  6  lost+found
[[email protected] ~]# ls /gluster/brick2
lost+found
[[email protected] ~]# ls /gluster/brick1
1  11  12  13  14  15  16  17  18  19  2  20  3  4  5  6  lost+found
[[email protected] ~]# ls /gluster/brick2
lost+found
沒有寫到brick2裡面去,因為我們新增節點沒有進行同步操作,現在咱們把新的節點加進去了,但是他的這個gs2還不認得,我們需要做一次磁碟平衡

通過對擴容的gs2進行寫入測試,我們發現數據並沒有被寫入到新加入的塊裝置中,這是為什麼? 
這是因為,為了資料的安全,新擴容塊裝置的卷,預設必須先做一次磁碟平衡(塊裝置同步),如此才能正常開始使用。

4.3 進行磁碟儲存的平衡

注意:平衡佈局是很有必要的,因為佈局結構是靜態的,當新的bricks加入現有卷,新建立的檔案會分佈到舊的bricks中,所以需要平衡佈局結構,使新加入的bricks生效。佈局平衡只是使新佈局生效,並不會在新的佈局移動老的資料,如果你想在新佈局生效後,重新平衡卷中的資料,還需要對卷中的資料進行平衡。

對gs2進行磁碟儲存平衡

[[email protected] ~]# gluster volume rebalance gs2 start
volume rebalance: gs2: success: Rebalance on gs2 has been started successfully. Use
 rebalance status command to check status of the rebalance process.ID: 94c7cd2b-4a1f-4609-b371-06e18e077b1f

檢查gs2塊裝置磁碟平衡結果

[[email protected] ~]# ls /gluster/brick1
12  14  15  16  17  2  3  4  6  lost+found
[[email protected] ~]# ls /gluster/brick2
1  11  13  18  19  20  5  lost+found
[[email protected] ~]# ls /gluster/brick1
12  14  15  16  17  2  3  4  6  lost+found
[[email protected] ~]# ls /gluster/brick2
1  11  13  18  19  20  5  lost+found
執行磁碟儲存平衡以後,我們發現數據被複製成了4份在4個塊裝置中

在測試一下

[[email protected] ~]# touch /mnt/{30..35}
[[email protected] ~]# ls /mnt
1   12  14  16  18  2   3   31  33  35  5  lost+found
11  13  15  17  19  20  30  32  34  4   6
[[email protected] ~]# ls /gluster/brick1
12  14  15  16  17  2  3  30  31  32  33  34  35  4  6  lost+found
[[email protected] ~]# ls /gluster/brick2
1  11  13  18  19  20  5  lost+found
[[email protected] ~]# ls /gluster/brick1
12  14  15  16  17  2  3  30  31  32  33  34  35  4  6  lost+found
[[email protected] ~]# ls /gluster/brick2
1  11  13  18  19  20  5  lost+found
之前做過磁碟平衡,現有資料平衡了,新寫資料不平衡了。我們發現沒有往裡面寫!為什麼呢??
因為沒做磁碟平衡之前,那邊將gs2已經掛載上了,掛載過去的話實際上它的後方是埠對埠,也就是說他之前掛載過,只識別了03和04的brick1的埠,後來磁碟平衡以後由於我沒有解除安裝再掛,所以它還是識別那兩個埠(猜的,不然解釋不通)

解決方法:磁碟平衡以後要重新掛載gs2

[[email protected] ~]# umount /mnt
[[email protected] ~]# mount -t nfs -o nolock 10.1.1.136:/gs2 /mnt
[[email protected] ~]# rm -rf /mnt/*
[[email protected] ~]# ls /mnt
[[email protected] ~]# touch /mnt/{1..10}
[[email protected] ~]# ls /gluster/brick1
10  2  3  4  6
[[email protected] ~]# ls /gluster/brick2
1  5  7  8  9
[[email protected] ~]# ls /gluster/brick1
10  2  3  4  6
[[email protected] ~]# ls /gluster/brick2
1  5  7  8  9
成功了,擴容正常。

六,構建企業級分散式儲存

6.1 硬體要求

一般選擇2U的機型,磁碟STAT盤4T,如果I/O要求比較高,可以採購SSD固態硬碟。為了充分保證系統的穩定性和效能,要求所有glusterfs伺服器硬體配置儘量一致,尤其是硬碟數量和大小。機器的RAID卡需要帶電池,快取越大,效能越好。一般情況下,建議做RAID10,如果出於空間要求考慮,需要做RAID5,建議最好能有1-2塊硬碟的熱備盤。

6.2 系統要求和分區劃分

系統要求使用CentOS6.x,安裝完成後升級到最新版本,安裝的時候,不要使用LVM,建議/boot分割槽200M,根分割槽100G,swap分