企业分布式存储

分布存储

1.分布存储概述

1.1 存储分类:

  • 开源与商业:
  1. 商业存储: 一套硬件设备40w左右 (商业解决方案-EMC、NetAPP、戴尔、华为、浪潮)
  2. 开源存储:前期准备(服务器,稳定性,可用性,后期维护成本、人员、设备维护,分布式存储:Ceph,TFS,FastDFS,MogileFS,MooseFS,GlusterFS)
  • 单机存储:

SCSI/SAS/USB/PCI-E、SSD/NVME(提升性能)

  • 网络存储(带文件系统):

NFS/Samba/NAS

SAN:SAN(Storage Area Network,存储区域网络)

**SAN存储设备通过光纤连接,而NAS存储设备通过TCP/IP连接。**由于这个原因,SAN通常用于高级解决方案,而NAS解决方案更易于家庭用户或小型企业使用。为了通过SAN连接,设备必须能够使用SCSI光纤通道。相比之下,NAS比较简单,任何东西都可以通过以太网连接到NAS解决

单机磁盘的空间问题、IO 问题、高可用问题

服务分为读数据和写数据,读可以在任何一个节点读,但是写只能写在特定的节点,如 Redis 的 master、zookeeper 的 leader、MySQL 的 master 等场景。

1.2数据分类及存储分类:

数据分为元数据和数据:

  • 数据:实际数据

  • 元数据 :元数据即是文件的属性信息(文件名、权限(属主、属组)、大小、更新时间等),

分布式存储的实现:

有一种路由机制,即当客户端或者应用程序产生的客户端数据被写入到分布式存储系统

的时候,会有一个服务(NameNode)提供文件元数据的路由功能,即告诉应用程序去哪个服

务器去请求文件内容,然后再有(DataNode)提供数据的读写请求及数据的高可用功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WK2YnPoZ-1640169458466)(企业存储.assets/image-20211213165030762.png)]

​ 图一传统式

1.3 存储方式

  • 块存储:需要格式化,将文件直接保存到磁盘上。

  • 文件存储:提供数据存储的接口,是由操作系统针对块存储的应用,即由操作系统提供存储

    接口,应用程序通过调用操作系统将文件保存到块存储进行持久化。

  • 对象存储:也称为基于对象的存储,其中的文件被拆分成多个部分并散布在多个存储服务器,

    在对象存储中,数据会被分解为称为“对象”的离散单元,并保存在单个存储库中,而不是

    作为文件夹中的文件或服务器上的块来保存,对象存储需要一个简单的 HTTP 应用编程接

    口 (API),以供大多数客户端(各种语言)使用。

Ceph 是一个开源的分布式存储系统,包括对象存储、块设备、文件系统

ceph 是一个对象(object)式存储系统,它把每一个待管理的数据流(文件等数据)切分为一到多

个固定大小(默认 4 兆)的对象数据,并以其为原子单元(原子是构成元素的最小单元)完成数

据的读写。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ev18PEmy-1640169458467)(企业存储.assets/image-20211213233119404.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPJRUJo9-1640169458468)(企业存储.assets/image-20211213234004529.png)]

2 Ceph 简介

Ceph 是一个开源的分布式存储系统,包括对象存储、块设备、文件系统

ceph 是一个对象(object)式存储系统,它把每一个待管理的数据流(文件等数据)切分为一到多

个固定大小(默认 4 兆)的对象数据,并以其为原子单元(原子是构成元素的最小单元)完成数

据的读写。

对象数据的底层存储服务是由多个存储主机(host)组成的存储集群,该集群也被称之为

RADOS(reliable automatic distributed object store)存储集群,即可靠的、自动化的、分布式的

对象存储系统。

2.1ceph的构成

  • Pool:存储池、分区,存储池的大小取决于底层的存储空间。

  • PG(placement group):一个 pool 内部可以有多个 PG 存在,pool 和 PG 都是抽象的逻辑概念,一个 pool 中有多少个 PG 可以通过公式计算。

  • OSD(Object Storage Daemon):每一块磁盘叫做 osd,多个 osd 组成一个主机

  • librados 是 RADOS 存储集群的 API,支持 C/C++/JAVA/python/ruby/php 等编程语言客户端调用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e7l63hZV-1640169458468)(企业存储.assets/image-20211214001117468.png)]

存储池要先创建才能往 ceph 保存数据,文件在向 ceph 保存之前要先进行一致性 hash 计算,

计算后会把文件保存在某个对应的 PG 的,某个文件一定属于某个 pool 的 PG,在通过 PG

保存在 OSD 上。

数据对象在写到主 OSD 之后再同步到从 OSD 以实现数据的高可用。

存储过程:

第一步:把文件对象映射给 PG

第二步: 把文件对象映射到OSD,

第三步:通过 OSD 写入到硬盘

监视器 mon 维护 OSD 和 PG 的集群状态,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8kR3F3l-1640169458469)(企业存储.assets/image-20211214002218870.png)]

2.2 ceph 集群基础:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uljycOht-1640169458469)(企业存储.assets/image-20211214002430009.png)]

一个 ceph 集群的组成部分:

  1. 若干的 Ceph OSD(对象存储守护程序) 实际的服务器
  2. 两个或以上的 Ceph 管理器 managers,运行 Ceph 文件系统客户端时,还需要高可用的 Ceph Metadata Server(文件系统元数据服务器)。负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能 指标和系统负载等。 可以兼容普罗米修斯
  3. RADOS cluster:由多台 host 存储服务器组成的 ceph 集群。 RADOS (Reliable, Autonomic Distributed Object Store) 是Ceph的核心之一,作为Ceph分布式文件系统的一个子项目,特别为Ceph的需求设计,能够在动态变化和异质结构的存储设备机群之上提供一种稳定、可扩展、高性能的单一逻辑对象(Object)存储接口和能够实现节点的自适应和自管理的存储系统
  4. OSD(Object Storage Daemon):每台存储服务器的磁盘组成的存储空间
  5. Mon(Monitor):ceph 的监视器,维护 OSD 和 PG 的集群状态,一个 ceph 集群至少要有一个mon,可以是一三五七等等这样的奇数个。
2.2.1 Monitor(ceph-mon):ceph 监视器

在一个主机上运行的一个守护进程,用于维护集群状态映射(maintains maps of the cluster state),比如 ceph 集群中有多少存储池、每个存储池有多少 PG 以及存储池和 PG 的映 射关系等, monitor map, manager map, the OSD map, the MDS map, and the CRUSH map,这 些映射是 Ceph 守护程序相互协调所需的关键群集状态,此外监视器还负责管理守护程序和 客户端之间的身份验证(认证使用 cephX 协议)。通常至少需要三个监视器才能实现冗余和高 可用性

2.2.2 Managers(ceph-mgr)的功能:

在一个主机上运行的一个守护进程,Ceph Manager 守护程序(ceph-mgr)负责跟踪运 行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager 守护程序还托管基于python 的模块来管理和公开 Ceph 集群信息,包括基于 Web 的 Ceph 仪表板和 REST API。高可用性通常至少需要两个管理器。

2.2.3 Ceph OSDs(对象存储守护程序 ceph-osd):

提供存储数据,一个磁盘就是一个 OSD,因此一个服务器的 OSD 不能超过磁盘的总数, OSD 用于处理 ceph 集群数据复制,恢复,重新平衡,并通过检查其他 Ceph OSD 守护程序的 心跳来向 Ceph 监视器和管理器提供一些监视信息。通常至少需要 3 个 Ceph OSD 才能实现 冗余和高可用性。

2.2.4 MDS(ceph 元数据服务器,ceph-mds):

代表 ceph文件系统(NFS/CIFS)存储元数据,(即 Ceph块设备和 Ceph对象存储不使用 MDS)

2.2.5 Ceph 的管理节点:

1.ceph 的常用管理接口是一组命令行工具程序,例如 rados、ceph、rbd 等命令,ceph 管理

员可以从某个特定的 ceph-mon 节点执行管理操作

  1. 推荐使用部署专用的管理节点对 ceph 进行配置管理、升级与后期维护,方便后期权限管

理,管理节点的权限只对管理人员开放,可以避免一些不必要的误操作的发生。

2.3 元数据的保存方式

Ceph 对象数据的元数据信息放在哪里呢? 对象数据的元数据以 key-value 的形式存在, 在RADOS 中有两种实现:xattrs 和 omap:

ceph 可选后端支持多种存储引擎,比如 filestore,kvstore,memstore,目前是以 kvstore 的 形式存储对象数据的元数据信息。

2.3.1: xattr 扩展属性

是将元数据保存在对象对应文件数据中并保存到系统磁盘上,这要求支持对象存储的 本地文件系统(一般是 XFS)支持扩展属性。元数据和数据放一起

2.3.2 omap(object map 对象映射):

omap:是 object map 的简称,是将元数据保存在本地文件系统之外的独立 key-value 存储 系统中,在使用 filestore 时是 leveldb,在使用 bluestore 时是 rocksdb,由于 filestore 存 在功能问题(需要将磁盘格式化为 XFS 格式)及元数据高可用问题等问题,因此在目前 ceph 主要使用 bluestore。

2.3.2.1 filestoreleveldb

ceph 早期基于 filestore 使用 google 的 levelDB 保存对象的元数据,LevelDb 是一个持久化存 储的 KV 系统,和 Redis 这种内存型的 KV 系统不同,LevelDb 不会像 Redis 一样将数据放在内存从而占用大量的内存空间,而是将大部分数据存储到磁盘上,但是需要把磁盘上的 levelDB 空间格式化为文件系统(XFS).

FileStore 将数据保存到与 Posix 兼容的文件系统(例如 Btrfs、XFS、Ext4)。在 Ceph 后端使用传 统的 Linux 文件系统尽管提供了一些好处,但也有代价,如性能、 对象属性与磁盘本地文 件系统属性匹配存在限制等

filestore 数据写入的过程

1. 先把要写入的数据全部封装成一个事务,其整理作为一条日志,写入日志磁盘(一般把 日志放在 ssd 上提高性 能),这个过程叫日志的提交(journalsubmit)。

2. 把数据写入对象文件的磁盘中(也就是 OSD 的磁盘中),这个过程叫日志的应用(journal apply)。这个过程不一定写入磁盘,有可能缓存在本地文件系统的 page cache 中。 当系统在日志提交的过程中出错,系统重启后,直接丢弃不完整的日志条目,该条日志对应 的实际对象数据并没有修改,数据保证了一致性。当日志在应用过程中出错,由于日志已写 入到磁盘中,系统重启后,重放(replay)日志,这样保证新数据重新完整的写入,保证了 数据的一致性

filestore 日志的三个阶段

日志的提交(journal submit):日志写入日志磁盘。 日志的应用(journal apply):日志对应的修改更新到对象的磁盘文件中。这个过程不一定写入 磁盘,有可能缓存在本地文件系统的 page cache 中。 日志的同步(journal sync 或者 journal commit):确定日志对应的修改操作已经刷到磁盘 中
2.3.2.2 bluestore rocksdb

由于 levelDB 依然需要需要磁盘文件系统的支持,后期 facebok 对 levelDB 进行改进为 RocksDB,RocksDB 将对象数据的元数据保存在 RocksDB,但是 RocksDB 的数据又放在哪里呢?放在内存怕丢失,放在本地磁盘但是解决不了高可用,ceph 对象数据放在了每个 OSD 中,那么就在在当前 OSD 中划分出一部分空间,格式化为 BlueFS 文件系统用于保存 RocksDB 中的元数据信息(称为 BlueStore),并实现元数据的高可用, BlueStore 最大的特点是构建在裸磁盘设备之上,并且对诸如 SSD 等新的存储设备做了很多 优化工作。

#RocksDB:rocksdb 是 facebook 基于 leveldb 开发的一款 kv 数据库,BlueStore 将元数据全部 存放至 RocksDB 中,这些元数据包括存储预写式日志、数据对象元数据、Ceph 的 omap 数 据信息、以及分配器的元数据 。

#BlueRocksEnv:这是 RocksDB 与 BlueFS 交互的接口;RocksDB 提供了文件操作的接口 EnvWrapper(Env 封装器),可以通过继承实现该接口来自定义底层的读写操作,BlueRocksEnv 就是继承自 EnvWrapper 实现对 BlueFS 的读写。

#BlueFS:BlueFS是BlueStore针对RocksDB开发的轻量级文件系统,用于存放RocksDB产生的.sst 和.log 等文件。 

#BlockDecive:BlueStore 抛弃了传统的 ext4、xfs 文件系统,使用直接管理裸盘的方式;BlueStore 支持同时使用多种不同类型的设备,在逻辑上 BlueStore 将存储空间划分为三层:慢速(Slow) 空间、高速(DB)空间、超高速(WAL)空间,不同的空间可以指定使用不同的设备类型, 当然也可使用同一块设备

BlueStore 的设计考虑了 FileStore 中存在的一些硬伤,抛弃了传统的文件系统直接管理裸设 备,缩短了 IO 路径,同时采用 ROW 的方式,避免了日志双写的问题,在写入性能上有了极大的提高。

2.4 CRUSH 算法简介

Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性 hash 算法

Ceph 使用 CURSH 算法来存放和管理数据,它是 Ceph 的智能数据分发机制。Ceph 使用 CRUSH 算法来准确计算数据应该被保存到哪里,以及应该从哪里读取,和保存元数据不同的 是,CRUSH 按需计算出元数据,因此它就消除了对中心式的服务器/网关的需求,它使得 Ceph 客户端能够计算出元数据,该过程也称为CRUSH 查找,然后和 OSD 直接通信。

#1.如果是把对象直接映射到 OSD 之上会导致对象与 OSD 的对应关系过于紧密和耦合,当 OSD 由于故障发生变更时将会对整个 ceph 集群产生影响。

#2.于是 ceph 将一个对象映射到 RADOS 集群的时候分为两步走: 首先使用一致性 hash 算法将对象名称映射到 PG 然后将 PG ID 基于 CRUSH 算法映射到 OSD 即可查到对象

#3.以上两个过程都是以”实时计算”的方式完成,而没有使用传统的查询数据与块设备的对应 表的方式,这样有效避免了组件的”中心化”问题,也解决了查询性能和冗余问题。使得 ceph 集群扩展不再受查询的性能限制。

#4.这个实时计算操作使用的就是 CRUSH 算法 Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性 hash 算 法。CRUSH 是一种分布式算法,类似于一致性 hash 算法,用于为 RADOS 存储集群控制数据的 分配

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-odDLzHc2-1640169458470)(企业存储.assets/image-20211214110527709.png)]

3.部署

https://github.com/ceph/ceph

http://docs.ceph.org.cn/install/manual-deployment/ #简要部署过程

ceph-ansible:https://github.com/ceph/ceph-ansible #python

ceph-salt:https://github.com/ceph/ceph-salt #python

ceph-container:https://github.com/ceph/ceph-container #shell

ceph-chef:https://github.com/ceph/ceph-chef #Ruby

ceph-deploy:https://github.com/ceph/ceph-deploy #python

是一个 ceph 官方维护的基于 ceph-deploy 命令行部署 ceph 集群的工具,基于 ssh 执行可以 sudo 权限的 shell 命令以及一些 python 脚本 实现 ceph 集群的部署和管理维护。 Ceph-deploy 只用于部署和管理 ceph 集群,客户端需要访问 ceph,需要部署客户端工具。

3.1:服务器准备:

http://docs.ceph.org.cn/start/hardware-recommendations/ #硬件推荐

192.168.91.100 admin,osd, mon   作为管理和监控节点
192.168.91.101 osd,mds
192.168.91.102 osd,mds
192.168.91.103 ceph-client   client

ceph1作管理. osd. mon节点;
ceph2和ceph3作osd mds;
ceph-client客户端;

setenforce 0
systemctl stop firewalld
sed -i '/^SELINUX=/s/=.*/=disabled/' /etc/selinux/config

#前三台服务器增加一块硬盘/dev/sdb
#创建目录并挂载到/data/osd{1,2,3};

##############前期准备,主机名,硬盘,hosts文件,ssh免密登录################
[root@localhost ~]#hostnamectl set-hostname ceph1
#修改主机名
[root@localhost ~]#hostnamectl set-hostname ceph2
[root@localhost ~]#hostnamectl set-hostname ceph3
[root@localhost ~]#hostnamectl set-hostname ceph-client
[root@localhost ~]#groupadd ceph -g 2021 && useradd -u 2021 -g 2021 ceph && echo "123456" | passwd --stdin ceph
#新建ceph用户和组


[root@ceph1 ~]#echo "- - -" > /sys/class/scsi_host/host0/scan 
[root@ceph1 ~]#echo "- - -" > /sys/class/scsi_host/host1/scan 
[root@ceph1 ~]#echo "- - -" > /sys/class/scsi_host/host2/scan 
[root@ceph1 ~]#mkfs.xfs /dev/sdb


[root@ceph1 ~]#mkdir -p /data/osd1
[root@ceph1 ~]#mount /dev/sdb /data/osd1/

[root@ceph1 ~]#mkdir -p /data/osd2
[root@ceph1 ~]#mount /dev/sdb /data/osd2/

[root@ceph1 ~]#mkdir -p /data/osd3
[root@ceph1 ~]#mount /dev/sdb /data/osd3


echo "- - -" > /sys/class/scsi_host/host0/scan 
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan 
mkfs.xfs /dev/sdb
mkdir -p /data/osd1
mount /dev/sdb /data/osd1/

[root@ceph1 ~]#vim /etc/hosts
#四台服务器全部修改
192.168.91.100 ceph1
192.168.91.101 ceph2
192.168.91.102 ceph3
192.168.91.103 ceph-client

ssh免密登录
[root@ceph1 ~]#ssh-keygen 
[root@ceph1 ~]#ssh-copy-id ceph1
[root@ceph1 ~]#ssh-copy-id ceph2
[root@ceph1 ~]#ssh-copy-id ceph3
[root@ceph1 ~]#ssh-copy-id ceph-client


[root@localhost ~]#yum install epel-release.noarch -y
#安装epel源,必须安装

rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm


sed -e 's!^metalink=!#metalink=!g' \
    -e 's!^#baseurl=!baseurl=!g' \
    -e 's!//download\.fedoraproject\.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' \
    -e 's!http://mirrors\.tuna!https://mirrors.tuna!g' \
    -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo


[root@ceph1 ~]#yum clean all &&yum -y install ceph-deploy
[root@ceph1 ~]#mkdir /etc/ceph && cd /etc/ceph
[root@ceph1 ceph]#ceph-deploy new ceph1
[root@ceph1 ceph]#ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

[root@ceph1 ceph]#echo "osd_pool_default_size = 2" >>/etc/ceph/ceph.conf
#配置文件的默认副本数从3改成2

4.GFS 分布式数据系统

4.1GFS 概述

GlusterFS 是一个开源的分布式文件系统。 GlusterFS 主要由存储服务器(Brick Server)、客户端及 NFS/Samba 存储网关(可选, 根据需要选择使用)组成。 GlusterFS 架构中最大的设计特点是没有元数据服务器组件,这有助于提升整个系统的 性能、可靠性和稳定性。 数据分为元数据和数据:

  • 数据:实际数据
  • 元数据 :元数据即是文件的属性信息(文件名、权限(属主、属组)、大小、更新时间等)

传统的分布式文件系统大多通过元服务器来存储元数据,元数据包 含存储节点上的目录信息、目录结构等。这样的设计在浏览目录时效率非常高,但是也存在 一些缺陷,例如单点故障。一旦元数据服务器出现故障,即使节点具备再高的冗余性,整个 存储系统也将崩溃。 而 GlusterFS 分布式文件系统是基于无元服务器的设计,数据横向扩展 能力强,具备较高的可靠性及存储效率

GlusterFS同时也是Scale-out(横向扩展)存储解决方案Gluster的核心,在存储数据方面具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。

GlusterFS支持借助TCP/IP或InfiniBandRDNA网络(一种支持多并发链接的技术,具有高带宽、低时廷、高扩展性的特点)将物理分散分布的存储资源汇聚在一起,统一提供存储服务,并使用统一全局命名空间来管理数据。

4.2 GFS特点

  • 扩展性和高性能 GlusterFS 利用双重特性来提供高容量存储解决方案 Scale-Out (横向扩展)架构通过增加存储节点的方式来提高存储容量和性能(磁盘、计算和 I/O 资源都可以独立增加),支持 10GbE 和 InfiniBand 等高速网络互联。

Gluster 弹性哈希(Elastic Hash)解决了 GlusterFS 对元数据服务器的依赖, GlusterFS 采用弹性哈希算法在存储池中定位数据,放弃了传统的通过元数据服 务器定位数据。GlusterFS 中可以智能地定位任意数据分片(将数据分片存储在 不同节点上),不需要查看索引或者向元数据服务器查询。这种设计机制实现了 存储的横向扩展, 改善了单点故障及性能瓶颈,真正实现了并行化数据访问。

  • 高可用性 GlusterFS 通过配置某些类型的存储卷,可以对文件进行自动复制(类似 于 RAID1),即使某个节点出现故障,也不影响数据的访问。当数据出现不一致时, 自动修复功能能够把数据恢复到正确的状态,数据的修复是以增量的方式在后台执行, 不会占用太多系统资源。GlusterFS 可以支持所有的存储,因为它没有设计自己的私有数据文件格式,而是采用操作系统中标准的磁盘文件系统(如 EXT3、XFS 等)来 存储文件,数据可以使用传统访问磁盘的方式被访问。

  • 全局统一命名空间 全局统一命名空间将所有的存储资源聚集成一个单一的虚拟存储 池,对用户和应用屏蔽了物理存储信息。存储资源(类似于 LVM)可以根据生产环 境中的需要进行弹性扩展或收缩。在多节点场景中,全局统一命名空间还可以基于不 同节点做负载均衡,大大提高了存取效率。

  • 弹性卷管理。 GlusterFS 通过将数据储存在逻辑卷中,逻辑卷从逻辑存储池进行独立 逻辑划分。逻辑存储池可以在线进行增加和移除,不会导致业务中断。逻辑卷可以根 据需求在线增长和缩减,并可以在多个节点中实现负载均衡。文件系统配置也可以实时在线进行更改并应用,从而可以适应工作负载条件变化或在线性能调优

  • 基于标准协议 Gluster 存储服务支持 NFS、CIFS、HTTP、FTP、SMB 及 Gluster 原生协议,完全与 POSIX 标准兼容。现有应用程序不需要做任何修改就可以对 Gluster 中的数据进行访问,也可以使用专用 API 进行访问(效率更高),这在公有 云环境中部署 Gluster 时非常有用,Gluster 对云服务提供商专用 API 进行抽象,然 后提供标准 POSIX 接口

4.3 Gluster 术语

  • Brick(存储块): 主机池中由主机提供的用于物理存储的专用分区,是 GlusterFS 中的基本存储单元,同时也是用存储池中服务器上对外提供的存储目录。 存储目录的格式由服务器和目录的绝对路径构成,表示方法为 SERVER:EXPORT, 如 192.168.1.4:/ data/mydir/。
  • Volume(逻辑卷): 一个逻辑卷是一组 Brick 的集合。卷是数据存储的逻辑设备,类 似于 LVM 中的逻辑卷。大部分 Gluster 管理操作是在卷上进行的。
  • FUSE(Filesystem inUserspace): 是一个内核模块,允许用户创建自己的文件系统, 无须修改内核代码。
  • VFS: 内核空间对用户空间提供的访问磁盘的接口。
  • Glusterd(后台管理进程): 在存储群集中的每个节点上都要运行。

4.4 模块化堆栈式架构

GlusterFS 采用模块化、堆栈式的架构,可以根据需 求配置定制化的应用环境,如大文件存储、海量小文件存储、云存储、多传输协议应用等。 通过对模块进行各种组合,即可实现复杂的功能。例如 Replicate 模块可实现 RAID1,Stripe 模块可实现 RAID0,通过两者的组合可实现 RAID10 和 RAID01,同时获得更高的性能及可靠性。

4.5GlusterFS 工作流程

(1) 客户端或应用程序通过 GlusterFS 的挂载点访问数据。 
(2) Linux 系统内核通过 VFS API 收到请求并处理。
(3) VFS 将数据递交给 FUSE 内核文件系统,并向系统注册一个实际的文件系统 FUSE, 而 FUSE 文件系统则是将数据通过/dev/fuse 设备文件递交给了 GlusterFS client 端。可以 将 FUSE 文件系统理解为一个代理。 
(4) GlusterFS client 收到数据后,client 根据配置文件对数据进行处理。 
(5) 经过 GlusterFS client 处理后,通过网络将数据传递至远端的 GlusterFS Server, 并且将数据写入服务器存储设备。

4.6 弹性HASH算法

  • 保证数据平均分布在每个 Brick 中
  • 解决了对元数据服务器的依赖,进而解决了单点故障及访问瓶颈。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gJBLSR2p-1640169458470)(企业分布式存储.assets/image-20211214225122947.png)]

4.7 GlusterFS 支持卷类型

GlusterFS 支持七种卷,即分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、 条带复制卷和分布式条带复制卷,这七种卷可以满足不同应用对高性能、高可用的需求。

分布式卷(Distribute volume):
文件通过 HASH 算法分布到所有 Brick Server 上, 这种卷是 Glusterf 的基础;以文件为单位根据 HASH 算法散列到不同的 Brick,其实 只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,属于文件级的 RAID 0, 不具有容错能力。

条带卷(Stripe volume):
类似 RAID0,文件被分成数据块并以轮询的方式分布到多 个 Brick Server 上,文件存储以数据块为单位,支持大文件存储,文件越大,读取效 率越高

复制卷(Replica volume):
将文件同步到多个 Brick 上,使其具备多个文件副本, 属于文件级 RAID 1,具有容错能力。因为数据分散在多个 Brick 中,所以读性能得 到很大提升,但写性能下降。

分布式条带卷(Distribute Stripe volume
Brick Server 数量是条带数(数据块分布 的 Brick 数量)的倍数,兼具分布式卷和条带卷的特点

分布式复制卷(Distribute Replica volume):
Brick Server 数量是镜像数(数据副本 数量)的倍数,兼具分布式卷和复制卷的特点。

分布式卷

分布式卷是 GlusterFS 的默认卷,在创建卷时,默认选项是创建分布式卷。在该模式下, 并没有对文件进行分块处理,文件直接存储在某个 Server 节点上。直接使用本地文件系统 进行文件存储,大部分 Linux 命令和工具可以继续正常使用。需要通过扩展文件属性保存 HASH 值,目前支持的底层文件系统有 EXT3、EXT4、ZFS、XFS 等。 由于使用的是本地文件系统,所以存取效率并没有提高,反而会因为网络通信的原因而 有所降低;另外支持超大型文件也会有一定的难度,因为分布式卷不会对文件进行分块处理。 虽然 EXT4 已经可以支持最大 16TB 的单个文件,但是本地存储设备的容量实在有限。File1 和 File2 存放在 Server1,而 File3 存放在 Server2,文件都是随机存储,一 个文件(如 File1)要么在 Server1 上,要么在 Server2 上,不能分块同时存放在 Server1 和 Server2 上。

分布式卷具有如下特点:

  • 文件分布在不同的服务器,不具备冗余性。
  • 更容易且廉价地扩展卷的大小。
  • 存在单点故障会造成数据丢失。
  • 依赖底层的数据保护。

条带卷

Stripe 模式相当于 RAID0,在该模式下,根据偏移量将文件分成 N 块(N 个条带节点), 轮询地存储在每个 Brick Server 节点。节点把每个数据块都作为普通文件存入本地文件系统 中,通过扩展属性记录总块数(Stripe-count)和每块的序号(Stripe-index)。在配置时指 定的条带数必须等于卷中 Brick 所包含的存储服务器数,在存储大文件时,性能尤为突出, 但是不具备冗余性。

  • 条带卷具有如下特点。
  • 数据被分割成更小块分布到块服务器群中的不同条带区。
  • 分布减少了负载且更小的文件加速了存取的速度。
  • 没有数据冗余性

复制卷

复制模式,也称为 AFR(AutoFile Replication),相当于 RAID1,即同一文件保存一份 或多份副本,每个节点上保存相同的内容和目录结构。复制模式因为要保存副本,所以磁盘 利用率较低。如果多个节点上的存储空间不一致,那么将按照木桶效应取最低节点的容量作,为该卷的总容量。在配置复制卷时,复制数必须等于卷中 Brick 所包含的存储服务器数,复制卷具备冗余性,即使一个节点损坏,也不影响数据的正常使用。

复制卷具有如下特点。

  • 卷中所有的服务器均保存一个完整的副本。
  • 卷的副本数量可由客户创建的时候决定。
  • 至少有两个块服务器或更多服务器。
  • 具备冗余性

分布式条带卷

分布式条带卷兼顾分布式卷和条带卷的功能,主要用于大文件访问处理,创建一个分布 式条带卷最少需要 4 台服务器

分布式复制卷

分布式复制卷兼顾分布式卷和复制卷的功能,主要用于需要冗余的情况下

4.8实际操作

setenforce 0
systemctl stop firewalld


echo "- - -" > /sys/class/scsi_host/host0/scan 
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan 




#!/bin/bash
dev=`ls /dev/sd* |grep -o 'sd[b-z]'| uniq`
for i  in $dev

do
  echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$i &> /dev/null
  mkfs.xfs /dev/${i}"1" &> /dev/null
  mkdir -p /data/${i}"1" &> /dev/null
  echo "/dev/${i}"1" /data/${i}"1" xfs defaults 0 0  " >> /etc/fstab
done
mount -a &> /dev/null




hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
hostnamectl set-hostname node4
hostnamectl set-hostname node5

[root@node1 ~]#vim /etc/hosts
192.168.91.100 node1
192.168.91.101 node2
192.168.91.102 node3
192.168.91.103 node4

echo "
192.168.91.100 node1
192.168.91.101 node2
192.168.91.102 node3
192.168.91.103 node4
192.168.91.104 node5">>/etc/hosts

#########################本地源安装##############################################

[root@node1 opt]#tar xf gfsrepo.tar.gz
[root@node1 yum.repos.d]#mkdir bak
[root@node1 yum.repos.d]#mv *.repo bak/
[root@node1 yum.repos.d]#ls
bak
[root@node1 yum.repos.d]#vim local.repo

[local]
name=local
baseurl=file:///opt/gfsrepo
gpgcheck=0

[root@node1 opt]#yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma 

scp local.repo 192.168.91.101:/etc/yum.repos.d/
scp local.repo 192.168.91.102:/etc/yum.repos.d/



################################################################


#####################使用网络源,版本较新取消了一些功能########################

[root@node1 opt]#cd /opt
[root@node1 opt]#yum install centos-release-gluster -y
[root@node1 opt]#yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma --skip-broken

###################################################################################



[root@node1 opt]#systemctl start glusterd.service 
[root@node1 opt]#systemctl status glusterd.service 

添加节点到存储信任池中(在 node1中)
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
[root@node1 opt]#gluster peer status 
Number of Peers: 3

Hostname: node2
Uuid: bdcab81e-f3fc-4633-9697-e5e1b4676d6a
State: Peer in Cluster (Connected)

Hostname: node3
Uuid: 9633f84f-05b7-46fa-9925-42e1cfc4c53a
State: Peer in Cluster (Connected)

Hostname: node4
Uuid: 0b63b591-5d06-4809-ab86-a85c916e1693
State: Peer in Cluster (Connected)




卷名称		       卷类型								 Brick
dis-volume	     分布式卷					   node1(/data/sdb1)  node2(/data/sdb1)
stripe-volume	 条带卷				 	   node1(/data/sdc1)  node2(/data/sdc1)
rep-volume	     复制卷				  	   node3(/data/sdb1)  node4(/data/sdb1)
dis-stripe		 分布式条带卷			   		 node1(/data/sdd1)  node2(/data/sdd1)node3(/data/sdd1)node4(/data/sdd1)
dis-rep		     分布式复制卷			    	 node1(/data/sde1)  node2(/data/sde1)node3(/data/sde1)node4(/data/sde1)

1创建分布式卷,默认创建的是分布式卷
gluster volume create dis-voluem node1:/data/sdb1 node2:/data/sdb1 force

gluster volume list
#查看卷列表
gluster volume start dis-volume
#启动卷
gluster volume info dis-volume
#查看卷的基本信息

2创建条带卷
#指定的类型是stripe 数值为2 且后面跟了两个 brick server ,所以创建的是条带卷
gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
gluster volume start stripe-volume
#启动

3 复制卷
#指定类型为replica 数值为2 且后面跟了两个 brick server ,所以创建的是复制卷
gluster volume  create replica-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
gluster volume start replica-volume

4创建分布式条带卷
#指定的类型是stripe 数值为2 且后面跟了4个 brick server ,所以创建的是分布式条带卷
gluster volume create  dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
gluster volume start dis-stripe

5创建分布式复制卷
#指定类型为replica 数值为2 且后面跟了4个 brick server 所以创建的分布式复制卷
gluster volume  create  dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
gluster volume start dis-rep


##########客户机操作#############
setenforce 0
systemctl stop firewalld

[root@node1 opt]#tar xf gfsrepo.tar.gz
[root@node1 yum.repos.d]#mkdir bak
[root@node1 yum.repos.d]#mv *.repo bak/
[root@node1 yum.repos.d]#ls
bak
[root@node1 yum.repos.d]#vim local.repo

[local]
name=local
baseurl=file:///opt/gfsrepo
gpgcheck=0
[root@localhost yum.repos.d]#yum install glusterfs glusterfs-fuse -y

mkdir -p /data/{dis,stripe,rep,dis_stripe,dis_rep}
#建立挂载目录

echo "
192.168.91.100 node1
192.168.91.101 node2
192.168.91.102 node3
192.168.91.103 node4">>/etc/hosts

临时挂载
mount.glusterfs node1:dis-volume /data/dis

永久挂载
node1:dis-volume            /data/dis      glusterfs    defaults,_netdev   0 0
node1:dis-rep              /data/dis_rep	glusterfs 	defaults,_netdev	0 0
node1:dis-stripe          /data/dis_stripe	glusterfs 	defaults,_netdev	0 0
node1:replica-volume     /data/rep			glusterfs 	defaults,_netdev	0 0
node1:stripe-volume     /data/stripe		glusterfs 	defaults,_netdev 	0 0

mount -a


测试:
cd /opt
dd if=/dev/zero of=/demo1.log bs=1M count=40
dd if=/dev/zero of=/demo2.log bs=1M count=40
dd if=/dev/zero of=/demo3.log bs=1M count=40
dd if=/dev/zero of=/demo4.log bs=1M count=40
dd if=/dev/zero of=/demo5.log bs=1M count=40


cp /demo* /data/dis
cp /demo* /data/stripe/
cp /demo* /data/rep/
cp /demo* /data/dis_stripe/
cp /demo* /data/dis_rep/

[root@node1 opt]#ll /data/sdb1
#已文件形式的分布式
总用量 163840
-rw-r--r--. 2 root root 41943040 1215 06:39 demo1.log
-rw-r--r--. 2 root root 41943040 1215 06:39 demo2.log
-rw-r--r--. 2 root root 41943040 1215 06:39 demo3.log
-rw-r--r--. 2 root root 41943040 1215 06:39 demo4.log
[root@node2 opt]#ll /data/sdb1
总用量 40960
-rw-r--r--. 2 root root 41943040 1215 06:39 demo5.log



[root@node1 opt]#ll -h /data/sdc1
#条带卷
总用量 101M
-rw-r--r--. 2 root root 20M 1215 06:39 demo1.log
-rw-r--r--. 2 root root 20M 1215 06:39 demo2.log
-rw-r--r--. 2 root root 20M 1215 06:39 demo3.log
-rw-r--r--. 2 root root 20M 1215 06:39 demo4.log
-rw-r--r--. 2 root root 20M 1215 06:39 demo5.log
[root@node2 opt]#ll -h /data/sdc1
总用量 101M
-rw-r--r--. 2 root root 20M 1215 06:39 demo1.log
-rw-r--r--. 2 root root 20M 1215 06:39 demo2.log
-rw-r--r--. 2 root root 20M 1215 06:39 demo3.log
-rw-r--r--. 2 root root 20M 1215 06:39 demo4.log
-rw-r--r--. 2 root root 20M 1215 06:39 demo5.log




[root@node3 opt]# ll -h /data/sdb1
#复制1
总用量 200M
-rw-r--r--. 2 root root 40M 1215 06:39 demo1.log
-rw-r--r--. 2 root root 40M 1215 06:39 demo2.log
-rw-r--r--. 2 root root 40M 1215 06:39 demo3.log
-rw-r--r--. 2 root root 40M 1215 06:39 demo4.log
-rw-r--r--. 2 root root 40M 1215 06:39 demo5.log

[root@node4 yum.repos.d]#ll -h /data/sdb1
总用量 200M
-rw-r--r--. 2 root root 40M 1215 06:39 demo1.log
-rw-r--r--. 2 root root 40M 1215 06:39 demo2.log
-rw-r--r--. 2 root root 40M 1215 06:39 demo3.log
-rw-r--r--. 2 root root 40M 1215 06:39 demo4.log
-rw-r--r--. 2 root root 40M 1215 06:39 demo5.log



#####破坏测试####

systemctl stop glusterd.service     ###当我们关机node2 在客户端上查看文件是否正常

####分布式卷数据查看###
[root@localhost dis]# ll                   ###我们在客户上发现少了demo5.log文件,这个是node2上的,
总用量 163840
-rw-r--r-- 1 root root 41943040 1018 14:50 demo1.log
-rw-r--r-- 1 root root 41943040 1018 14:50 demo2.log
-rw-r--r-- 1 root root 41943040 1018 14:50 demo3.log
-rw-r--r-- 1 root root 41943040 1018 14:50 demo4.log

####条带卷###
[root@localhost text]# cd stripe/      ####无法访问,条带卷不具备冗余性
[root@localhost stripe]# ll
总用量 0

#####分布式条带卷####
[root@localhost dis_and_stripe]# ll    #####无法访问,分布条带卷不具备冗余性
总用量 40960
-rw-r--r-- 1 root root 41943040 1018 14:51 demo5.log



###分布式复制卷####
[root@localhost dis_and_rep]# ll       #####可以访问,分布式复制卷具备冗余性
总用量 204800
-rw-r--r-- 1 root root 41943040 1018 14:52 demo1.log
-rw-r--r-- 1 root root 41943040 1018 14:52 demo2.log
-rw-r--r-- 1 root root 41943040 1018 14:52 demo3.log
-rw-r--r-- 1 root root 41943040 1018 14:52 demo4.log
-rw-r--r-- 1 root root 41943040 1018 14:52 demo5.log


###node2 和node4 挂机####
1、测试复制卷是否正常
[root@localhost rep]# ls -l             ###在客户机上测试正常 数据有
总用量 204800
-rw-r--r-- 1 root root 41943040 1018 14:51 demo1.log
-rw-r--r-- 1 root root 41943040 1018 14:51 demo2.log
-rw-r--r-- 1 root root 41943040 1018 14:51 demo3.log
-rw-r--r-- 1 root root 41943040 1018 14:51 demo4.log
-rw-r--r-- 1 root root 41943040 1018 14:51 demo5.log
2、测试分布式条卷是否正常
[root@localhost dis_and_stripe]# ll    ###在客户机上测试正常 没有数据 
总用量 0
3、测试分布式复制卷是否正常
[root@localhost dis_and_rep]# ll       ###在客户机上测试正常 有数据
总用量 204800
-rw-r--r-- 1 root root 41943040 1018 14:52 demo1.log
-rw-r--r-- 1 root root 41943040 1018 14:52 demo2.log
-rw-r--r-- 1 root root 41943040 1018 14:52 demo3.log
-rw-r--r-- 1 root root 41943040 1018 14:52 demo4.log
-rw-r--r-- 1 root root 41943040 1018 14:52 demo5.log


#####上述实验测试,凡是带复制数据,相比而言,数据比较安全####





gluster volume stop dis-stripe
#停止卷
gluster volume delete dis-volume
#删除卷
gluster volume status
#查看状态
gluster volume set dis-rep auth.allow 192.168.91.*
gluster volume set dis-rep auth.deny  192.168.91.100
#设置权限

51 demo2.log
-rw-r–r-- 1 root root 41943040 10月 18 14:51 demo3.log
-rw-r–r-- 1 root root 41943040 10月 18 14:51 demo4.log
-rw-r–r-- 1 root root 41943040 10月 18 14:51 demo5.log
2、测试分布式条卷是否正常
[root@localhost dis_and_stripe]# ll ###在客户机上测试正常 没有数据
总用量 0
3、测试分布式复制卷是否正常
[root@localhost dis_and_rep]# ll ###在客户机上测试正常 有数据
总用量 204800
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo1.log
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo2.log
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo3.log
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo4.log
-rw-r–r-- 1 root root 41943040 10月 18 14:52 demo5.log

#####上述实验测试,凡是带复制数据,相比而言,数据比较安全####

gluster volume stop dis-stripe
#停止卷
gluster volume delete dis-volume
#删除卷
gluster volume status
#查看状态
gluster volume set dis-rep auth.allow 192.168.91.*
gluster volume set dis-rep auth.deny 192.168.91.100
#设置权限


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值