GlusterFS install and config
GlusterFS是一个分布式文件系统,通过 RDMA 和 TCP/IP 方式将分布到不同服务器上的存储空间汇集成一个大的网络并行文件系统,它的安装配置简单,扩展性和性能也都还不错,从Oracle DBA的角度看,在有些场景下还是可以考虑的,比如存放OGG的trail文件,比如存放归档或逻辑备份什么的。本文简单介绍一下GlusterFS在RedHat 7下的安装和使用。
实验环境:
主机 | 网络 | OS | 存储 |
192.168.0.18 服务器 | 192.168.0.18 1Gb eth
192.168.1.18 56Gb IB 192.168.2.18 56Gb IB |
Redhat 7.4 | /dev/sdb |
192.168.0.19 服务器 | 192.168.0.19 1Gb eth
192.168.1.19 56Gb IB 192.168.2.19 56Gb IB |
Redhat 7.4 | /dev/sdb |
192.168.0.97 服务器 | 192.168.0.97 1Gb eth
192.168.1.97 56Gb IB 192.168.2.97 56Gb IB |
Redhat 7.4 | /dev/sdb |
192.168.0.98 服务器 | 192.168.0.98 1Gb eth
192.168.1.98 56Gb IB 192.168.2.98 56Gb IB |
Redhat 7.4 | /dev/sdb |
192.168.0.17 客户端 | 192.168.0.17 1Gb eth
192.168.1.17 56Gb IB 192.168.2.17 56Gb IB |
Redhat 7.4 |
从源码安装
首先是安装依赖的包:
- Linux发布中自带的包
yum install automake libtool git flex bison openssl-devel libuuid-devel libacl-devel libxml2-devel python-devel libaio-devel sqlite-devel
- 需要单独下载的包
userspace-rcu-0.7.16-1.el7.x86_64.rpm
userspace-rcu-devel-0.7.16-1.el7.x86_64.rpm
可以在这个地址找到:https://centos.pkgs.org/7/epel-x86_64/48/
不要安装更新的版本,比如使用源码安装userspace-rcu的1.0版本,会导致glusterfs编译报错。
下载GlusterFS源码地址:https://github.com/gluster/glusterfs/archive/v4.1.3.zip
解压缩,安装:
# unzip glusterfs-4.1.3.zip
# cd glusterfs-4.1.3
# ./autogen.sh
# ./configure
# make
# make install
安装就完成了。
启动glusterd服务:
# service glusterd start
使用源码安装,server和client的步骤都是一样的,只是在客户端不用启动glusterd服务。
GlusterFS架构
介绍配置方法之前,先介绍一下基本概念
trusted storage pool(TSP)
TSP就是由存储服务器组成的网络,在开始配置GlusterFS之前,需要将所有存储服务器加入到这个网络。
Peer
Peer就是指的每一个存储服务器
Brick
Brick可以理解为GlusterFS管理的存储单元,brick一般表现形式是一个文件系统,brick底层是如何组成的,GlusterFS不管,可以是一个物理磁盘,也可以是做完RAID后的逻辑磁盘,也可以是ZFS卷。
Volume
Volume就是客户端可以使用的存储单元,volume是由多个brick组成的,volume的类型有分布,复制,分布复制等几种,3.7以后条带类型的卷没有了,取而代之的是shard特性。
分布卷是将文件分布到不同的brick上,所有brick组成volume,没有数据冗余,我理解类似RAID0,但是,注意单纯的分布卷并不做条带化,也就是不会切割大文件。
复制卷就是在多个brick上存放文件副本,我理解类似RAID1,复制卷的副本数可以2或者3。
分布复制卷就是既做复制又做分布,brick个数必须是副本数的整数倍。我理解类似RAID10
虽然类似RAID,但是注意上述三种卷都不做条带化,glusterfs 3.7 之前还有一种条带卷,可以做条带化,3.7之后,用shard功能取代了条带卷,上述三种卷都可以启用shard功能,将大文件分片。
配置步骤
- 将存储服务器加入TSP
在 192.168.0.18上执行:
# gluster peer probe 192.168.1.19
# gluster peer probe 192.168.1.97
# gluster peer probe 192.168.1.98
本机不用加入,直接就在TSP里面:
# gluster peer probe 192.168.1.18
peer probe: success. Probe on localhost not needed
查看pool情况:
# gluster pool list
UUID Hostname State
68b97090-fc52-439c-a32d-db003a174676 192.168.1.19 Connected
3b619849-b9b4-41b9-88d5-394fe75670b6 192.168.1.97 Connected
0d33bada-be28-4641-8e19-f693b2c8aea4 192.168.1.98 Connected
42ac25aa-de7c-4853-91c1-a978afd117c4 localhost Connected
- 准备bricks
在每台存储服务器执行:
# mkfs.xfs /dev/sda
# mount /dev/sda /gfsdata
# mkdir –p /gfsdata/data1
- 创建卷
创建一个分布复制卷:
# gluster volume create gv1 replica 2 transport rdma 192.168.1.97:/gfsdata/data1 192.168.1.18:/gfsdata/data1 192.168.1.98:/gfsdata/data1 192.168.1.19:/gfsdata/data1
其中replica 2,代表副本数是2。
其中transport的取值可以是“rdma” 或 “tcp” 或 “tcp,rdma”,如果使用普通万兆网络,就是tcp,使用带RDMA功能的融合以太或ib,就使用rdma来得到更好的性能。
# gluster volume info gv1
Volume Name: gv1
Type: Distributed-Replicate
Volume ID: 2a5466c0-3637-4369-8fe8-2594b8964a8a
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: rdma
Bricks:
Brick1: 192.168.1.97:/gfsdata/data1
Brick2: 192.168.1.18:/gfsdata/data1
Brick3: 192.168.1.98:/gfsdata/data1
Brick4: 192.168.1.19:/gfsdata/data1
Options Reconfigured:
nfs.disable: on
performance.client-io-threads: off
- 启动glusterfs卷
# gluster volume start gv1
- 挂载glusterfs卷
在192.168.0.17挂载卷:
# mkdir /test
# mount –t glusterfs –o transport=rdma 192.168.2.97:/gv1 /test
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ol-root 50G 44G 6.6G 87% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 18M 16G 1% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda2 1014M 230M 785M 23% /boot
/dev/sda1 200M 8.5M 192M 5% /boot/efi
/dev/mapper/ol-home 491G 26G 466G 6% /home
tmpfs 3.1G 12K 3.1G 1% /run/user/42
tmpfs 3.1G 0 3.1G 0% /run/user/0
192.168.2.97:/gv1.rdma 1.8T 638G 1.2T 36% /test
我在这里用了另一个ib链路mount glusterfs卷,对应192.168.2.x的地址,glusterfs内网使用192.168.1.x 链路,也就是private和public网络分开,避免争用。
为了得到更好的大文件操作性能,我们还可以打开shard功能:
# gluster volume set gv1 features.shard on
volume set: success
系统会自动计算一个合适的块大小来做分片,也可以通过参数设定。
- 测试
创建一个大文件:
# cd /test
# fallocate –l 100G disk01
# ls -l
total 104857600
-rw-r–r– 1 root root 107374182400 Aug 30 2018 disk01
文件在bricks上存储会被分片,如果没启用shard功能,这个100g的大文件只会在两个brick上存在,因为分布复制卷,会分布多个文件,单一文件是不拆散的,我们是4个brick,所以会有一个brick复制这个文件,所以只有两个brick上有这个100g的大文件。如果启用了shard功能,系统会将文件分成若干份,在2个互为复制的brick上只放文件的第一个分片,其他分片会均匀第分布到所有的brick上,存放在brick对应的目录下的隐藏目录.shard下。
我们到192.168.0.18上查看:
# pwd
/gfsdata/data1
# ls -al
total 65620
drwxr-xr-x 4 root root 52 Aug 28 23:36 .
drwxr-xr-x 4 root root 31 Aug 28 18:57 ..
-rw-r–r– 2 root root 67108864 Aug 28 23:36 disk01
drw——- 263 root root 8192 Aug 28 23:36 .glusterfs
drwxr-xr-x 2 root root 45056 Aug 28 23:36 .shard
# cd ./.shard
# du -sh
49G .
可以看到./shard目录下大概是49G的文件,加上文件的第一个分片,2个节点100G,双副本,所以每个节点都会有50G左右的文件。