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