CentOS 7安裝部署GlusterFS

CentOS 7安裝部署GlusterFS
一、glusterfs簡介
Glusterfs是一個開源的分佈式文件系統,是Scale存儲的核心,能夠處理千數量級的客戶端。是整合了許多存儲塊(server)通過Infiniband RDMA或者 Tcp/Ip方式互聯的一個並行的網絡文件系統。
  特徵:
•    容量可以按比例的擴展,且性能卻不會因此而降低。
•    廉價且使用簡單,完全抽象在已有的文件系統之上。
•    擴展和容錯設計的比較合理,複雜度較低
•    適應性強,部署方便,對環境依賴低,使用,調試和維護便利
二、glusterfs安裝部署
一般在企業中,採用的是分佈式複製卷,因爲有數據備份,數據相對安全。
 網絡要求全部千兆環境,gluster 服務器至少有 2 塊網卡,1 塊網卡綁定供 gluster 使用,剩餘一塊分配管理網絡 IP,用於系統管理。
  如果有條件購買萬兆交換機,服務器配置萬兆網卡,存儲性能會更好。網絡方面如果安全性要求較高,可以多網卡綁定。
 跨地區機房配置 Gluster,在中國網絡格局下不適用。
• 注意:GlusterFS將其動態生成的配置文件存儲在/var/lib/glusterd中。如果在任何時候GlusterFS無法寫入這些文件(例如,當後備文件系統已滿),它至少會導致您的系統不穩定的行爲;
  或者更糟糕的是,讓您的系統完全脫機。建議爲/var/log等目錄創建單獨的分區,以確保不會發生這種情況。


###環境說明:
3臺機器安裝 GlusterFS 組成一個集羣。

###服務器:
192.168.1.35
192.168.1.37
192.168.1.38

root/AIops@2018
###配置 hosts
vim /etc/hosts

192.168.1.35 gfs-node01
192.168.1.37 gfs-node02
192.168.1.38 gfs-node03

client:
192.168.1.46 gfs-client

####初始化
yum -y install wget net-tools lrzsz gcc gcc-c++ python-devel python-setuptools make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel iftop htop iotop sysstat lsof telnet traceroute tree man
yum -y install epel-release    
yum -y install libibverbs librdmacm xfsprogs nfs-utils rpcbind  libaio liblvm2app lvm2-devel
----
####每個節點修改主機名
    hostnamectl set-hostname gfs-node01
    hostnamectl set-hostname gfs-node02
    hostnamectl set-hostname gfs-node03
    
    hostnamectl set-hostname gfs-client
        

####配置相互間的ssh信任關係
現在gfs-node01節點上產生公私鑰文件,然後將gfs-node01節點的.ssh目錄拷貝給其他節點

[root@gfs-node01 ~]# ssh-keygen -t rsa    一路回車
[root@gfs-node01 ~]# cd .ssh/
[root@gfs-node01 ~]# ls
id_rsa  id_rsa.pub
[root@gfs-node01 ~]# cp id_rsa.pub authorized_keys 
[root@gfs-node01 ~]# scp -r /root/.ssh gfs-node02:/root/
[root@gfs-node01 ~]# scp -r /root/.ssh gfs-node03:/root/

 
然後在各節點直接驗證cephuser用戶下的ssh相互信任關係
$ ssh -p22 gfs-node01
$ ssh -p22 gfs-node02
$ ssh -p22 gfs-node03


###安裝:
CentOS7 安裝glusterfs

在三個節點都安裝glusterfs

yum install centos-release-gluster

yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma

yum install -y glusterfs*

###配置 GlusterFS 集羣:

####啓動glusterFS 

systemctl start glusterd.service

systemctl enable glusterd.service


####在 gfs-node01 節點上配置,將 節點 加入到 集羣中。

[root@gfs-node01 ~]#gluster peer probe gfs-node01
peer probe: success. Probe on localhost not needed

[root@gfs-node01 ~]#gluster peer probe gfs-node02
peer probe: success.

[root@gfs-node01 ~]#gluster peer probe gfs-node03
peer probe: success.

####查看集羣狀態:
[root@gfs-node01 ~]#gluster peer status
Number of Peers: 2

Hostname: gfs-node02
Uuid: 41573e8b-eb00-4802-84f0-f923a2c7be79
State: Peer in Cluster (Connected)

Hostname: gfs-node03
Uuid: da068e0b-eada-4a50-94ff-623f630986d7
State: Peer in Cluster (Connected)

####創建數據存儲目錄:
[root@gfs-node01 ~]# mkdir -p /opt/gluster/data
[root@gfs-node02 ~]# mkdir -p /opt/gluster/data
[root@gfs-node03 ~]# mkdir -p /opt/gluster/data


#####查看volume 狀態:
[root@gfs-node01 ~]#gluster volume info
No volumes present

####創建GlusterFS磁盤(bigbdata): 
[root@gfs-node01 ~]#gluster volume create bigbdata replica 3 gfs-node01:/opt/gluster/data gfs-node02:/opt/gluster/data gfs-node03:/opt/gluster/data force
volume create: bigbdata: success: please start the volume to access data

####GlusterFS幾種volume 模式說明:

#####一、 默認模式,既DHT, 也叫分佈式卷: 將文件已hash算法隨機分佈到 一臺服務器節點中存儲。
gluster volume create test-volume server1:/exp1 server2:/exp2

#####二、 複製模式,既AFR, 創建volume 時帶 replica x 數量: 將文件複製到 replica x 個節點中(類似 RAID 1,replica 數必須等於 volume 中 brick 所包含的存儲服務器數,可用性高)。
gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2

#####三、 條帶模式,既Striped, 創建volume 時帶 stripe x 數量: 將文件切割成數據塊,分別存儲到 stripe x 個節點中 
( 類似raid 0,stripe 數必須等於 volume 中 brick 所包含的存儲服務器數,文件被分成數據塊,以 Round Robin 的方式存儲在 bricks 中,併發粒度是數據塊,大文件性能好。)。
gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2

gluster volume create bigbdata stripe 2 transport tcp gfs-node01:/opt/gluster/data gfs-node02:/opt/gluster/data gfs-node03:/opt/gluster/data force

#####四、 分佈式條帶模式(組合型),最少需要4臺服務器才能創建。創建volume 時 stripe 2 server = 4 個節點: 是DHT 與 Striped 的組合型。
volume中 brick 所包含的存儲服務器數必須是 stripe 的倍數(>=2倍),兼顧分佈式和條帶式的功能。
gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

#####五、 分佈式複製模式(組合型), 最少需要4臺服務器才能創建。創建volume 時 replica 2 server = 4 個節點:是DHT 與 AFR 的組合型。
  volume中brick所包含的存儲服務器數必須是replica 的倍數(>=2倍),兼顧分佈式和複製式的功能。(生產場景推薦使用此種方式)
gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

#####六、 條帶複製卷模式(組合型), 最少需要4臺服務器才能創建。創建volume 時 stripe 2 replica 2 server = 4 個節點: 是 Striped 與 AFR 的組合型。
gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

#####七、 三種模式混合, 至少需要8臺 服務器才能創建。stripe 2 replica 2 , 每4個節點 組成一個組。
gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8

###查看 volume 狀態:
[root@gfs-node01 ~]#gluster volume info

Volume Name: bigbdata
Type: Replicate
Volume ID: e539ff3b-2278-4f3f-a594-1f101eabbf1e
Status: Created
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: gfs-node01:/opt/gluster/data
Brick2: gfs-node02:/opt/gluster/data
Brick3: gfs-node03:/opt/gluster/data
Options Reconfigured:
performance.readdir-ahead: on

###啓動卷 bigbdata 
[root@gfs-node01 ~]#gluster volume start bigbdata
volume start: bigbdata: success

###gluster性能調優:

開啓 指定 volume 的配額: (bigbdata 爲 volume 名稱)
gluster volume quota bigbdata enable

限制 bigbdata 中 / (既總目錄) 最大使用 80GB 空間
gluster volume quota bigbdata limit-usage / 80GB

#設置 cache 4GB
gluster volume set bigbdata performance.cache-size 4GB

#開啓 異步 ,後臺操作
gluster volume set bigbdata performance.flush-behind on

#設置 io 線程 32
gluster volume set bigbdata performance.io-thread-count 32

#設置 回寫 (寫數據時間,先寫入緩存內,再寫入硬盤)
gluster volume set bigbdata performance.write-behind on

###部署GlusterFS客戶端並mount GlusterFS文件系統 (客戶端必須加入 glusterfs hosts 否則報錯。)
####配置 hosts
$ vi /etc/hosts
192.168.1.158 gfs-node01
192.168.1.151 gfs-node02
192.168.1.92  gfs-node03

[root@gfs-client ~]#yum install -y glusterfs glusterfs-fuse
[root@gfs-client ~]#mkdir -p /home/apps
####手動掛載卷:
[root@gfs-client ~]#mount -t glusterfs gfs-node01:bigbdata /home/apps
查看掛載結果:
[root@gfs-client ~]# mount -t fuse.glusterfs

卸載目錄:
umount -l /home/apps

####自動掛載卷:
除了使用mount掛載,還可以使用/etc/fstab自動掛載
語法格式:HOSTNAME-OR-IPADDRESS:/VOLNAME MOUNTDIR glusterfs defaults,_netdev 0 0

舉個例子:
gfs-node01:bigbdata /home/apps glusterfs defaults,_netdev 0 0
gfs-node01:bigbdata /home/apps glusterfs defaults 0 0

[root@gfs-client sellbot]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda2             39G  2.4G   37G   7% /
devtmpfs             476M     0  476M   0% /dev
tmpfs                487M     0  487M   0% /dev/shm
tmpfs                487M  7.6M  479M   2% /run
tmpfs                487M     0  487M   0% /sys/fs/cgroup
/dev/sda1           1014M  181M  834M  18% /boot
tmpfs                 98M     0   98M   0% /run/user/0
gfs-node01:bigbdata   39G  2.9G   37G   8% /home/apps

###測試:

####DHT 模式 客戶端 創建一個 1G 的文件
[root@gfs-client ~]#time dd if=/dev/zero of=hello bs=1000M count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
1048576000字節(1.0 GB)已複製,9.1093 秒,115 MB/秒

real 0m9.120s
user 0m0.000s
sys 0m1.134s

####AFR 模式 客戶端 創建一個 1G 的文件
[root@gfs-client ~]#time dd if=/dev/zero of=hello.txt bs=1024M count=1
錄了1+0 的讀入
記錄了1+0 的寫出
1073741824字節(1.1 GB)已複製,27.4566 秒,39.1 MB/秒

real 0m27.469s
user 0m0.000s
sys 0m1.065s

####Striped 模式 客戶端 創建一個 1G 的文件
[root@gfs-client ~]#time dd if=/dev/zero of=hello bs=1000M count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
1048576000字節(1.0 GB)已複製,9.10669 秒,115 MB/秒

real 0m9.119s
user 0m0.001s
sys 0m0.953s

####條帶複製卷模式 (Number of Bricks: 1 x 2 x 2 = 4) 客戶端 創建一個 1G 的文件

[root@gfs-client ~]#time dd if=/dev/zero of=hello bs=1000M count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
1048576000字節(1.0 GB)已複製,17.965 秒,58.4 MB/秒

real 0m17.978s
user 0m0.000s
sys 0m0.970s

####分佈式複製模式 (Number of Bricks: 2 x 2 = 4) 客戶端 創建一個 1G 的文件

[root@gfs-client ~]#time dd if=/dev/zero of=haha bs=100M count=10
記錄了10+0 的讀入
記錄了10+0 的寫出
1048576000字節(1.0 GB)已複製,17.7697 秒,59.0 MB/秒

real 0m17.778s
user 0m0.001s
sys 0m0.886s

###針對分佈式複製模式還做了如下測試:

####4K隨機寫 測試:
安裝 fio (yum -y install libaio-devel (否則運行fio 會報錯engine libaio not loadable, 已安裝需重新編譯,否則一樣報錯))

[root@gfs-client ~]#fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=10G -filename=1.txt -name="EBS 4KB randwrite test" -iodepth=32 -runtime=60

write: io=352204KB, bw=5869.9KB/s, iops=1467, runt= 60002msec
WRITE: io=352204KB, aggrb=5869KB/s, minb=5869KB/s, maxb=5869KB/s, mint=60002msec, maxt=60002msec

#####4K隨機讀 測試:
fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randread -size=10G -filename=1.txt -name="EBS 4KB randread test" -iodepth=8 -runtime=60

read: io=881524KB, bw=14692KB/s, iops=3672, runt= 60001msec
READ: io=881524KB, aggrb=14691KB/s, minb=14691KB/s, maxb=14691KB/s, mint=60001msec, maxt=60001msec

####512K 順序寫 測試:
fio -ioengine=libaio -bs=512k -direct=1 -thread -rw=write -size=10G -filename=512.txt -name="EBS 512KB seqwrite test" -iodepth=64 -runtime=60

write: io=3544.0MB, bw=60348KB/s, iops=117, runt= 60135msec
WRITE: io=3544.0MB, aggrb=60348KB/s, minb=60348KB/s, maxb=60348KB/s, mint=60135msec, maxt=60135msec

###其他的維護命令:

1. 查看GlusterFS中所有的volume:
[root@gfs-node01 ~]#gluster volume list

2. 刪除GlusterFS磁盤:
[root@gfs-node01 ~]#gluster volume stop bigbdata    #停止名字爲 bigbdata 的磁盤
[root@gfs-node01 ~]#gluster volume delete bigbdata  #刪除名字爲 bigbdata 的磁盤

注: 刪除 磁盤 以後,必須刪除 磁盤( /opt/gluster/data ) 中的 ( .glusterfs/ .trashcan/ )目錄。
否則創建新 volume 相同的 磁盤 會出現文件 不分佈,或者 類型 錯亂 的問題。

3. 卸載某個節點GlusterFS磁盤(刪除節點)
[root@gfs-node01 ~]#gluster peer detach gfs-node03

4. 設置訪問限制,按照每個volume 來限制
[root@gfs-node01 ~]#gluster volume set bigbdata auth.allow 10.6.0.*,10.7.0.*

5. 添加GlusterFS節點:
[root@gfs-node01 ~]#gluster peer probe gfs-node03
[root@gfs-node01 ~]#gluster volume add-brick bigbdata gfs-node03:/opt/gluster/data
注:如果是複製卷或者條帶卷,則每次添加的Brick數必須是replica或者stripe的整數倍
查看狀態:gluster peer status
列舉節點:gluster pool list

6. 配置卷
[root@gfs-node01 ~]# gluster volume set

7. 縮容volume:

先將數據遷移到其它可用的Brick,遷移結束後纔將該Brick移除:
[root@gfs-node01 ~]#gluster volume remove-brick bigbdata gfs-node03:/opt/gluster/data gfs-node02:/opt/gluster/data start

在執行了start之後,可以使用status命令查看移除進度:
[root@gfs-node01 ~]#gluster volume remove-brick bigbdata gfs-node03:/opt/gluster/data gfs-node02:/opt/gluster/data status

不進行數據遷移,直接刪除該Brick:
[root@gfs-node01 ~]#gluster volume remove-brick bigbdata gfs-node03:/opt/gluster/data gfs-node02:/opt/gluster/data commit
注意,如果是複製卷或者條帶卷,則每次移��的Brick數必須是replica或者stripe的整數倍。
[root@gfs-node01 ~]#gluster volume remove-brick bigbdata gfs-node03:/opt/gluster/data gfs-node02:/opt/gluster/data force

8. 擴容volume:
volume add-brick <VOLNAME> [<stripe|replica> <COUNT> [arbiter <COUNT>]] <NEW-BRICK> ... [force] - add brick to volume <VOLNAME>

gluster volume add-brick bigbdata replica 3 gfs-node03:/opt/gluster/data force

9. 修復命令-替換卷:
[root@gfs-node01 ~]#gluster volume replace-brick bigbdata gfs-node03:/opt/gluster/data gfs-node-3:/opt/gluster/data commit force

10. 均衡卷volume:
[root@gfs-node01 ~]#gluster volume rebalance bigbdata fix-layout start
[root@gfs-node01 ~]#gluster volume rebalance bigbdata start
[root@gfs-node01 ~]#gluster volume rebalance bigbdata start force
[root@gfs-node01 ~]#gluster volume rebalance bigbdata status
[root@gfs-node01 ~]#gluster volume rebalance bigbdata stop

===============================================================================================


###格式化磁盤(全部glusterfs主機)

在每臺主機上創建幾塊硬盤,做接下來的分佈式存儲使用
注:創建的硬盤要用xfs格式來格式化硬盤,如果用ext4來格式化硬盤的話,對於大於16TB空間格式化就無法實現了。
所以這裏要用xfs格式化磁盤(centos7默認的文件格式就是xfs),並且xfs的文件格式支持PB級的數據量。
如果是centos6默認是不支持xfs的文件格式,要先安裝xfs支持包
yum install xfsprogs -y
用fdisk -l 查看磁盤設備,例如查看data-1-1的磁盤設備,這裏的sdb是新加的硬盤

[root@gfs-node01 ~]# fdisk -l

Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a3f5c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    75497471    36699136   83  Linux
/dev/sda3        75497472    83886079     4194304   82  Linux swap / Solaris

Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


特別說明:
如果磁盤大於 2T 的話就用 parted 來分區,這裏我們不用分區(可以不分區);
做分佈式文件系統的時候數據盤一般不需要做 RAID,一般系統盤會做 RAID 1;
如果有raid卡的話,最好用上,raid卡有數據緩存功能,也能提高磁盤的iops,最好的話,用RAID 5;
如果都不做raid的話,也是沒問題的,glusterfs也是可以保證數據的安全的。

這裏使用官方推薦的格盤方式:http://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart/#purpose-of-this-document

####磁盤分區及格式化:
[root@gfs-node01 ~]# sudo parted -s /dev/sdb mklabel gpt mkpart primary xfs 0% 100%
[root@gfs-node01 ~]# sudo mkfs.xfs /dev/sdb -f
 
查看磁盤格式(xfs格式)
[root@gfs-node01 ~]# sudo blkid -o value -s TYPE /dev/sdb

在三臺機器上創建掛載塊設備的目錄,掛載硬盤到目錄

[root@gfs-node01 ~]# mkdir -p /opt/data/brick1
[root@gfs-node01 ~]# echo '/dev/sdb /opt/data/brick1 xfs defaults 1 2' >> /etc/fstab

####掛載
[root@gfs-node01 ~]#mount /dev/sdb /opt/data/brick1

[root@gfs-node01 brick1]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        35G  2.6G   31G   8% /
devtmpfs        477M     0  477M   0% /dev
tmpfs           488M     0  488M   0% /dev/shm
tmpfs           488M  7.6M  480M   2% /run
tmpfs           488M     0  488M   0% /sys/fs/cgroup
/dev/sda1       976M  141M  769M  16% /boot
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb        100G   33M  100G   1% /opt/data/brick1

注:以上操作均在node01-node03上同時操作(其他節點同上)。

================================================================================================


#kubernetes使用glusterfs做持久化存儲

https://github.com/gluster/gluster-kubernetes/blob/master/docs/examples/sample-gluster-endpoints.yaml

https://github.com/gluster/gluster-kubernetes/blob/master/docs/examples/sample-gluster-service.yaml

https://github.com/gluster/gluster-kubernetes/tree/master/docs/examples/dynamic_provisioning_external_gluster

https://github.com/gluster/gluster-kubernetes/blob/master/deploy/kube-templates/glusterfs-daemonset.yaml

###kubernetes上安裝glusterfs客戶端
#####在所有 k8s node 中安裝 glusterfs 客戶端
$ yum install -y glusterfs glusterfs-fuse

####配置 hosts
$ vi /etc/hosts

192.168.1.158 gfs-node01
192.168.1.151 gfs-node02
192.168.1.92  gfs-node03

####創建數據存儲目錄:
[root@gfs-node01 ~]# mkdir -p /opt/data/brick1/gfsdata
[root@gfs-node02 ~]#  mkdir -p /opt/data/brick1/gfsdata
[root@gfs-node03 ~]#  mkdir -p /opt/data/brick1/gfsdata


#####查看volume 狀態:
[root@gfs-node01 ~]#gluster volume info
No volumes present

####創建GlusterFS磁盤(k8s-bigbdata): 
[root@gfs-node01 ~]#gluster volume create k8s-bigbdata replica 3 gfs-node01:/opt/data/brick1/gfsdata gfs-node02:/opt/data/brick1/gfsdata gfs-node03:/opt/data/brick1/gfsdata force
volume create: k8s-bigbdata: success: please start the volume to access data

###啓動 k8s-bigbdata 
[root@gfs-node01 ~]# gluster volume start k8s-bigbdata
volume start: k8s-bigbdata: success


####配置 endpoints
$ curl -O https://raw.githubusercontent.com/kubernetes/examples/master/staging/volumes/glusterfs/glusterfs-endpoints.json

####修改 endpoints.json ,配置 glusters 集羣節點ip
# 每一個 addresses 爲一個 ip 組
{
  "kind": "Endpoints",
  "apiVersion": "v1",
  "metadata": {
    "name": "glusterfs-cluster"
  },
  "subsets": [
    {
      "addresses": [
        {
          "ip": "192.168.1.158"
        }
      ],
      "ports": [
        {
          "port": 1990
        }
      ]
    },
    {
      "addresses": [
        {
          "ip": "192.168.1.151"
        }
      ],
      "ports": [
        {
          "port": 1990
        }
      ]
    },
        {
      "addresses": [
        {
          "ip": "192.168.1.92"
        }
      ],
      "ports": [
        {
          "port": 1990
        }
      ]
    }
  ]
}
####導入 glusterfs-endpoints.json

$ kubectl apply -f glusterfs-endpoints.json

####查看 endpoints 信息
$ kubectl get ep

###配置 service
$ curl -O https://raw.githubusercontent.com/kubernetes/examples/master/staging/volumes/glusterfs/glusterfs-service.json

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "glusterfs-cluster"
  },
  "spec": {
    "ports": [
      {"port": 1990}
    ]
  }
}

####service.json 裏面查找的是 enpointes 的名稱與端口,端口默認配置爲 1,我改成了1990

####導入 glusterfs-service.json
$ kubectl apply -f glusterfs-service.json

####查看 service 信息
$ kubectl get svc

####創建測試 pod
$ curl -O https://raw.githubusercontent.com/kubernetes/examples/master/staging/volumes/glusterfs/glusterfs-pod.json

{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        "name": "glusterfs"
    },
    "spec": {
        "containers": [
            {
                "name": "glusterfs",
                "image": "nginx",
                "volumeMounts": [
                    {
                        "mountPath": "/mnt/glusterfs",
                        "name": "glusterfsvol"
                    }
                ]
            }
        ],
        "volumes": [
            {
                "name": "glusterfsvol",
                "glusterfs": {
                    "endpoints": "glusterfs-cluster",
                    "path": "k8s-bigbdata",
                    "readOnly": true
                }
            }
        ]
    }
}
####編輯 glusterfs-pod.json
###修改 volumes  下的 path 爲上面創建的 volume 名稱

"path": "k8s-bigbdata"

####導入 glusterfs-pod.json
$ kubectl apply -f glusterfs-pod.json

####查看 pods 狀態
$ kubectl get pods               
NAME                             READY     STATUS    RESTARTS   AGE
glusterfs                        1/1       Running   0          1m

####查看 pods 所在 node
$ kubectl describe pods/glusterfs

####登陸 node 物理機,使用 df 可查看掛載目錄
$ df -h
172.20.0.113:k8s-volume 1073741824        0 1073741824   0% 172.20.0.113:k8s-volume  1.0T     0  1.0T   0% /var/lib/kubelet/pods/3de9fc69-30b7-11e7-bfbd-8af1e3a7c5bd/volumes/kubernetes.io~glusterfs/glusterfsvol
配置PersistentVolume
PersistentVolume(PV)和 PersistentVolumeClaim(PVC)是kubernetes提供的兩種API資源,用於抽象存儲細節。
管理員關注於如何通過pv提供存儲功能而無需關注用戶如何使用,同樣的用戶只需要掛載PVC到容器中而不需要關注存儲卷採用何種技術實現。

PVC和PV的關係跟pod和node關係類似,前者消耗後者的資源。PVC可以向PV申請指定大小的存儲資源並設置訪問模式。

PV屬性

storage容量
讀寫屬性:分別爲ReadWriteOnce:單個節點讀寫; ReadOnlyMany:多節點只讀 ; ReadWriteMany:多節點讀寫
$ cat glusterfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster-dev-volume
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "k8s-bigbdata"
    readOnly: false

####導入PV
$ kubectl apply -f glusterfs-pv.yaml

####查看 pv
$ kubectl get pv
NAME                 CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
gluster-dev-volume   8Gi        RWX           Retain          Available                                      3s
PVC屬性

訪問屬性與PV相同
容量:向PV申請的容量 <= PV總容量
配置PVC
$ cat glusterfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: glusterfs-nginx
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi

####導入 pvc
$ kubectl apply -f glusterfs-pvc.yaml

####查看 pvc

$ kubectl get pv
NAME              STATUS    VOLUME               CAPACITY   ACCESSMODES   STORAGECLASS   AGE
glusterfs-nginx   Bound     gluster-dev-volume   8Gi        RWX                          4s
創建 nginx deployment 掛載 volume
$ vi nginx-deployment.yaml
apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
  name: nginx-dm
spec: 
  replicas: 2
  template: 
    metadata: 
      labels: 
        name: nginx 
    spec: 
      containers: 
        - name: nginx 
          image: nginx:alpine 
          imagePullPolicy: IfNotPresent
          ports: 
            - containerPort: 80
          volumeMounts:
            - name: gluster-dev-volume
              mountPath: "/usr/share/nginx/html"
      volumes:
      - name: gluster-dev-volume
        persistentVolumeClaim:
          claimName: glusterfs-nginx

####導入 deployment
$ kubectl apply -f nginx-deployment.yaml 

####查看 deployment
$ kubectl get pods |grep nginx-dm
nginx-dm-3698525684-g0mvt       1/1       Running   0          6s
nginx-dm-3698525684-hbzq1       1/1       Running   0          6s

###查看 掛載
$ kubectl exec -it nginx-dm-3698525684-g0mvt -- df -h|grep k8s-volume
172.20.0.113:k8s-volume         1.0T     0  1.0T   0% /usr/share/nginx/html

####創建文件 測試
$ kubectl exec -it nginx-dm-3698525684-g0mvt -- touch /usr/share/nginx/html/index.html

$ kubectl exec -it nginx-dm-3698525684-g0mvt -- ls -lt /usr/share/nginx/html/index.html
-rw-r--r-- 1 root root 0 May  4 11:36 /usr/share/nginx/html/index.html

###驗證 glusterfs
# 因爲我們使用分佈卷,所以可以看到某個節點中有文件
[root@test-001 ~] ls /opt/data/brick1/gfsdata
[root@test-002 ~] ls /opt/data/brick1/gfsdata
index.html
[root@test-003 ~] ls /opt/data/brick1/gfsdata

=========================================================================================================
#用Heketi作爲kubernetes的持久存儲GlusterFS

yum install -y heketi-client
yum install heketi

https://github.com/heketi/heketi/releases

https://www.cnblogs.com/breezey/p/9589047.html

https://www.cnblogs.com/breezey/p/8849466.html

https://blog.csdn.net/wenwenxiong/article/details/79530631

https://jimmysong.io/kubernetes-handbook/practice/using-heketi-gluster-for-persistent-storage.html


#分佈式複製卷的最佳實踐:
1)搭建條件
- 塊服務器的數量必須是複製的倍數
- 將按塊服務器的排列順序指定相鄰的塊服務器成爲彼此的複製
例如,8臺服務器:
- 當複製副本爲2時,按照服務器列表的順序,服務器1和2作爲一個複製,3和4作爲一個複製,5和6作爲一個複製,7和8作爲一個複製
- 當複製副本爲4時,按照服務器列表的順序,服務器1/2/3/4作爲一個複製,5/6/7/8作爲一個複製
2)創建分佈式複製卷

磁盤存儲的平衡
  平衡佈局是很有必要的,因爲佈局結構是靜態的,當新的 bricks 加入現有卷,新創建的文件會分佈到舊的 bricks 中,所以需要平衡佈局結構,使新加入的 bricks 生效。
佈局平衡只是使新佈局生效,並不會在新的佈局中移動老的數據,如果你想在新佈局生效後,重新平衡卷中的數據,還需要對卷中的數據進行平衡。

#在gv2的分佈式複製卷的掛載目錄中創建測試文件入下
[root@data-1-4 opt]# touch  {X..Z}
#新創建的文件只在老的brick中有,在新加入的brick中是沒有的
[root@data-1-4 opt]# ll /storage/brick1
總用量 0
[root@data-1-3 ~]# ll /storage/brick1
總用量 0
[root@data-1-1 ~]# ls /storage/brick2
1  2  3  4  5  6  X  Y  Z
[root@data-1-2 ~]# ls /storage/brick2
1  2  3  4  5  6  X  Y  Z
# 從上面可以看到,新創建的文件還是在之前的 bricks 中,並沒有分佈中新加的 bricks 中
# 下面進行磁盤存儲平衡
[root@data-1-2 ~]# gluster volume rebalance gv2 start
#查看平衡存儲狀態
[root@data-1-4 opt]# gluster volume rebalance gv2 status
# 查看磁盤存儲平衡後文件在 bricks 中的分佈情況
[root@data-1-3 ~]# ls /storage/brick1
1  5  Y  Z
[root@data-1-4 opt]# ls /storage/brick1
1  5  Y  Z
[root@data-1-1 ~]# ls /storage/brick2
2  3  4  6  X
[root@data-1-2 ~]# ls /storage/brick2               
2  3  4  6  X
#從上面可以看出部分文件已經平衡到新加入的brick中了
每做一次擴容後都需要做一次磁盤平衡。 磁盤平衡是在萬不得已的情況下再做的,一般再創建一個卷就可以了。
#移除 brick
你可能想在線縮小卷的大小,例如:當硬件損壞或網絡故障的時候,你可能想在卷中移除相關的 bricks。
注意:當你移除 bricks 的時候,你在 gluster 的掛載點將不能繼續訪問數據,只有配置文件中的信息移除後你才能繼續訪問 bricks 中的數據。
      當移除分佈式複製卷或者分佈式條帶卷的時候,移除的 bricks 數目必須是 replica 或者 stripe 的倍數。
      但是移除brick在生產環境中基本上不做的,沒什麼意思,如果是硬盤壞掉的話,直接換個好的硬盤即可,然後再對新的硬盤設置卷標識就可以使用了,後面會演示硬件故障或系統故障的解決辦法。
#移除gv2中的data-1-3 data-1-4下的brick
[root@data-1-2 ~]# gluster volume  stop  gv2
[root@data-1-2 ~]# gluster volume remove-brick gv2 replica 2 data-1-3:/storage/brick1 data-1-4:/storage/brick1 force
[root@data-1-2 ~]# gluster  volume start  gv2
[root@data-1-3 ~]# ls  /storage/brick1
1  5  Y  Z
# 如果誤操作刪除了後,其實文件還在 /storage/brick1 裏面的,加回來就可以了
[root@data-1-3 ~]# gluster volume  stop  gv2
[root@data-1-3 ~]# gluster volume add-brick  gv2  replica 2 data-1-3:/storage/brick1 data-1-4:/storage/brick1 force
[root@data-1-3 ~]# gluster volume info  gv2
  
Volume Name: gv2
Type: Distributed-Replicate
Volume ID: 27b85504-0a78-4dae-9332-056da410be2e
Status: Stopped
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: data-1-1:/storage/brick2
Brick2: data-1-2:/storage/brick2
Brick3: data-1-3:/storage/brick1
Brick4: data-1-4:/storage/brick1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
#刪除卷
一般會用在命名不規範的時候纔會刪除
[root@data-1-3 ~]# gluster volume stop gv1
[root@data-1-3 ~]# gluster volume delete  gv1
模擬誤刪除卷信息故障及解決辦法

[root@data-1-3 mnt]# ls  /var/lib/glusterd/vols
gv2  gv3  gv4
#刪除卷gv4的卷信息
[root@data-1-3 brick2]# rm  -rf  /var/lib/glusterd/vols/gv4
#再查看卷信息情況如下:gv4卷信息被刪除了
[root@data-1-3 mnt]# ls  /var/lib/glusterd/vols
gv2  gv3
#因爲其他節點服務器上的卷信息是完整的,比如從data-1-4上同步所有卷信息如下:
[root@data-1-3 mnt]# gluster volume  sync  data-1-4
#驗證卷信息是否同步過來
[root@data-1-3 mnt]# ls  /var/lib/glusterd/vols
gv2  gv3  gv4
模擬複製卷數據不一致故障及解決辦法
#複製卷的存儲位置的數據如下:
[root@data-1-1 ~]# ls /storage/brick2
2  3  4  6  X
[root@data-1-2 ~]# ls /storage/brick2
2  3  4  6  X
#接着在data-1-1上刪除一個數據來模擬複製卷數據不一致
[root@data-1-1 ~]# rm -f  /storage/brick2/X
[root@data-1-1 ~]# ls /storage/brick2
2  3  4  6 
[root@data-1-2 ~]# ls /storage/brick2
2  3  4  6  X
#通過訪問這個複製卷的掛載點的數據來同步數據
[root@data-1-3 mnt]# mount  -t glusterfs 127.0.0.1:/gv2 /opt/
[root@data-1-3 mnt]# cat /opt/X
#這時候再看複製卷的數據是否同步成功
[root@data-1-1 ~]# ls /storage/brick2
2  3  4  6  X
[root@data-1-2 ~]# ls /storage/brick2
2  3  4  6  X
8、glusterfs分佈式存儲優化

GlusterFS文件系統優化  

Auth.allow                          #IP訪問授權;缺省值(*.allow all);合法值:Ip地址
Cluster.min-free-disk               #剩餘磁盤空間閥值;缺省值(10%);合法值:百分比
Cluster.stripe-block-size           #條帶大小;缺省值(128KB);合法值:字節
Network.frame-timeout               #請求等待時間;缺省值(1800s);合法值:1-1800
Network.ping-timeout                #客戶端等待時間;缺省值(42s);合法值:0-42
Nfs.disabled                        #關閉NFS服務;缺省值(Off);合法值:Off|on
Performance.io-thread-count         #IO線程數;缺省值(16);合法值:0-65
Performance.cache-refresh-timeout   #緩存校驗時間;缺省值(1s);合法值:0-61
Performance.cache-size              #讀緩存大小;缺省值(32MB);合法值:字節

Performance.quick-read:               #優化讀取小文件的性能
Performance.read-ahead:               #用預讀的方式提高讀取的性能,有利於應用頻繁持續性的訪問文件,當應用完成當前數據塊讀取的時候,下一個數據塊就已經準備好了。
Performance.write-behind:             #先寫入緩存內,在寫入硬盤,以提高寫入的性能。
Performance.io-cache:                 #緩存已經被讀過的、
系統優化實例
[root@data-1-1 ~]# gluster volume set gv4 performance.write-behind on
volume set: success
[root@data-1-1 ~]# gluster volume set gv4 performance.flush-behind on
volume set: success
[root@data-1-1 ~]# gluster volume set gv4 performance.cache-refresh-timeout 1
volume set: success
[root@data-1-1 ~]# gluster volume  info gv4
  
Volume Name: gv4
Type: Distribute
Volume ID: bef2ec82-43fd-4219-be8f-b326a34900c9
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: data-1-1:/storage/brick1
Brick2: data-1-2:/storage/brick1
Options Reconfigured:
performance.cache-refresh-timeout: 1
performance.flush-behind: on
performance.write-behind: on
transport.address-family: inet
nfs.disable: on
#監控及日常維護
使用zabbix自帶的模板即可,CPU、內存、磁盤空間、主機運行時間、系統load。日常情況要查看服務器監控值,遇到報警要及時處理。

  #看下節點有沒有在線
  gluster volume status

  #啓動完全修復
  gluster volume heal gv2 full

  #查看需要修復的文件
  gluster volume heal gv2 info

  #查看修復成功的文件
  gluster volume heal gv2 info healed

  #查看修復失敗的文件
  gluster volume heal gv2 heal-failed

  #查看主機的狀態
  gluster peer status

  #查看腦裂的文件
  gluster volume heal gv2 info split-brain

  #激活quota功能
  gluster volume quota gv2 enable

  #關閉quota功能
  gulster volume quota gv2 disable

  #目錄限制(卷中文件夾的大小)
  gluster volume quota gv2 limit-usage /data 20MB   --表示/mnt掛載點下的data目錄

  #quota信息列表
  gluster volume quota gv2 list

  #限制目錄的quota信息
  gluster volume quota gv2 list /data

  #設置信息的超時時間
  gluster volume set gv2 features.quota-timeout 5

  #刪除某個目錄的quota設置
  gluster volume quota gv2 remove /data

例如隊文件夾的限額設置:
[root@data-1-1 ~]# mount  -t  glusterfs  127.0.0.1:/gv3  /mnt/
[root@data-1-1 ~]# ls  /mnt
10M.file  10M.file2  20M.file  mydir
[root@data-1-1 ~]# gluster volume quota gv3 limit-usage /mydir  20MB
[root@data-1-1 ~]# dd  if=/dev/zero of=50M.file  bs=1024  count=50000
[root@data-1-1 ~]# cp 50M.file /mnt/mydir/
cp: cannot create regular file `/mnt/mydir/50M.file': Disk quota exceeded
#複製大於限額數的時候,提示磁盤限額限制  備註:
 quota功能,主要是對掛載點下的某個目錄進行空間限額。如:/mnt/mydir目錄,而不是對組成卷組的空間進行限制。

9、Gluster日常維護及故障處理

 1、硬盤故障
  如果底層做了raid配置,有硬件故障,直接更換硬盤,會自動同步數據。
  如果沒有做raid處理方法:  
  因爲生產環境中主要部署分佈式複製卷,所以這裏以複製卷的方式演示硬盤故障後修復複製卷的操作,下面在虛擬機上演示如下:
  1、首先在虛擬機中移除損壞的硬盤,重新添加一個硬盤,添加的新硬盤在虛擬機中是不立刻生效的,所以還要重啓服務器
  2、新添加的硬盤序號是在其他硬盤後,所以重啓服務器後,系統會對硬盤的序號做自動調整,那麼新添加的硬盤序號和損壞的硬盤序號就不一樣了
  3、格式化新添加的硬盤mkfs.xfs  -f  /dev/sdd,並對fstab表做一下調整,讓以前的硬盤掛載點保持不變,將新添加的硬盤對應的掛載點設置成損壞硬盤的掛載點
  4、重新掛載 mount  -a 

接下來便爲複製卷的修復過程
#恢復複製卷 brick1
#恢復流程
1、重新建立故障brick目錄
cd  /storage/
setfattr -n trusted.gfid -v
0x00000000000000000000000000000001 brick1
setfattr -n trusted.glusterfs.dht -v
0x000000010000000000000000ffffffff brick1
setfattr -n trusted.glusterfs.volume-id -v
0xcc51d546c0af4215a72077ad9378c2ac brick1
-v 的參數設置成你的值
2、設置擴展屬性(參考另一個複製 brick)
3、重啓 glusterd服務
4、觸發數據自修復
find /opt -type f -print0 | xargs -0 head -c1 >/dev/null >/dev/null
#在好的機器上找到複製卷的brick 查看擴展屬性
[root@data-1-3 storage]# getfattr  -d  -m . -e hex  brick1
# file: brick1
trusted.gfid=0x00000000000000000000000000000001
trusted.glusterfs.dht=0x00000001000000007fffffffffffffff
trusted.glusterfs.dht.commithash=0x3334383937323537363200
trusted.glusterfs.volume-id=0x27b855040a784dae9332056da410be2e
#brick1中的數據爲
[root@data-1-3 ~]# ls  /storage/brick1
1  5  hah.txt  Y  Z
#修復data-1-4上的brick1
[root@data-1-4 storage]# setfattr -n trusted.gfid -v 0x00000000000000000000000000000001 brick1
[root@data-1-4 storage]# setfattr -n trusted.glusterfs.dht -v 0x00000001000000007fffffffffffffff brick1
[root@data-1-4 storage]# setfattr  -n trusted.glusterfs.volume-id -v 0x27b855040a784dae9332056da410be2e brick1
[root@data-1-4 storage]# getfattr  -d -m  . -e hex brick1                       # file: brick1
trusted.gfid=0x00000000000000000000000000000001
trusted.glusterfs.dht=0x00000001000000007fffffffffffffff
trusted.glusterfs.volume-id=0x27b855040a784dae9332056da410be2e
[root@data-1-4 storage]# /etc/init.d/glusterd  restart
#重啓glusterfs查看brick1中的數據還是沒有的,那麼試着重啓複製卷
[root@data-1-4 storage]# gluster volume stop  gv2
[root@data-1-4 storage]# gluster volume start  gv2 
#結果brick1中依然沒有數據
最終的方式就是在data-1-3上的掛載點內訪問數據纔可同步到data-1-4上的brick1中
[root@data-1-3 ~]# cat  /opt/1
[root@data-1-4 storage]# ls brick1
1  5  Y
2、主機故障
 一臺節點故障的情況包括以下情況:
  a)物理故障;

  b)同時有多快硬盤故障,造成數據丟失;

  c)系統損壞不可修復

解決方法:

 1)找一臺完全一樣的機器,至少要保證數量和大小一致,安裝系統,配置和故障機器同樣的ip安裝gluster軟件,保證配置都一樣,在其他健康的節點上執行命令gluster peer status,查看故障服務器的uuid。   

 2)修改新加機器的/var/lib/glusterd/glusterd.info和故障機器的一樣。

 [root@data-1-4 ~]# cat /var/lib/glusterd/glusterd.info           
   UUID=eaeef3f8-247b-4ff2-9f7b-6fdb678bb36a

 在新機器掛在目錄上執行磁盤故障的操作,在任意節點上執行

 [root@data-1-4 ~]# gluster volume heal gv1 full 就會自動開始同步,但是同步的時候會影響整個系統的性能。
 3)查看狀態

[root@drbd01~]# gluster volume heal gv2 info
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章