分布式存储glusterfs

一.分布式存储介绍

分布式存储已经研究很多年,但直到近年来,伴随着谷歌、亚马逊和阿里等互联网公司云计算和大数据应用的兴起,它才大规模应用到工程实践中。如谷歌的分布式文件系统GFS、分布式表格系统google Bigtable,亚马逊的对象存储AWS,阿里的TFS等都是很好的代表,同时也催生了一大批优秀的开源分布式存储系统,包括ceph、swift、Lustre和glusterfs等。

分布式存储系统分类

分布式存储按其存储接口分为三种:文件存储、块存储和对象存储。

文件存储

通常支持POSIX接口(如glusterfs,但GFS、HDFS是非POSIX接口的),可以像普通文件系统(如ext4)那样访问,但又比普通文件系统多了并行化访问的能力和冗余机制。主要的分布式文件存储系统有TFS、cephfs、glusterfs和HDFS等。主要存储非结构化数据,如普通文件、图片、音视频等。可以采用NFS和CIFS等协议访问,共享方便。NAS是文件存储类型。

块存储

这种接口通常以QEMU Driver或者Kernel Module的方式存在,主要通过qemu或iscsi协议访问。主要的块存储系统有ceph块存储、sheepdog等。主要用来存储结构化数据,如数据库数据。数据共享不方便。DAS和SAN都是块存储类型。

对象存储

对象存储系统综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的数据共享等优势。以对象作为基本的存储单元,向外提供RESTful数据读写接口,常以网络服务的形式提供数据访问。主要的对象存储系统有AWS、swift和ceph对象存储。主要用来存储非结构化数据

二.Gluster介绍

Glusterfs是一个开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过Infiniband RDMA 或Tcp/Ip 方式将许多廉价的x86 主机,通过网络互联成一个并行的网络文件系统。具有可扩展性、高性能、高可用性等特点

1.为什么使用gluster

nfs对比Glusterfs

nfs:单点故障,扩容难

Glusterfs:有多个节点,无单点故障,扩容简单,加存储节点即可,3个节点起步

2.Glusterfs概述

GlusterFS系统是一个可扩展的网络文件系统,相比其他分布式文件系统,GlusterFS具有高扩展性、高可用性、高性能、可横向扩展等特点,并且其没有元数据服务器的设计,让整个服务没有单点故障的隐患。
术语:
-Brick:GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如‘SERVER:EXPORT‘

  • Client:挂载了GFS卷的设备
  • Extended Attributes:xattr是一个文件系统的特性,其支持用户或程序关联文件/目录和元数据。
  • FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
  • Geo-Replication
  • GFID:GFS卷中的每个文件或目录都有一个唯一的128位的数据相关联,其用于模拟inode
  • Namespace:每个Gluster卷都导出单个ns作为POSIX的挂载点
  • Node:一个拥有若干brick的设备
  • RDMA:远程直接内存访问,支持不通过双方的OS进行直接内存访问。
  • RRDNS:round robin DNS是一种通过DNS轮转返回不同的设备以进行负载均衡的方法
  • Self-heal:用于后台运行检测复本卷中文件和目录的不一致性并解决这些不一致。
  • Split-brain:脑裂
  • Translator:
  • Volfile:glusterfs进程的配置文件,通常位于/var/lib/glusterd/vols/volname
  • Volume:一组bricks的逻辑集合

1、无元数据设计
元数据是用来描述一个文件或给定区块在分布式文件系统中所在的位置,简而言之就是某个文件或某个区块存储的位置。传统分布式文件系统大都会设置元数据服务器或者功能相近的管理服务器,主要作用就是用来管理文件与数据区块之间的存储位置关系。相较其他分布式文件系统而言,GlusterFS并没有集中或者分布式的元数据的概念,取而代之的是弹性哈希算法。集群中的任何服务器和客户端都可以利用哈希算法、路径及文件名进行计算,就可以对数据进行定位,并执行读写访问操作。
这种设计带来的好处是极大的提高了扩展性,同时也提高了系统的性能和可靠性;另一显著的特点是如果给定确定的文件名,查找文件位置会非常快。但是如果要列出文件或者目录,性能会大幅下降,因为列出文件或者目录时,需要查询所在节点并对各节点中的信息进行聚合。此时有元数据服务的分布式文件系统的查询效率反而会提高许多。

2、服务器间的部署
在之前的版本中服务器间的关系是对等的,也就是说每个节点服务器都掌握了集群的配置信息,这样做的好处是每个节点度拥有节点的配置信息,高度自治,所有信息都可以在本地查询。每个节点的信息更新都会向其他节点通告,保证节点间信息的一致性。但如果集群规模较大,节点众多时,信息同步的效率就会下降,节点信息的非一致性概率就会大大提高。因此GlusterFS未来的版本有向集中式管理变化的趋势。
3、客户端访问流程
当客户端访问GlusterFS存储时,首先程序通过访问挂载点的形式读写数据,对于用户和程序而言,集群文件系统是透明的,用户和程序根本感觉不到文件系统是本地还是在远程服务器上。读写操作将会被交给VFS(Virtual File System)来处理,VFS会将请求交给FUSE内核模块,而FUSE又会通过设备/dev/fuse将数据交给GlusterFS Client。最后经过GlusterFS Client的计算,并最终经过网络将请求或数据发送到GlusterFS Server上。

三.GlusterFS集群卷的几种模式

GlusterFS 集群的卷模式是指数据在集群中的存放结构,类似于磁盘阵列中的级别。
1、分布式卷(Distributed Volume)
又称哈希卷,近似于RAID0,文件没有分片,文件根据hash算法写入各个节点的硬盘上,优点是容量大,缺点是没冗余。



2、复制卷(Replicated Volume)
相当于raid1,复制的份数,决定集群的大小,通常与分布式卷或者条带卷组合使用,解决前两种存储卷的冗余缺陷。缺点是磁盘利用率低。
复本卷在创建时可指定复本的数量,通常为2或者3,复本在存储时会在卷的不同brick上,因此有几个复本就必须提供至少多个brick,当其中一台服务器失效后,可以从另一台服务器读取数据,因此复制GlusterFS卷提高了数据可靠性的同事,还提供了数据冗余的功能。



3、分布式复制卷(Distributed Replicated Volume)
分布式复制GlusterFS卷结合了分布式和复制Gluster卷的特点,看起来类似RAID10,但其实不同,RAID10其实质是条带化,但分布式复制GlusterFS卷则没有。

4、条带卷(Striped Volume)

相当于raid0,文件是分片均匀写在各个节点的硬盘上的,优点是分布式读写,性能整体较好。缺点是没冗余,分片随机读写可能会导致硬盘IOPS饱和。



5、分布式条带卷(Distributed Striped Volume)
当单个文件的体型十分巨大,客户端数量更多时,条带卷已经无法满足需求,此时将分布式与条带化结合起来是一个比较好的选择。其性能与服务器数量有关。

分布式复制卷的brick顺序决定了文件分布的位置,一般来说,先是两个brick形成一个复制关系,然后两个复制关系形成分布。

企业一般用3或5这两种模式,大部分会用分布式复制(可用容量为 总容量/复制份数),通过网络传输的话最好用万兆交换机,万兆网卡来做。这样就会优化一部分性能。它们的数据都是通过网络来传输的

四.配置分布式复制卷

用三个节点搭建一个glusterfs集群,再用一个作为客户端使用,之后再扩容卷。

环境优化以及实验场景

环境规划

环境优化

每台机子都要做
关闭防火墙及SElinux
systemctl   stop   firewalld
setenforce   0
配置yum源为阿里源(在每个节点中都执行)
配置主机名host解析
[root@node1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 node1
10.0.0.12 node2
10.0.0.13 node3
10.0.0.7  client

1.安装glusterfs

所有节点:
yum -y install centos-release-gluster
yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
systemctl start glusterfsd.service
systemctl enable glusterfsd.service

2.添加进存储资源池

1.gluster pool list #查看资源池
2.gluster peer probe +ip/主机名 #将存储节点添加进存储资源池,每个节点的存储资源池一致。
[root@node1 ~]# gluster pool list
UUID                    Hostname    State
f08f63ba-53d6-494b-b939-1afa5d6e8096    localhost   Connected 
[root@node1 ~]# gluster peer probe node2
peer probe: success. 
[root@node1 ~]# gluster peer probe 10.0.0.13
peer probe: success. 
[root@node1 ~]# gluster pool list
UUID                    Hostname    State
b9da9cd6-8776-4bae-9a3c-1cc65691dc02    node2       Connected 
80758955-647d-40cf-94f1-77a9695a9556    10.0.0.13   Connected 
f08f63ba-53d6-494b-b939-1afa5d6e8096    localhost   Connected
3.gluster peer detach #移除资源池中节点
[root@node1 ~]# gluster peer detach node2
All clients mounted through the peer which is getting detached need to be remounted using one of the other active peers in the trusted storage pool to ensure client gets notification on any changes done on the gluster configuration and if the same has been done do you want to proceed? (y/n) y
peer detach: success
[root@node1 ~]# gluster pool list
UUID                    Hostname    State
80758955-647d-40cf-94f1-77a9695a9556    10.0.0.13   Connected 
f08f63ba-53d6-494b-b939-1afa5d6e8096    localhost   Connected 

3. 分布式复制卷

1.创建分布式复制卷(可以随意创建n个卷)

1.目录进行分布式存储
gluster volume create 卷名 replica 3[复制的份数,此处复制3份] 存储节点 force

2.磁盘进行分布式存储(此处用到磁盘分区使用fdisk或者gdisk对新添加的磁盘进行分区挂载,生产中使用的全是新盘,且副本数使用为3)
gluster volume create test replica 3 node1:/data1 node2:/data1 node3:/data1 force

2.启动卷

gluster volume start 卷名
EXAMPLE:
    gluster volume start test
[root@node1 ~]# gluster volume start test
volume start: test: success

3.查看卷

gluster volume info 卷名   #查看卷的详细信息
EXAMPLE:
    gluster volume info test
[root@node1 ~]# gluster volume info test
 
Volume Name: test
Type: Replicate
Volume ID: 5c94db58-2dfa-4b31-965e-fc082011c1b5
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: node1:/data1
Brick2: node2:/data1
Brick3: node3:/data1
Options Reconfigured:
transport.address-family: inet
storage.fips-mode-rchecksum: on
nfs.disable: on
performance.client-io-threads: off

gluster volume status 卷名 #查看卷的状态
EXAMPLE:
    gluster volume status test
[root@node1 ~]# gluster volume status test
Status of volume: test
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/data1                          49152     0          Y       125373
Brick node2:/data1                          49152     0          Y       63195
Brick node3:/data1                          49152     0          Y       52099
Self-heal Daemon on localhost               N/A       N/A        Y       125406
Self-heal Daemon on 10.0.0.12               N/A       N/A        Y       63242
Self-heal Daemon on 10.0.0.13               N/A       N/A        Y       52150
 
Task Status of Volume test
------------------------------------------------------------------------------
There are no active volume tasks

4.删除卷:一般会用再命名不规范的时候才会删除

gluster volume stop test     #停止卷
gluster volume delete test   #删除卷

5.挂载卷:系统默认不支持glusterfs文件系统,客户端需要安装glusterfs,也需要host解析。

mount -t glustefs IP:/卷名 挂载目录
EXAMPLE:
    mount -t glusterfs 10.0.0.11:/test /mnt
[root@client ~]#  mount -t glusterfs 10.0.0.11:/test /mnt
[root@client ~]# df -h
Filesystem       Size  Used Avail Use% Mounted on
/dev/sda3         20G  2.9G   17G  16% /
devtmpfs         476M     0  476M   0% /dev
tmpfs            487M     0  487M   0% /dev/shm
tmpfs            487M  8.0M  479M   2% /run
tmpfs            487M     0  487M   0% /sys/fs/cgroup
/dev/sda1        197M  105M   93M  54% /boot
tmpfs             98M     0   98M   0% /run/user/0
10.0.0.11:/test   10G  135M  9.9G   2% /mnt

5.写入文件进行测试

[root@client ~]# cp -ap /etc/* /mnt/
[root@node1 /data1]# ls -1|wc -l
210
[root@node2 /data1]# ls -1|wc -l
210
[root@node3 /data1]# ls -1|wc -l
210

6.分布式复制卷扩容

1.扩容前查看容量:df -h
2.扩容前需要先添加节点:添加命令:gluster peer probe 节点名/ip
3.扩容命令:gluster volume add-brick 卷名 节点名 force
4.扩容之后查看容量: df -h

7.分布式复制卷的最佳实践:

 1)搭建条件 
 - 块服务器的数量必须是复制的倍数   
 - 将按块服务器的排列顺序指定相邻的块服务器成为彼此的复制例如,8台服务器: 
 - 当复制副本为2时,按照服务器列表的顺序,服务器1和2作为一个复制,3和4作为一个复制,5和6作为一个复制,7和8作为一个复制 
 - 当复制副本为4时,按照服务器列表的顺序,服务器1/2/3/4作为一个复制,5/6/7/8作为一个复制 
 2)创建分布式复制卷
磁盘存储的平衡布局是很有必要的,因为布局结构是静态的,当新的 bricks 加入现有卷,新创建的文件会分布到旧的 bricks 中,所以需要平衡布局结构,使新加入的 bricks 生效。布局平衡只是使新布局生效,并不会在新的布局中移动老的数据,如果你想在新布局生效后,重新平衡卷中的数据,还需要对卷中的数据进行平衡。

8.GlusterFS 几种volume 模式指令:

 
一、 默认模式,既DHT, 也叫 分布卷: 将文件已hash算法随机分布到 一台服务器节点中存储。
 
命令:gluster volume create test-volume server1:/exp1 server2:/exp2
 
二、 复制模式,既AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中。
 
命令:gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2
 
三、 条带模式,既Striped, 创建volume 时带 stripe x 数量: 将文件切割成数据块,分别存储到 stripe x 个节点中 ( 类似raid 0 )。
 
命令:gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2
 
四、 分布式条带模式(组合型),最少需要4台服务器才能创建。 创建volume 时 stripe 2 server = 4 个节点: 是DHT 与 Striped 的组合型。
 
命令: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 的组合型。
 
命令: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

9.磁盘存储平衡

gluster volume rebalance test start
gluster volume rebalance test status  #查看平衡状态
## 检查磁盘存储平衡后文件在bricks中的分布情况
#从上面可以看出部分文件已经平衡到新加入的brick中了
每做一次扩容后都需要做一次磁盘平衡。 磁盘平衡是在万不得已的情况下再做的,一般再创建一个卷就可以了。

第四节: GlusterFS分布式存储优化

1.存储优化代码

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:缓存已经被读过的

调优示例

#开启 指定 volume 的配额:
[root@node1 ~]# gluster volume quota test enable
volume quota : success
#限制 models 中 / (既总目录) 最大使用 10M 空间
[root@node1 ~]# gluster volume quota test limit-usage / 10MB
volume quota : success
#设置 cache 大小(此处要根据实际情况,如果设置太大可能导致后面客户端挂载失败)
[root@node1 ~]# gluster volume set test performance.cache-size 512MB
volume set: success
#开启 异步,后台操作
[root@node1 ~]# gluster volume set test performance.flush-behind on
volume set: success
#设置 io 线程 32
[root@node1 ~]# gluster volume set test performance.io-thread-count 32
volume set: success
#设置 回写 (写数据时间,先写入缓存内,再写入硬盘)
[root@node1 ~]# gluster volume set test performance.write-behind on
volume set: success
#调优之后的volume信息
[root@node1 ~]# gluster volume info
Volume Name: test
Type: Replicate
Volume ID: 5c94db58-2dfa-4b31-965e-fc082011c1b5
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: node1:/data1
Brick2: node2:/data1
Brick3: node3:/data1
Options Reconfigured:
performance.io-thread-count: 32
performance.write-behind: on
performance.flush-behind: on
performance.cache-size: 512MB
features.quota-deem-statfs: on
features.inode-quota: on
features.quota: on
transport.address-family: inet
storage.fips-mode-rchecksum: on
nfs.disable: on
performance.client-io-threads: off

2.优化参数调整方式

命令格式:
gluster.volume set <卷><参数>

例如:
#打开预读方式访问存储
[root@node01 ~]# gluster volume set gv2 performance.read-ahead on

#调整读取缓存的大小
[root@mystorage gv2]# gluster volume set gv2 performance.cache-size 256M

3.监控及日常维护

使用zabbix自带的模板即可,CPU、内存、磁盘空间、主机运行时间、系统load。日常情况要查看服务器监控值,遇到报警要及时处理。
#看下节点有没有在线
gluster volume status nfsp

#启动完全修复
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 limit-usage /data/30MB --/gv2/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

备注:quota功能,主要是对挂载点下的某个目录进行空间限额。如:/mnt/gulster/data目录,而不是对组成卷组的空间进行限制。

4.GlusterFS日常维护及故障处理

1.硬盘故障

如果底层做了raid配置,有硬件故障,直接更换硬盘,会自动同步数据。
  如果没有做raid处理方法:参见博客:http://blog.51cto.com/cmdschool/1908647

2.一台主机故障

一台节点故障的情况包含以下情况:

物理故障 同时有多块硬盘故障,造成数据丢失 系统损坏不可修复 解决方法:

找一台完全一样的机器,至少要保证硬盘数量和大小一致,安装系统,配置和故障机同样的 IP,安装 gluster 软件, 保证配置一样,在其他健康节点上执行命令 gluster peer status,查看故障服务器的 uuid

[root@mystorage2 ~]# gluster peer status
Number of Peers: 3

Hostname: mystorage3
Uuid: 36e4c45c-466f-47b0-b829-dcd4a69ca2e7
State: Peer in Cluster (Connected)

Hostname: mystorage4
Uuid: c607f6c2-bdcb-4768-bc82-4bc2243b1b7a
State: Peer in Cluster (Connected)

Hostname: mystorage1
Uuid: 6e6a84af-ac7a-44eb-85c9-50f1f46acef1
State: Peer in Cluster (Disconnected)
复制代码
修改新加机器的 /var/lib/glusterd/glusterd.info 和 故障机器一样

[root@mystorage1 ~]# cat /var/lib/glusterd/glusterd.info
UUID=6e6a84af-ac7a-44eb-85c9-50f1f46acef1
operating-version=30712
在信任存储池中任意节点执行

# gluster volume heal gv2 full
就会自动开始同步,但在同步的时候会影响整个系统的性能。

可以查看状态

# gluster volume heal gv2 info

故障参见:https://www.cnblogs.com/xiexiaohua007/p/6602315.html

第五节:GlusterFS在企业中应用场景

理论和实践分析,GlusterFS目前主要使用大文件存储场景,对于小文件尤其是海量小文件,存储效率和访问性能都表现不佳,海量小文件LOSF问题是工业界和学术界的人工难题,GlusterFS作为通用的分布式文件系统,并没有对小文件额外的优化措施,性能不好也是可以理解的。

Media
  -文档、图片、音频、视频
Shared storage  
  -云存储、虚拟化存储、HPC(高性能计算)
Big data
  -日志文件、RFID(射频识别)数据

缺点

扩容、缩容时影响的服务器较多
Glusterfs对逻辑卷中的存储单元brick划分hash分布空间(会以brick所在磁盘大小作为权重,空间总范围为0至232-1),一个brick占一份空间,当访问某文件时,使用Davies-Meyer算法根据文件名计算出hash值,比较hash值落在哪个范围内,即可确定文件所在的brick,这样定位文件会很快。但是在向逻辑卷中添加或移除brick时,hash分布空间会重新计算,每个brick的hash范围都会变化,文件定位就会失败,因此需要遍历文件,把文件移动到正确的hash分布范围对应的brick上,移动的文件可能会很多,加重系统负载,影响到正常的文件访问操作。
遍历目录下文件耗时
1.Glusterfs没有元数据节点,而是根据hash算法来确定文件的分布,目录利用扩展属性记录子卷的中brick的hash分布范围,每个brick的范围均不重叠。遍历目录时,需要readdir子卷中每个brick中的目录,获取每个文件的属性和扩展属性,然后进行聚合,相对于有专门元数据节点的分布式存储,遍历效率会差很多,当目录下有大量文件时,遍历会非常缓慢。
2.删除目录也会遇到同样的问题。
3.目前提供的解决方法是合理组织目录结构,目录层级不要太深,目录下文件数量不要太多,增大glusterfs目录缓存。另外,还可以设计把元数据和数据分离,把元数据放到内存数据库中(如redis、memcache),并在ssd上持久保存。
小文件性能较差
1.Glusterfs主要是为大文件设计,如io-cache、read-ahead、write-behind和条带等都是为优化大文件访问,对小文件的优化很少。
2.Glusterfs采用无元数据节点的设计,文件的元数据和数据一起保存在文件中,访问元数据和数据的速率相同,访问元数据的时间与访问数据的时间比例会较大,而有元数据中心的分布式存储系统,对元数据服务器可以采用更快速的ssd盘,可以采用更大的元数据缓存等优化措施来减小访问元数据时间与访问数据时间的比值,来提高小文件性能。
3.Glusterfs在客户端采用了元数据缓存md-cache来提高小文件性能,但是md-cache大小有限,但在海量小文件场景下,缓存命中率会严重下降,优化效果会减小,这就需要增大元数据缓存。
4.针对小文件性能差的问题,也可以参考TFS的做法, TFS会将大量的小文件合并成一个大文件,这个大文件称为Block,每个Block拥有在集群内唯一的编号(Block Id),Block Id在NameServer创建Block时分配,NameServer维护block与DataServer(存储Block的实际数据)的关系。

禁止转载,如需转载请通过简信或评论联系作者。