Gluster的搭建和使用

序言

我们为什么要去使用分布式存储,在一家大型公司或者大规模的集群中,大家可能会经常遇到一个问题,我的数据怎么存放,放在那,数据空间不够了怎么办,这些问题经常困扰着我们。

笔者是在电信的一个部门工作的,我们的环境比较复杂。环境有NAS,各种NFS,还有为了高可用搭建的HA上面跑的共享目录,每次我们遇到的一个最大的问题就是,哪哪哪的空间不够了,我们需要迁移数据,这个已经成为了日常工作中的一个限制,很难受,尤其是公司目前还没有分布式存储。

在这个环境下,为了解决繁琐的劳动,打算研究一下。目前的话,打算考虑的就两个方向,一个是CEPH,一个Gluster。但是在之前的调研中,CEPH手头的资料比较少,另外可能是笔者比较笨,没有看懂,目前只更新Gluster的用法,后续会去研究CEPH。

时间:

2018年5月28日

搭建

1,环境搭建:

最少两台Centos7的机器,也可以选择其他机器。如果搭建分布条带复制卷的话,最好是4台机器为基础(注意:扩容的时候必须以搭建的基数来扩建)

服务器

IP

主机名

系统

1

10.251.26.193

gluster_test1

Centos7.3

2

10.251.26.194

gluster_test2

Centos7.3

3

10.251.26.195

gluster_test3

Centos7.3

2,主机名设置

(因为Gluster可以根据主机名来访问,这里最好设置一下。如果是根据IP来访问,那这就没有必要了),设置环境需要相同

vi  /etc/hosts

10.251.26.193  gluster_test1

10.251.26.194  gluster_test2

10.251.26.195  gluster_test3

3,时钟同步

搭建的时候时间必须要同步好,时间有误差,集群的通信也可能会有问题。

ntpdate    时钟服务器

4,安装Gluster仓库

yum install centos-release-gluster -y

5,格式化和挂载Brick

Brick:GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如'SERVER:EXPORT'

mkfs.xfs    -i   size=512   /dev/sdb

mkdir   -p   /gluster/test1

在/etc/fstab中添加如下

/dev/sdb       /gluster/test1      xfs     defaults        0 0

然后进行挂载

mount   -a

6,安装GlusterFS

yum --enablerepo=centos-gluster*-test install glusterfs-server

7,添加开机启动并启动服务

systemctl enable glusterd

systemctl start glusterd

配置

安装完成后GlusterFS之后,需要配置,配置之前最好ping下自己的主机名。

1,配置trusted  pool

Gluster   peer   probe   主机IP

对于一台服务器来说,只需要添加其他的server就好了。

2,查看集群的状态

gluster     peer    status

3,配置glusterFS卷

比如说你要创建一个fbtdfz共享卷

(mkdir   /gluster/test1/fbtdfz,前面的是咱们已经建立好的,后面的是输出目录,但是我在实际环境中可以直接创建一条命令)

gluster volume create fbtdfz  stripe 2 replica 2 10.251.26.193:/gluster/test4/fbtdfz  10.251.26.194:/gluster/test3/fbtdfz 10.251.26.193:/gluster/test5/fbtdfz 10.251.26.194:/gluster/test4/fbtdfz

4,启动共享卷

gluster     volume   start     fbtdfz

5,查看共享卷状态

gluster     volume     info

6,挂载卷

注意,挂载卷的时候需要安装gluster客户端

mount   -t  glusterfs   IP:/共享目录      /mnt

原理

一、分布式文件系统

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源并不直接与本地节点相连,而是分布于计算网络中的一个或者多个节点的计算机上。目前意义上的分布式文件系统大多都是由多个节点计算机构成,结构上是典型的客户机/服务器模式。流行的模式是当客户机需要存储数据时,服务器指引其将数据分散的存储到多个存储节点上,以提供更快的速度,更大的容量及更好的冗余特性。

目前流行的分布式文件系统有许多,如MooseFS、OpenAFS、GoogleFS,具体实现原理我这里不再介绍。

二、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算法写入各个节点的硬盘上,优点是容量大,缺点是没冗余。

Gluster volume create test-volume server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

2、复制卷(Replicated Volume)

相当于raid1,复制的份数,决定集群的大小,通常与分布式卷或者条带卷组合使用,解决前两种存储卷的冗余缺陷。缺点是磁盘利用率低。

复本卷在创建时可指定复本的数量,通常为2或者3,复本在存储时会在卷的不同brick上,因此有几个复本就必须提供至少多个brick,当其中一台服务器失效后,可以从另一台服务器读取数据,因此复制GlusterFS卷提高了数据可靠性的同事,还提供了数据冗余的功能。

Gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2

3、分布式复制卷(Distributed Replicated Volume)

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

gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4

4、条带卷(Striped Volume)

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

gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2

5、分布式条带卷(Distributed Striped Volume)

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

gluster volume create test-volume stripe 4 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8

故障恢复

4.1 硬盘故障

如果底层做了 RAID 配置,有硬件故障,直接更换硬盘,会自动同步数据。
如果没有做 RAID,处理方法如下:

正常节点上执行 gluster volume status,记录故障节点 uuid
执行:getfattr -d -m ‘.*’ /brick 记录 trusted.gluster.volume-id 及 trusted.gfid

以下为故障模拟及修复过程:

在 VMware Workstation 上移除 mystorage1 主机的第三块硬盘(对应 sdc /storage/brick2),相当于硬盘故障

# 系统提示如下:

Message from syslogd@linux-node01 at Jul 30 08:41:46 ...

storage-brick2[5893]: [2016-07-30 00:41:46.729896] M [MSGID: 113075] [posix-helpers.c:1844:posix_health_check_thread_proc] 0-gv2-posix: health-check failed, going down

Message from syslogd@linux-node01 at Jul 30 08:42:16 ...

storage-brick2[5893]: [2016-07-30 00:42:16.730518] M [MSGID: 113075] [posix-helpers.c:1850:posix_health_check_thread_proc] 0-gv2-posix: still alive! -> SIGTERM

# 查看卷状态,mystorage1:/storage/brick2 不在线了,不过这是分布式复制卷,还可以访问另外 brick 上的数据

[root@mystorage1 ~]# gluster volume status gv2

Status of volume: gv2

Gluster process                             TCP Port  RDMA Port  Online  Pid

------------------------------------------------------------------------------

Brick mystorage1:/storage/brick2            N/A       N/A        N       N/A

在 VMware Workstation 上新增 mystorage1 一块硬盘,相当于更换了新硬盘,下面先格式挂载新硬盘:

# mkfs.xfs -f /dev/sdc

# mkdir -p /storage/brick2

# mount -a

# df -h

# 新硬盘挂载后目录为空

[root@mystorage1 ~]# ll /storage/brick2

total 0

开始手动配置新增硬盘的 gluster 参数

# 在 mystorage2 是获取 glusterfs 相关参数:

[root@mystorage2 tmp]# getfattr -d -m '.*'  /storage/brick2

getfattr: Removing leading '/' from absolute path names

# file: storage/brick2

trusted.gfid=0sAAAAAAAAAAAAAAAAAAAAAQ==

trusted.glusterfs.dht=0sAAAAAQAAAAAAAAAAf////g==

trusted.glusterfs.dht.commithash="3168624641"

trusted.glusterfs.quota.dirty=0sMAA=

trusted.glusterfs.quota.size.1=0sAAAAAATiAAAAAAAAAAAAAwAAAAAAAAAE

trusted.glusterfs.volume-id=0sEZKGliY6THqhVVEVrykiHw==

# 在 mystorage1 上执行配置 glusterfs 参数和上述一样

setfattr -n trusted.gfid -v 0sAAAAAAAAAAAAAAAAAAAAAQ== /storage/brick2

setfattr -n trusted.glusterfs.dht -v 0sAAAAAQAAAAAAAAAAf////g== /storage/brick2

setfattr -n trusted.glusterfs.dht.commithash -v "3168624641" /storage/brick2

setfattr -n trusted.glusterfs.quota.dirty -v 0sMAA= /storage/brick2

setfattr -n trusted.glusterfs.quota.size.1 -v 0sAAAAAATiAAAAAAAAAAAAAwAAAAAAAAAE /storage/brick2

setfattr -n trusted.glusterfs.volume-id -v 0sEZKGliY6THqhVVEVrykiHw== /storage/brick2

[root@mystorage1 ~]# /etc/init.d/glusterd restart

Starting glusterd:                                         [  OK  ]

[root@mystorage1 ~]# gluster volume heal gv2 info

Brick mystorage1:/storage/brick2

Status: Connected

Number of entries: 0

Brick mystorage2:/storage/brick2

/data

Status: Connected

Number of entries: 1        # 显示一个条目在修复,自动修复完成后会为 0

Brick mystorage3:/storage/brick1

Status: Connected

Number of entries: 0

Brick mystorage4:/storage/brick1

Status: Connected

Number of entries: 0

# 自动修复同步完成后,查看新硬盘的数据同步过来了

[root@mystorage1 ~]# ll /storage/brick2

total 40012

-rw-r--r-- 2 root root 20480000 Jul 30 02:41 20M.file

-rw-r--r-- 2 root root 20480000 Jul 30 03:13 20M.file1

drwxr-xr-x 2 root root       21 Jul 30 09:14 data

4.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

4.3 部分硬盘故障

上面两种办法是在网上借鉴的,但是在实际的恢复过程中,第一种恢复硬盘的方式是不成功的,所以就利用了另外一种方法:

模拟的是一块盘坏了新换了一块盘上去:

替换步骤:

先把坏了那个那个brick移除掉

gluster volume remove-brick fuzhi replica 1 server1:/data/fuzhi_b1  force

fuzhi:这里指的是坏了的那个卷组名

replica:1    这里代指的是还剩下一个备份

server1:/data/fuzhi    这是坏了的那个卷组

force   :暂时不清楚含义

然后再把新得brick加进去

gluster volume add-brickfuzhi replica 2 server3:/data/fuzhi_b3force

注意现在这个replica后面跟的数量一定是大于1的

最后执行节点健康数据检查,恢复数据:

gluster volume heal fuzhi

Fuzhi:这里是要恢复的名字

Gluster常用命令

gluster peer

帮助 gluster volume create help

本次把sdb1挂在到了/date/下

卷的类型

哈希卷 gluster volume create haxi server1:/data/haxi_b1 server2:/data/haxi_b2 force

复制卷  gluster volume create fuzhi replica 2 server1:/data/fuzhi_b1 server2:/data/fuzhi_b2

条带卷 gluster volume create tiaodai stripe 2 server1:/data/tiaodai_b1 server2:/data/tiaodai_b2

哈希条带复制卷  gluster volume create hxfz server1:/data/hxfz_b1 server2:/data/hxfz_b1 server1:/data/hxfz_b2 server2:/data/hxfz_b2 force

增加节点

gluster peer probe ip/主机名

删除节点

gluster peer detach ip/主机名

查看节点状态

gluster peer status

为哈希卷扩容

gluste volume add-brick  卷的名字   servername:/brick的位置

为哈希卷缩小空间

gluster volume remove-brick 卷的名字 servername:/brik的位置 start

gluster volume remove-brick 卷的名字 servername:/brick的位置 commit -->此时会丢失数据

为复制卷扩容

gluster volume add=brick 卷的名字 replica 2 servername:/brick的位置  servername:/brick的位置 start

为复制卷缩小空间

gluster volume remove-brick 卷的名字 replica 2 servername:/brick的位置 servername:/brick的位置 start

gluster volume remove-brick 卷的名字 servername:/brick的位置  servername:/brick的位置 commit

负载均衡

命令格式

volume rebalance 卷的名字 fix-layout start

数据监控检测以及修复

gluster volume heal 卷的名称

磁盘配额

gluster volume quota 卷的名字 limit-usage 路径 限额大小

Gluster的搭建和使用的更多相关文章

  1. (转)CentOS7.4环境下搭建--Gluster分布式集群存储

    原文:https://blog.csdn.net/qq_39591494/article/details/79853038 环境如下:OS:Centos7.4x86_64IP地址如下: Daasban ...

  2. centos7 搭建GlusterFS

    centos7 搭建GlusterFS 转载http://zhaijunming5.blog.51cto.com/10668883/1704535 实验需求:4台机器安装GlusterFS组成一个集群 ...

  3. 自己家里搭建NAS服务器有什么好方案?

    转自:https://www.zhihu.com/question/21359049 作者:陈二发链接:https://www.zhihu.com/question/21359049/answer/6 ...

  4. Ubuntu 搭建 GlusterFS 过程笔记

    https://download.gluster.org/pub/gluster/ #要安装的东西 ---- ``` apt install -y build-essential gcc make c ...

  5. Centos7下GlusterFS 分布式文件系统环境搭建

    Centos7下 GlusterFS 环境搭建准备工作glusterfs-3.6.9.tar.gzuserspace-rcu-master.zip三台服务器:192.168.133.53.192.16 ...

  6. Kubernetes 概述和搭建(多节点)

    一.Kubernetes整体概述和架构 Kubernetes是什么 Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务.通过Kubernetes能够进行应用的自动化部署和扩缩 ...

  7. 【云计算】Ubuntu14.04 搭建GlusterFS集群

    1.修改 /etc/hosts 所有服务节点执行(如果集群中没有DNS,可忽略此步骤): 10.5.25.37 glusterfs-1-5-25-3710.5.25.38 glusterfs-2-5- ...

  8. glusterfs详解及kubernetes 搭建heketi-glusterfs

    本文包含: gluster各存储卷详解.创建及使用 gluster-kubernetes搭建glusterfs存储 前言 传统的运维中,往往需要管理员手动先在存储集群分配空间,然后才能挂载到应用中去. ...

  9. Online Judge(OJ)搭建(第一版)

    搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...

随机推荐

  1. Qt网络获取本机网络信息

    下面我们就讲解如何获取自己电脑的IP地址以及其他网络信息.这一节中,我们会涉及到网络模块(QtNetwork Module)中的QHostInfo ,QHostAddress ,QNetworkInt ...

  2. uni-app 的更新及碰到的问题

    uni-app 的更新 我这个是针对 app 的测试,没有考虑 小程序 及 h5,如需考虑请参考 uni-app 的条件编译 当我们将文件打包好之后,我们在手机上就可以下载 apk 文件,安装到我们的 ...

  3. 提高组刷题班 DAY 1 上午

    低仿机器人(robo,1s,64M) 题解 大模拟 代码 #include <cstdio> #include <cstring> #include <iostream& ...

  4. mysql数据库指定ip远程访问

    1.登录 mysql -u root -p 之后输入密码进行登陆 2.权限设置及说明 2.1添加远程ip访问权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'192. ...

  5. Restful 风格

    大家在做Web开发的过程中,method常用的值是get和post. 可事实上,method值还可以是put和delete等等其他值.既然method值如此丰富,那么就可以考虑使用同一个url,但是约 ...

  6. Java特殊数据结构-TreeSet

    资料来源 TreeSet初步入门总结 https://www.cnblogs.com/yzssoft/p/7127894.html TreeSet自然排序与比较器排序精讲 https://blog.c ...

  7. dede不同栏目调用不同banner图的方法

    用顶级栏目ID 方法: <img src="{dede:global.cfg_templets_skin/}/images/{dede:field.typeid function=&q ...

  8. es6 实现双链表

    const util = require('util'); /** * 链表节点类 */ class Node { constructor (ele) { this.ele = ele; this.n ...

  9. 【笔记】Docker部署Odoo

    一,制作一个自己的odoo镜像odoo:yto 1,下载一个odoo10的镜像 docker pull odoo:10.0 2,按照自己的意愿修改里面的内容 docker run -it -u roo ...

  10. HashPump用法

    做哈希长度扩展攻击的时候用到这个工具,但是没找到这个工具详解办法 我这篇不算是详解,只是收集例子做出的一个用法 HashPump一种在各种散列算法中利用散列长度扩展攻击的工具.目前支持的算法:MD5, ...