分布式存储之GlusterFS

【背景需求】当前项目内部使用的文件系统有GlusterFS,FastDFS和NFS等,由于文件系统在海量小文件(大量散文件碎片化文件)和高并发之下性能急剧下降,性能遭遇瓶颈,因此打算建设分布式对象存储平台。

分布式文件存储的来源

在这个数据爆炸的时代,产生的数据量不断地在攀升,从GB,TB,PB,ZB.挖掘其中数据的价值也是企业在不断地追求的终极目标。但是要想对海量的数据进行挖掘,首先要考虑的就是海量数据的存储问题,比如Tb量级的数据。

谈到数据的存储,则不得不说的是磁盘的数据读写速度问题。早在上个世纪90年代初期,普通硬盘的可以存储的容量大概是1G左右,硬盘的读取速度大概为4.4MB/s.读取一张硬盘大概需要5分钟时间,但是如今硬盘的容量都在1TB左右了,相比扩展了近千倍。但是硬盘的读取速度大概是100MB/s。读完一个硬盘所需要的时间大概是2.5个小时。所以如果是基于TB级别的数据进行分析的话,光硬盘读取完数据都要好几天了,更谈不上计算分析了。那么该如何处理大数据的存储,计算分析呢?

分布式存储系统概念

分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈(尤其是硬件故障这个定时炸弹),也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。(即使900台的集群有100台挂了丝毫也不影响正常使用尤其适合云计算企业服务场景)

目前比较热门的分布式文件系统有如下几种:Ceph、GlusterFS、Sheepdog、Lustre、Swift、Cinder、TFS、HDFS、MooseFS、FastDFS、MogileFS和KFS等(bat云有oss、bos和CFS等公有云存储产品)

用的较多的分布式存储系统是:Ceph(经济实惠云厂商用的多)、GlusterFS(Red Hat旗下)、GFS()谷歌的东西)、TFS(Taobao FileSystem)、HDFS(Hadoop Distributed File System)、NFS和FastDFS(阿里开源产品)

(简单对比)Ceph用C++编写而Swift用Python编写,性能上应当是Ceph占优。但是与Ceph不同,Swift专注于对象存储,作为OpenStack组件之一经过大量生产实践的验证,与OpenStack结合很好,目前不少人使用Ceph为OpenStack提供块存储,但仍旧使用Swift提供对象存储。Ceph对比HDFS优势在于易扩展,无单点。HDFS是专门为Hadoop这样的云计算而生,在离线批量处理大数据上有先天的优势,而Ceph是一个通用的实时存储系统。虽然Hadoop可以利用Ceph作为存储后端(根据Ceph官方的教程死活整合不了,自己写了个简洁的步骤: http://www.kai-zhang.com/cloud-computing/Running-Hadoop-on-CEPH/), 但执行计算任务上性能还是略逊于HDFS(时间上慢30%左右 Haceph: Scalable Meta- data Management for Hadoop using Ceph)。TFS(Taobao File System)是由淘宝开发的一个分布式文件系统,其内部经过特殊的优化处理,适用于海量的小文件存储,目前已经对外开源;TFS采用自有的文件系统格式存储,因此需要专用的API接口去访问,目前官方提供的客户端版本有:C++/JAVA/PHP/GO。FastDFS是国人开发的一款分布式文件系统,目前社区比较活跃。如上图所示系统中存在三种节点:Client、Tracker、Storage,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个Storage,从而实现软RAID10,提升并发IO的性能、简单负载均衡及数据的冗余备份;同时通过线性的添加新的逻辑存储组,从容实现存储容量的线性扩容。文件下载上,除了支持通过API方式,目前还提供了apache和nginx的插件支持,同时也可以不使用对应的插件,直接以Web静态资源方式对外提供下载。MooseFS是一个高可用的故障容错分布式文件系统,它支持通过FUSE方式将文件挂载操作,同时其提供的web管理界面非常方便查看当前的文件存储状态。GlusterFS是Red Hat旗下的一款开源分布式文件系统,它具备高扩展、高可用及高性能等特性,由于其无元数据服务器的设计,使其真正实现了线性的扩展能力,使存储总容量可 轻松达到PB级别,支持数千客户端并发访问;对跨集群,其强大的Geo-Replication可以实现集群间数据镜像,而且是支持链式复制,这非常适用 于垮集群的应用场景。

Google学术论文(谷歌还是devops/sre发起者),这是众多分布式文件系统的起源,HDFS和TFS都是参考Google的GFS设计出来的。

【上述系统有一个共同的特点:各自适用于不同的领域。它们都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务(符合当今软件即服务的新商业模式)。】

开源协议说明
GPL:不允许修改后和衍生的代码做为闭源的商业软件发布和销售,修改后该软件产品必须也采用GPL协议;
GPL V2:修改文本的整体就必须按照GPL流通,不仅该修改文本的源码必须向社会公开,而且对于这种修改文本的流通不准许附加修改者自己作出的限制;
GPL V3:要求用户公布修改的源代码,还要求公布相关硬件;
LGPL:更宽松的GPL

存储系统 Ceph GlusterFS Sheepdog Lustre Swift Cinder TFS HDFS MooseFS FastDFS MogileFS
开发语言 C++ C C C Python Python C++ Java C C Perl
开源协议 LGPL GPL V3 GPLv2 GPL Apache Apache GPL V2 Apache GPL V3 GPL V3 GPL
数据存储方式 对象/文件/块 文件/块 对象 对象 文件 文件 文件/块 文件
集群节点通信协议 私有协议(TCP) 私有协议(TCP)/ RDAM(远程直接访问内存) totem协议 私有协议(TCP)/ RDAM(远程直接访问内存) TCP 未知 TCP TCP TCP TCP HTTP
专用元数据存储点 占用MDS 双MDS 未知 占用NS 占用MDS 占用MFS 占用DB
在线扩容 支持 支持 支持 支持 支持 未知 支持 支持 支持 支持 支持
冗余备份 支持 支持 支持 支持 未知 支持 支持 支持 支持 不支持
单点故障 不存在 不存在 不存在 存在 不存在 未知 存在 存在 存在 不存在 存在
跨集群同步 不支持 支持 未知 未知 未知 未知 支持 不支持 不支持 部分支持 不支持
易用性 安装简单,官方文档专业化 安装简单,官方文档专业化 未知 复杂。而且Lustre严重依赖内核,需要重新编译内核 未知 目前来说框架不算成熟存在一些问题 安装复杂,官方文档少 安装简单,官方文档专业化 安装简单,官方文档多 安装简单,社区相对活跃 未知
适用场景 单集群的大中小文件 跨集群云存储 弹性块存储虚拟机 大文件读写 openstack对象存储 openstack块存储 跨集群的小文件 Mapreduce使用的文件存储 单集群的大中文件 单集群的中小文件 未知
FUSE挂载 支持 支持 支持 支持 支持 未知 未知 支持 支持 不支持 不支持
访问接口 POSIX POSIX 未知 POSIX/MPI POSIX 未知 不支持POSIX 不支持POSIX POSIX 不支持POSIX 不支持POSIX

开源选型时一定要考虑技术的热门程度,否则招聘不到人,也找不到一起会弄的伙伴也就无从二次开发和改造。

分布式存储系统选型考虑的因素

一致性

分布式存储系统需要使用多台服务器共同存储数据,而随着服务器数量的增加,服务器出现故障的概率也在不断增加。为了保证在有服务器出现故障的情况下系统仍然可用。一般做法是把一个数据分成多份存储在不同的服务器中。但是由于故障和并行存储等情况的存在,同一个数据的多个副本之间可能存在不一致的情况。这里称保证多个副本的数据完全一致的性质为一致性。

可用性

分布式存储系统需要多台服务器同时工作。当服务器数量增多时,其中的一些服务器出现故障是在所难免的。我们希望这样的情况不会对整个系统造成太大的影响。在系统中的一部分节点出现故障之后,系统的整体不影响客户端的读/写请求称为可用性。

分区容错性

分布式存储系统中的多台服务器通过网络进行连接。但是我们无法保证网络是一直通畅的,分布式系统需要具有一定的容错性来处理网络故障带来的问题。一个令人满意的情况是,当一个网络因为故障而分解为多个部分的时候,分布式存储系统仍然能够工作。

除了上述三种特性考虑的,还需要考虑到大规模数据集、简单的一致性模型、异构软硬件平台间的可移植性、Namenode 和 Datanode(命名空间)。

言归正传我们今天介绍GlusterFS

图片

1.glusterfs概述

GlusterFS系统是一个可扩展的网络文件系统,相比其他分布式文件系统,GlusterFS具有高扩展性、高可用性、高性能、可横向扩展等特点,并且其没有元数据服务器的设计,让整个服务没有单点故障的隐患。

图片

当客户端访问GlusterFS存储时,首先程序通过访问挂载点的形式读写数据,对于用户和程序而言,集群文件系统是透明的,用户和程序根本感觉不到文件系统是本地还是在远程服务器上。读写操作将会被交给VFS(Virtual File System)来处理,VFS会将请求交给FUSE内核模块,而FUSE又会通过设备/dev/fuse将数据交给GlusterFS Client。最后经过GlusterFS Client的计算,并最终经过网络将请求或数据发送到GlusterFS Server上。

2.glusterfs常用分布式简介

图片

分布式卷也成为哈希卷,多个文件以文件为单位在多个brick上,使用哈希算法随机存储。

应用场景:大量小文件

优点:读/写性能好

缺点:如果存储或服务器故障,该brick上的数据将丢失

不指定卷类型,默认是分布式卷

brick数量没有限制

创建分布式卷命令:

gluster volume create volume_name node1:/data/br1 node2:/data/br1

图片

复制卷是将多个文件在多个brick上复制多份,brick的数目要与需要复制的份数相等,建议brick分布在不同的服务器上。

应用场景:对可靠性高和读写性能要求高的场景

优点:读写性能好

缺点:写性能差

replica = brick

创建复制卷:

gluster volume create volume_name replica 2 node1:/data/br1 node2:/data/br1

replica:文件保存的份数

图片

条带卷是将文件分成条带,存放在多个brick上,默认条带大小128k

应用场景:大文件

优点:适用于大文件存储

缺点:可靠性低,brick故障会导致数据全部丢失

stripe = birck

创建条带卷:

gluster volume create volume_name stripe 2 node1:/data/br1 node2:/data/br1

stripe:条带个数

分布式条带卷是将多个文件在多个节点哈希存储,每个文件再多分条带在多个brick上存储

应用场景:读/写性能高的大量大文件场景

优点:高并发支持

缺点:没有冗余,可靠性差

brick数是stripe的倍数

创建分布式条带卷:

gluster volume create volume_name stripe 2 node1:/data/br1 node2:/data/br1 node3:/data/br1 node4:/data/br1

图片

分布式复制卷是将多个文件在多个节点上哈希存储,在多个brick复制多份存储。

应用场景:大量文件读和可靠性要求高的场景

优点:高可靠,读性能高

缺点:牺牲存储空间,写性能差

brick数量是replica的倍数

gluster volume create volume_name replica 2 node1:/data/br1 node2:/data/br1 node3:/data/br1 node4:/data/br1

图片

条带式复制卷是将一个大文件存储的时候划分条带,并且保存多份

应用场景:超大文件,并且对可靠性要求高

优点:大文件存储,可靠性高

缺点:牺牲空间写性能差

brick数量是stripe、replica的乘积

gluster volume create volume_name stripe 2 replica 2 node1:/data/br1 node2:/data/br1 node3:/data/br1 node4:/data/br1

3.glusterfs环境

图片

日志存储集群采用的是分布式复制卷,将多个文件在多个节点上哈希存储,在多个brick复制多份存储。共有五台服务器,磁盘空间共有90T,那么采用这种分布式复制卷的方式,只有45T磁盘空间可用。并且需要采用分布式复制卷方式需要要有双数的brick,所以现采用一台服务器上创建两个brick,如上图所示,10.102.23.4:/data_01/node和10.102.23.44:/data_01/node是备份关系,其他节点均是如此,10.102.23.44作为日志存储集群的管理节点,nfs-ganesha服务只需要安装在控制节点,客户端则可以通过nfs方式挂载。

# sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/sysconfig/selinux #关闭selinux

# iptables -F #清除防火墙规则

安装glusterfs(01-05)

图片

# yum install userspace-rcu-*

# yum install python2-gluster-3.13.2-2.el7.x86_64.rpm

# yum install tcmu-runner-* libtcmu-*

# yum install gluster*

# yum install nfs-ganesha-*

#这个nfs只要需要对外挂载的哪台服务器需要安装(10.102.23.44)

# systemctl start glusterd.service #所有服务器启动glusterd

# systemctl start rpcbind

# systemctl enable glusterd.service

# systemctl enable rpcbind

# ss -lnt #查询端口是否有为24007,如果有则服务正常运行

创建集群(在10.102.23.44节点上执行一下操作,向集群中添加节点):

[root@admin-node ~]# gluster peer probe 10.102.23.44

peer probe: success. [root@admin-node ~]# gluster peer probe 10.102.23.45

peer probe: success.

[root@admin-node ~]# gluster peer probe 10.102.23.46

peer probe: success.

[root@admin-node ~]# gluster peer probe 10.102.23.47

peer probe: success.

[root@admin-node ~]# gluster peer probe 10.102.23.4

peer probe: success.

查看虚拟机信任状态添加结果

[root@admin-node ~]# gluster peer status

Number of Peers: 4

Hostname: 10.102.23.46

Uuid: 31b5ecd4-c49c-4fa7-8757-c01604ffcc7e

State: Peer in Cluster (Connected)

  

Hostname: 10.102.23.47

Uuid: 38a7fda9-ad4a-441a-b28f-a396b09606af

State: Peer in Cluster (Connected)

  

Hostname: 10.102.23.45

Uuid: 9e3cfb56-1ed4-4daf-9d20-ad4bf2cefb37

State: Peer in Cluster (Connected)

  

Hostname: 10.102.23.4

Uuid: 1836ae9a-eca5-444f-bb9c-20f032247bcb

State: Peer in Cluster (Connected)

在所有节点进行以下磁盘操作:

[root@admin-node ~]# fdisk /dev/sdb

创建卷组:

[root@admin-node ~]# vgcreate vg_data01 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1

[root@admin-node ~]# vgcreate vg_data02 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1 /dev/sdk1

查看卷组:

[root@admin-node ~]# vgdisplay

创建逻辑卷:

[root@admin-node ~]# lvcreate -n lv_data01 -L 9TB vg_data01

[root@admin-node ~]# lvcreate -n lv_data02 -L 9TB vg_data02

查看逻辑卷:

[root@admin-node ~]# lvdisplay

格式化逻辑卷:

[root@admin-node ~]# mkfs.xfs /dev/vg_data01/lv_data01

[root@admin-node ~]# mkfs.xfs /dev/vg_data02/lv_data02

挂载逻辑卷:

[root@admin-node ~]# mkdir -p /data_01/node /data_02/node

[root@admin-node ~]# vim /etc/fstab

/dev/vg_data01/lv_data01 /data_01 xfs defaults 0 0

/dev/vg_data02/lv_data02 /data_02 xfs defaults 0 0

[root@admin-node ~]# mount /data_01

[root@admin-node ~]# mount /data_02

分布式复制模式(组合型), 最少需要4台服务器才能创建。

创建卷:

[root@admin-node ~]# gluster volume create data-volume replica 2   10.102.23.4:/data_01/node  10.102.23.44:/data_01/node  10.102.23.44:/data_02/node 10.102.23.45:/data_02/node  10.102.23.45:/data_01/node  10.102.23.4:/data_02/node 10.102.23.46:/data_01/node  10.102.23.47:/data_01/node  10.102.23.46:/data_02/node  10.102.23.47:/data_02/node force

启动创建的卷:

[root@admin-node ~]# gluster volume start data-volume

volume start: data-volume: success所有机器都可以查看:

[root@admin-node ~]# gluster volume info

图片

查看分布式卷的状态:

[root@admin-node ~]# gluster volume status

图片

基于以上glusterfs部署,glusterfs分布式复制卷已经完成

4.nfs-ganesha环境搭建

glusterfs服务本身也是支持nfs挂载,由于现有生产环境存在多个网段,并且有些网段与glusterfs存储服务器网段是不通,所以需要通过nginx代理nfs来实现nfs挂载。Glusterfs服务只是支持nfs3版本的挂载,在通过nginx代理方面也不是那么方便,端口繁多,所以glusterfs与NFSs-Ganesha是完美组合。NFSs-Ganesha 通过FSAL(文件系统抽象层)将一个后端存储抽象成一个统一的API,提供给Ganesha服务端,然后通过NFS协议将其挂载到客户端。在客户端上对挂出来的空间进行操作。并且NFSs-Ganesha 可以指定nfs的版本。

在管理节点10.102.23.44上安装nfs-ganesha,在一开始部署glusterfs已在管理节点上安装,这里就不重复说明了,直接简要说明配置文件

[root@admin-node ~]# vim /etc/ganesha/ganesha.conf

.....................................

EXPORT

{

## Export Id (mandatory, each EXPORT must have a unique Export_Id)

#Export_Id = 12345;

Export_Id = 10;

  

## Exported path (mandatory)

#Path = /nonexistant;

Path = /data01;

  

## Pseudo Path (required for NFSv4 or if mount_path_pseudo = true)

#Pseudo = /nonexistant;

Pseudo = /data01; #客户端通过nfs挂载的根目录

  

## Restrict the protocols that may use this export. This cannot allow

## access that is denied in NFS_CORE_PARAM.

#Protocols = 3,4;

Protocols = 4; #客户端nfs挂载的版本

  

## Access type for clients. Default is None, so some access must be

## given. It can be here, in the EXPORT_DEFAULTS, or in a CLIENT block

#Access_Type = RW;

Access_Type = RW; #权限问题

  

## Whether to squash various users.

#Squash = root_squash;

Squash = No_root_squash; #root降级

  

## Allowed security types for this export

#Sectype = sys,krb5,krb5i,krb5p;

Sectype = sys; #类型

  

## Exporting FSAL

#FSAL {

#Name = VFS;

#}

FSAL {

Name = GLUSTER;

hostname = "10.102.23.44"; #glusterfs管理节点IP

volume = "data-volume"; #glusterfs卷名

}

}

...................

[root@admin-node ~]# systemctl restart nfs-ganesha

[root@admin-node ~]# systemctl enable nfs-ganesha

[root@admin-node ~]# showmount -e 10.102.23.44

Export list for 10.102.23.44: #nfs-ganesha搭建成功

5.客户端挂载

以glusterfs方式挂载:

[root@admin-node ~]# mkdir /logs

[root@admin-node ~]# mount -t glusterfs 10.102.23.44:data-volume /logs/

图片

以NFS方式进行挂载:

在客户端(10.1.99段):

[root@moban-00 ~]#yum -y install nfs-utils rpcbind

[root@moban-00 ~]# systemctl start rpcbind

[root@moban-00 ~]# systemctl enable rpcbind

[root@moban-00 ~]# mkdir /home/dwweiyinwen/logs/

[root@moban-00 ~]# mount -t nfs -o vers=4,proto=tcp,port=2049 10.102.23.44:/data01 /home/dwweiyinwen/logs/

图片

分布式存储的未来

随着现代社会从工业时代过渡到信息时代,信息技术的发展以及人类生活的智能化带来数据的爆炸性增长,数据正成为世界上最有价值的资源(数据无价,且操作且珍惜)。

根据物理存储形态,数据存储可分为集中式存储与分布式存储两种。集中式存储以传统存储阵列(传统存储)为主,分布式存储(云存储)以软件定义存储为主。

传统存储一向以可靠性高、稳定性好,功能丰富而著称,但与此同时,传统存储也暴露出横向扩展性差、价格昂贵、数据连通困难等不足,容易形成数据孤岛,导致数据中心管理和维护成本居高不下。

分布式存储:将数据分散存储在网络上的多台独立设备上,一般采用标准x86服务器和网络互联,并在其上运行相关存储软件,系统对外作为一个整体提供存储服务。。

总之,分布式文件存储,不仅提高了存储空间的利用率,还实现了弹性扩展,降低了运营成本,避免了资源浪费,更适合未来的数据爆炸时代场景。

猜你喜欢

转载自blog.csdn.net/english0523/article/details/112281874