glusterfs简介
GlusterFS是一个高层次的分布式文件系统解决方案。通过增加一个逻辑层,对上层使用者掩盖了下面的实现,使用者不用了解也不需知道,文件的存储形式、分布。
内部实现是整合了许多存储块(server)通过Infiniband RDMA或者 Tcp/Ip方式互联的一个并行的网络文件系统,这样的许多存储块可以通过许多廉价的x86主机,通过网络搭建起来
其相对于传统NAS 、SAN、Raid的优点就是:
1.容量可以按比例的扩展,且性能却不会因此而降低。
2.廉价且使用简单,完全抽象在已有的文件系统之上。
3.扩展和容错设计的比较合理,复杂度较低。扩展使用translator方式,扩展调度使用scheduling接口,容错交给了本地的文件系统来处理。
4.适应性强,部署方便,对环境依赖低,使用,调试和维护便利。
支持主流的linux系统发行版,包括 fc,ubuntu,debian,suse等,并已有若干成功应用。
glusterfs安装配置
一般在企业中,采用的是分布式复制卷,因为有数据备份,数据相对安全,分布式条带卷目前对 gluster 来说没有完全成熟,存在一定的数据安全风险。
网络要求全部千兆环境,gluster 服务器至少有 2 块网卡,1 块网卡绑定供 gluster 使用,剩余一块分配管理网络 IP,用于系统管理。如果有条件购买万兆交换机,服务器配置万兆网卡,存储性能会更好。网络方面如果安全性要求较高,可以多网卡绑定。
跨地区机房配置 Gluster,在中国网络不适用。
下面对glusterfs做分布式、条带、复制等做演示如下:
1、安装glusterfs前的环境准备
首先关闭iptables和selinux,配置hosts文件如下:
1 2 3 4 5 6 7 | [root@data - 1 - 3 ~] # cat /etc/hosts 127.0 . 0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 :: 1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0 . 0.154 data - 1 - 1 10.0 . 0.155 data - 1 - 2 10.0 . 0.142 data - 1 - 3 10.0 . 0.143 data - 1 - 4 |
2、安装glusterfs源
glusterfs源在阿里的epel源中是存在的,所以直接yum下载安装即可
1 2 3 4 5 6 7 8 | yum search centos - release - gluster centos - release - gluster310.noarch centos - release - gluster312.noarch centos - release - gluster36.noarch centos - release - gluster37.noarch centos - release - gluster38.noarch centos - release - gluster39.noarch |
这里我们使用glusterfs的3.10版本的源
1 | yum install centos - release - gluster310.noarch - y |
3、安装glusterfs
在安装glusterfs的时候直接指定源为glusterfs源,由于 源[centos-gluster310-test]的enable为0,所以在指定源的时候用--enablerepo来让源生效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@data - 1 - 1 ~] # cat /etc/yum.repos.d/CentOS-Gluster-3.10.repo # CentOS-Gluster-3.10.repo # # Please see http://wiki.centos.org/SpecialInterestGroup/Storage for more # information [centos - gluster310] name = CentOS - $releasever - Gluster 3.10 baseurl = http: / / mirror.centos.org / centos / $releasever / storage / $basearch / gluster - 3.10 / gpgcheck = 1 enabled = 1 gpgkey = file : / / / etc / pki / rpm - gpg / RPM - GPG - KEY - CentOS - SIG - Storage [centos - gluster310 - test] name = CentOS - $releasever - Gluster 3.10 Testing baseurl = http: / / buildlogs.centos.org / centos / $releasever / storage / $basearch / gluster - 3.10 / gpgcheck = 0 enabled = 0 gpgkey = file : / / / etc / pki / rpm - gpg / RPM - GPG - KEY - CentOS - SIG - Storage |
安装glusterfs
1 | yum - - enablerepo = centos - gluster * - test install glusterfs - server glusterfs - cli glusterfs - geo - replication - y |
4、查看glusterfs版本并启动glusterfs服务
1 2 3 4 5 | [root@data - 1 - 3 ~] # glusterfs -V glusterfs 3.10 . 7 #启动glusterfs服务 / etc / init.d / glusterd start |
5、将分布式存储主机加入到信任主机池并查看加入的主机状态
随便在一个开启glusterfs服务的主机上将其他主机加入到一个信任的主机池里
1 2 3 4 5 6 | [root@data - 1 - 1 ~] # gluster peer probe data-1-2 peer probe: success. [root@data - 1 - 1 ~] # gluster peer probe data-1-3 peer probe: success. [root@data - 1 - 1 ~] # gluster peer probe data-1-4 peer probe: success. |
查看主机池中主机的状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@data - 1 - 1 ~] # gluster peer status Number of Peers: 3 Hostname: data - 1 - 2 Uuid: 08b26b41 - 1479 - 45b5 - 959f - 03fd992f76cf State: Peer in Cluster (Connected) Hostname: data - 1 - 3 Uuid: a59e47da - ba3d - 4b23 - bb7f - 5d53f268dd3d State: Peer in Cluster (Connected) Hostname: data - 1 - 4 Uuid: eaeef3f8 - 247b - 4ff2 - 9f7b - 6fdb678bb36a State: Peer in Cluster (Connected) |
6、在每台主机上创建几块硬盘,做接下来的分布式存储使用
创建的硬盘要用xfs格式来格式化硬盘,如果用ext4来格式化硬盘的话,对于大于16TB空间格式化就无法实现了。所以这里要用xfs格式化磁盘(centos7默认的文件格式就是xfs),并且xfs的文件格式支持PB级的数据量
centos6默认是不支持xfs的文件格式,所以要先安装xfs支持包
1 | yum install xfsprogs - y |
用fdisk -l
查看磁盘设备,例如查看data-1-1的磁盘设备,这里的sdc、sdd、sde是新加的硬盘
1 2 3 4 5 6 | [root@data - 1 - 1 ~] # fdisk -l Disk / dev / sda: 8589 MB, 8589934592 bytes Disk / dev / sdb: 3221 MB, 3221225472 bytes Disk / dev / sdc: 2147 MB, 2147483648 bytes Disk / dev / sdd: 3221 MB, 3221225472 bytes Disk / dev / sde: 4294 MB, 4294967296 bytes |
特别说明:
如果磁盘大于 2T 的话就用 parted 来分区,这里我们不用分区(可以不分区);
做分布式文件系统的时候数据盘一般不需要做 RAID,一般系统盘会做 RAID 1;
如果有raid卡的话,最好用上,raid卡有数据缓存功能,也能提高磁盘的iops,最好的话,用RAID 5;
如果都不做raid的话,也是没问题的,glusterfs也是可以保证数据的安全的。
格式化磁盘
1 2 3 | [root@data - 1 - 1 ~] # mkfs.xfs -f /dev/sdc [root@data - 1 - 1 ~] # mkfs.xfs -f /dev/sdd [root@data - 1 - 1 ~] # mkfs.xfs -f /dev/sde |
在四台机器上创建挂载块设备的目录,挂载硬盘到目录
1 2 3 4 5 6 7 | mkdir - p / storage / brick{ 1. . 3 } echo "/dev/sdb /storage/brick1 xfs defaults 0 0" >> / etc / fstab echo "/dev/sdc /storage/brick2 xfs defaults 0 0" >> / etc / fstab echo "/dev/sdd /storage/brick3 xfs defaults 0 0" >> / etc / fstab #挂载 mount - a |
7、创建glusterfs卷
GlusterFS 五种卷
- Distributed:分布式卷,文件通过 hash 算法随机分布到由 bricks 组成的卷上。
- Replicated: 复制式卷,类似 RAID 1,replica 数必须等于 volume 中 brick 所包含的存储服务器数,可用性高。
- Striped: 条带式卷,类似 RAID 0,stripe 数必须等于 volume 中 brick 所包含的存储服务器数,文件被分成数据块,以 Round Robin 的方式存储在 bricks 中,并发粒度是数据块,大文件性能好。
- Distributed Striped: 分布式的条带卷,volume中 brick 所包含的存储服务器数必须是 stripe 的倍数(>=2倍),兼顾分布式和条带式的功能。
- Distributed Replicated: 分布式的复制卷,volume 中 brick 所包含的存储服务器数必须是 replica 的倍数(>=2倍),兼顾分布式和复制式的功能。
分布式复制卷的brick顺序决定了文件分布的位置,一般来说,先是两个brick形成一个复制关系,然后两个复制关系形成分布。
企业一般用后两种,大部分会用分布式复制(可用容量为 总容量/复制份数),通过网络传输的话最好用万兆交换机,万兆网卡来做。这样就会优化一部分性能。它们的数据都是通过网络来传输的。
配置分布式卷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #在信任的主机池中任意一台设备上创建卷都可以,而且创建好后再任意设备都可以查看 [root@data - 1 - 1 ~] # gluster volume create gv1 data-1-1:/storage/brick1/ data-1-2:/storage/brick1/ force #启动卷gv1 [root@data - 1 - 1 ~] # gluster volume start gv1 #查看创建的卷 [root@data - 1 - 1 ~] # gluster volume info gv1 Volume Name: gv1 Type : Distribute Volume ID : f2c4776c - 1f53 - 4d26 - b5a4 - d61b4bc77f6c 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: transport.address - family: inet nfs.disable: on # 挂载卷到目录 [root@data - 1 - 4 ~] # mount -t glusterfs 127.0.0.1:/gv1 /mnt [root@data - 1 - 4 ~] # df -h Filesystem Size Used Avail Use % Mounted on / dev / sda3 9.1G 3.7G 4.9G 43 % / tmpfs 491M 0 491M 0 % / dev / shm / dev / sda1 190M 27M 153M 16 % / boot / dev / sdb 3.0G 33M 3.0G 2 % / storage / brick1 / dev / sdc 4.0G 33M 4.0G 1 % / storage / brick2 / dev / sdd 5.0G 33M 5.0G 1 % / storage / brick3 127.0 . 0.1 : / gv1 4.0G 65M 4.0G 2 % / mnt # 在data-1-4 创建测试文件 [root@data - 1 - 4 mnt] # touch {a..f} [root@data - 1 - 4 mnt] # ll 总用量 0 - rw - r - - r - - 1 root root 0 11 月 6 15 : 11 a - rw - r - - r - - 1 root root 0 11 月 6 15 : 11 b - rw - r - - r - - 1 root root 0 11 月 6 15 : 11 c - rw - r - - r - - 1 root root 0 11 月 6 15 : 11 d - rw - r - - r - - 1 root root 0 11 月 6 15 : 11 e - rw - r - - r - - 1 root root 0 11 月 6 15 : 11 f # 在data-1-2也可看到新创建的文件,信任存储池中的每一台主机挂载这个卷后都可以看到 [root@data - 1 - 2 ~] # mount -t glusterfs 127.0.0.1:/gv1 /mnt [root@data - 1 - 2 ~] # ll /mnt total 0 - rw - r - - r - - 1 root root 0 Nov 6 15 : 11 a - rw - r - - r - - 1 root root 0 Nov 6 15 : 11 b - rw - r - - r - - 1 root root 0 Nov 6 15 : 11 c - rw - r - - r - - 1 root root 0 Nov 6 15 : 11 d - rw - r - - r - - 1 root root 0 Nov 6 15 : 11 e - rw - r - - r - - 1 root root 0 Nov 6 15 : 11 f # 文件实际存在位置data-1-1和data-1-2上的/storage/brick1目录下,通过hash分别存到data-1-1和data-1-2上的分布式磁盘上 [root@data - 1 - 1 ~] # ll /storage/brick1 total 0 - rw - r - - r - - 2 root root 0 Nov 6 15 : 11 a - rw - r - - r - - 2 root root 0 Nov 6 15 : 11 b - rw - r - - r - - 2 root root 0 Nov 6 15 : 11 c - rw - r - - r - - 2 root root 0 Nov 6 15 : 11 e [root@data - 1 - 2 ~] # ll /storage/brick1 total 0 - rw - r - - r - - 2 root root 0 Nov 6 15 : 11 d - rw - r - - r - - 2 root root 0 Nov 6 15 : 11 f |
配置复制卷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # 创建复制式卷 [root@data - 1 - 2 ~] # gluster volume create gv2 replica 2 data-1-1:/storage/brick2 data-1-2:/storage/brick2 force # 启动创建的卷 [root@data - 1 - 2 ~] # gluster volume start gv2 # 查看卷信息 [root@data - 1 - 2 ~] # gluster volume info gv2 Volume Name: gv2 Type : Replicate Volume ID : 27b85504 - 0a78 - 4dae - 9332 - 056da410be2e Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport - type : tcp Bricks: Brick1: data - 1 - 1 : / storage / brick2 Brick2: data - 1 - 2 : / storage / brick2 Options Reconfigured: transport.address - family: inet nfs.disable: on # 挂载卷到目录,创建测试文件 [root@data - 1 - 3 ~] # mount -t glusterfs 127.0.0.1:/gv2 /opt [root@data - 1 - 3 ~] # df -h 127.0 . 0.1 : / gv2 3.0G 33M 3.0G 2 % / opt [root@data - 1 - 3 ~] # touch /opt/{1..6} [root@data - 1 - 3 ~] # ls /opt 1 2 3 4 5 6 #在其他设备上通过挂载可以查看到同样的内容 [root@data - 1 - 4 mnt] # mount -t glusterfs 127.0.0.1:/gv2 /opt [root@data - 1 - 4 mnt] # ls /opt 1 2 3 4 5 6 # 但是创建文件的实际存在位置为data-1-1和data-1-2上的/storage/brick2目录下,因为是复制卷,这两个目录下的内容是一致的。 [root@data - 1 - 1 ~] # ls /storage/brick2 1 2 3 4 5 6 [root@data - 1 - 2 ~] # ls /storage/brick2 1 2 3 4 5 6 |
配置条带卷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # 创建条带卷 [root@data - 1 - 4 mnt] # gluster volume create gv3 stripe 2 data-1-1:/storage/brick3 data-1-2:/storage/brick3 force # 启动条带卷 [root@data - 1 - 4 mnt] # gluster volume start gv3 # 查看卷信息 [root@data - 1 - 4 mnt] # gluster volume info gv3 Volume Name: gv3 Type : Stripe Volume ID : 3b7d3294 - 0621 - 4a4b - a8c1 - 4a03960f9f08 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport - type : tcp Bricks: Brick1: data - 1 - 1 : / storage / brick3 Brick2: data - 1 - 2 : / storage / brick3 Options Reconfigured: transport.address - family: inet nfs.disable: on # 挂载卷到目录,创建测试文件 [root@data - 1 - 4 mnt] # mount -t glusterfs 127.0.0.1:/gv3 /data3/ [root@data - 1 - 4 mnt] # df -h 127.0 . 0.1 : / gv3 8.0G 65M 8.0G 1 % / data3 [root@data - 1 - 4 mnt] # dd if=/dev/zero bs=1024 count=10000 of=/data3/10M.file [root@data - 1 - 4 mnt] # dd if=/dev/zero bs=1024 count=20000 of=/data3/20M.file # 查看新创建的文件的大小 [root@data - 1 - 4 mnt] # ll -h /data3 总用量 30M - rw - r - - r - - 1 root root 9.8M 11 月 6 15 : 48 10M . file - rw - r - - r - - 1 root root 20M 11 月 6 15 : 48 20M . file # 文件实际存放位置及所在位置的大小 [root@data - 1 - 1 ~] # ll -h /storage/brick3 total 15M - rw - r - - r - - 2 root root 4.9M Nov 6 15 : 48 10M . file - rw - r - - r - - 2 root root 9.8M Nov 6 15 : 48 20M . file [root@data - 1 - 2 ~] # ll -h /storage/brick3 total 15M - rw - r - - r - - 2 root root 4.9M Nov 6 15 : 48 10M . file - rw - r - - r - - 2 root root 9.8M Nov 6 15 : 48 20M . file # 上面可以看到 10M 20M 的文件分别分成了 2 块(这是条带的特点),写入的时候是循环地一点一点在data-1-1和data-1-2的磁盘上写数据,跟raid0很类似 |
上面配置的条带卷在生产环境是很少使用的,因为它会将文件破坏,比如一个图片,它会将图片一份一份地分别存到条带卷中的brick上。
配置分布式复制卷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #将原有的复制卷gv2进行扩容,使其成为分布式复制卷 #要扩容前需停掉gv2 [root@data - 1 - 2 ~] # gluster volume stop gv2 Stopping volume will make its data inaccessible. Do you want to continue ? (y / n) y #添加brick到gv2中 [root@data - 1 - 4 mnt] # gluster volume add-brick gv2 replica 2 data-1-3:/storage/brick1 data-1-4:/storage/brick1 force #启动gv2卷,并查看卷信息 [root@data - 1 - 4 mnt] # gluster volume start gv2 volume start: gv2: success [root@data - 1 - 4 mnt] # gluster volume info gv2 Volume Name: gv2 # 这里显示是分布式复制卷,是在 gv2 复制卷的基础上增加 2 块 brick 形成的 Type : Distributed - Replicate Volume ID : 27b85504 - 0a78 - 4dae - 9332 - 056da410be2e Status: Started 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 |
注意:当你给分布式复制卷和分布式条带卷增加 bricks 时,你增加的 bricks 数目必须是复制或条带数目的倍数,例如:你给一个分布式复制卷的 replica 为 2,你在增加 bricks 的时候数量必须为2、4、6、8等。 扩容后进行测试,发现文件都分布在扩容前的卷中。
配置分布式条带卷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #将原有的复制卷gv3进行扩容,使其成为分布式条带卷 #要扩容前需停掉gv3 [root@data - 1 - 4 ~] # gluster volume stop gv3 #添加brick到gv3中 [root@data - 1 - 4 ~] # gluster volume add-brick gv3 stripe 2 data-1-3:/storage/brick2 data-1-4:/storage/brick2 force #启动gv3卷,并查看卷信息 [root@data - 1 - 4 mnt] # gluster volume start gv3 [root@data - 1 - 3 brick2] # gluster volume info gv3 Volume Name: gv3 # 这里显示是分布式条带卷,是在 gv3 条带卷的基础上增加 2 块 brick 形成的 Type : Distributed - Stripe Volume ID : 3b7d3294 - 0621 - 4a4b - a8c1 - 4a03960f9f08 Status: Started Snapshot Count: 0 Number of Bricks: 2 x 2 = 4 Transport - type : tcp Bricks: Brick1: data - 1 - 1 : / storage / brick3 Brick2: data - 1 - 2 : / storage / brick3 Brick3: data - 1 - 3 : / storage / brick2 Brick4: data - 1 - 4 : / storage / brick2 Options Reconfigured: transport.address - family: inet nfs.disable: on |
分布式复制卷的最佳实践:
1)搭建条件
- 块服务器的数量必须是复制的倍数
- 将按块服务器的排列顺序指定相邻的块服务器成为彼此的复制
例如,8台服务器:
- 当复制副本为2时,按照服务器列表的顺序,服务器1和2作为一个复制,3和4作为一个复制,5和6作为一个复制,7和8作为一个复制
- 当复制副本为4时,按照服务器列表的顺序,服务器1/2/3/4作为一个复制,5/6/7/8作为一个复制
2)创建分布式复制卷
磁盘存储的平衡
平衡布局是很有必要的,因为布局结构是静态的,当新的 bricks 加入现有卷,新创建的文件会分布到旧的 bricks 中,所以需要平衡布局结构,使新加入的 bricks 生效。布局平衡只是使新布局生效,并不会在新的布局中移动老的数据,如果你想在新布局生效后,重新平衡卷中的数据,还需要对卷中的数据进行平衡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #在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在生产环境中基本上不做的,没什么意思,如果是硬盘坏掉的话,直接换个好的硬盘即可,然后再对新的硬盘设置卷标识就可以使用了,后面会演示硬件故障或系统故障的解决办法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #移除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 |
删除卷
一般会用在命名不规范的时候才会删除
1 2 | [root@data - 1 - 3 ~] # gluster volume stop gv1 [root@data - 1 - 3 ~] # gluster volume delete gv1 |
模拟误删除卷信息故障及解决办法
1 2 3 4 5 6 7 8 9 10 11 12 | [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 |
模拟复制卷数据不一致故障及解决办法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #复制卷的存储位置的数据如下: [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:缓存已经被读过的、
系统优化实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [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
例如队文件夹的限额设置:
1 2 3 4 5 6 7 8 | [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
接下来便为复制卷的修复过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #恢复复制卷 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