分布式-----搭建GFS分布式存储!!!

一,GFS概述

简介

本文提到的GFS是Redhat的Global File System,不是Google的Google File System。GFS的官方文档链接如下:
RHEL6版(中文)https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/global_file_system_2/
RHEL7版(英文)https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/global_file_system_2/index

  • 开源的分布式文件系统
  • 由存储服务器,客户端以及NFS/samba 存储网关组成
  • 无元数据服务器
    在这里插入图片描述

RDMA协议 tcp/ip:去中心化(要所有的都同意),没有中心化
存储网关:空余的存储空间的管理,文件------中介------存储节点是房子

特点

  • 扩展性和高性能
  • 高可用性
  • 全局统一命名空间
  • 弹性卷管理
  • 基于标准协议

术语

  • Brick
    GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’
  • Volume:
  • FUSE:
    内核文件系统,Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接
  • VFS:
    虚拟文件系统
  • Glusterd:
    Gluster management daemon,要在trusted storage pool中所有的服务器上运行

模块化堆栈架构

  • 模块化,堆栈式的架构
  • 通过对模块的组合,实现复杂的功能d

工作原理

1、客户端或应用程序通过GlusterFS的挂载点访问数据

2、linux系统内核通过VFS API收到请求并处理

3、VFS将数据递交给FUSE内核文件系统, fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS client端

4、GlusterFS client 收到数据后,client根据配置文件的配置对数据进行处理

5、通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上

//用到弹性HASH算法…

二,GlusterFS的卷类型

1、分布式卷

没有对文件进行分块处理
通过扩展文件属性保存hash值
支持的底层文件系统有ext3、ext4、zfs、xfs等

  • 分布式卷的特点
    文件分布在不同的服务器中,不具备冗余性
    更容易、廉价的扩展 卷的大小
    单点故障会造成数据丢失
    依赖底层的数据保护
  • 创建分布式卷
    创建一个名为dis-volume的分布式卷,文件将根据hash分布在server1:/dir1、server2:/dir2中
    [root@localhost~]#gluster volume create dis-volume server1:/dir1 server2:/dir2

2、条带卷

根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个brick server节点
存储大文件时,性能尤为突出
不具备冗余性,类似raid0

  • 条带卷的特点
    数据被分割成更小的块分布到块服务器群中的不同条带区
    分布减少了负载且更小的文件加速了存取的速度
    没有数据冗余
  • 创建条带卷
    创建一个名为Stripe-volume的条带卷,文件将被分块轮询的存储在server1:/dir2、server2:/dir2中
    gluster voluster create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2

3、复制卷

同一个文件保存一份或多份副本
因为要保存副本,所以磁盘利用效率低
若多个节点上的存储空间不一致,将按照木桶效应取最低节点的容量作为改卷的总容量

  • 复制卷的特点
    卷中所有的服务器均保存一个完整的副本
    卷的副本数量可由客户创建的时候决定
    至少有两个块服务器或更多的服务器
    具备冗余性
  • 创建复制卷
    创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在server1:/dir1、server2:/dir2中
    gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2

4、分布式条带卷

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

  • 创建分布式条带卷
    创建名为dis-stripe的分布式条带卷,配置分布式的条带时,卷中brick所包含的存储服务器数必须是条带数的倍数(>=2倍)
    gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4

5、分布式复制卷

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

  • 创建分布式复制卷
    创建名为dis-rep的分布式条件带卷,配置分布式复制卷时,卷中brick所包含的存储服务器数必须是条带卷的倍数(>=2倍)
    gluster voluster create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4

三,搭建GFS,测试

搭建GFS分布式存储
nd1 | 20.0.0.11 | centos7.6 | 存储节点
nd2 | 20.0.0.12 | centos7.6 | 存储节点
nd3 | 20.0.0.13 | centos7.6 | 存储节点
nd4 | 20.0.0.14 | centos7.6 |存储节点
nd5 | 20.0.0.15 | centos7.6 | 客户端

步骤一:做分区,格式化,挂载;

//四个节点,每个节点新增四块硬盘,
编写脚本:

vi cp.sh

#!/bin/bash
echo  "进行磁盘创建,格式化,挂载"
fdisk -l |grep sd[b-z]
echo "------------------------------------"
read -p "你想选择上面那块磁盘挂载:" ci
case $ci  in
sda)
      echo "请选择数据盘挂载.."
      exit
        ;;
sd[b-z])
fdisk /dev/$ci <<EOF
n
p




w
EOF
#创建挂载目录
mkdir  -p  /data/${
    
    ci}1
ta=/data/${
    
    ci}1
#格式化磁盘
mkfs.xfs  /dev/${
    
    ci}1 &>/dev/null
#挂载磁盘
echo  "/dev/${ci}1  $ta  xfs   defaults  0 0 ">>/etc/fstab
mount -a
           ;;
quit)
      exit
      ;;
*)
    echo  "请选择正确的磁盘....重新尝试"
  ;;
esac


chmod  +x cp.sh

步骤二:配置hosts主机解析

//方便后续ip地址的使用,做主机映射;
1.主机映射

vi  /etc/hosts

20.0.0.11 nd1
20.0.0.12 nd2
20.0.0.13 nd3
20.0.0.14 nd4

2.复制到其他主机,也做主机解析

scp /etc/hosts  root@20.0.0.12:/etc/hosts
scp /etc/hosts  root@20.0.0.13:/etc/hosts
scp /etc/hosts  root@20.0.0.14:/etc/hosts

步骤三:搭建GFS下载源

修改本地yum源文件;
cd  /etc/yum.repos.d

mkdir   backup

mv C* backup

wget -O /etc/yum.repos.d/GLFS.repo http://mirrors.aliyun.com/repo/Centos-7.repo
//在线下载保存到本地yum源,
yum clean all 

yum  list



.其他节点也做配置;同上一样操作;
//远程复制文件到其他节点
scp GLFS.repo   root@20.0.0.12:/etc/yum.repos.d/
scp GLFS.repo   root@20.0.0.13:/etc/yum.repos.d/
scp GLFS.repo   root@20.0.0.14:/etc/yum.repos.d/

步骤四:下载GFS

1.所有节点都要下载

yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
1.客户端
2.服务端
3.对接GFS组件
4.网络rbma组件

2.所有节点都需要启动服务

systemctl start glusterd
systemctl enable glusterd
systemctl status glusterd

3.所有节点做时间同步
ntpdate ntp1.aliyun.com

4.添加入存储信任池,(只需要在一个节点上做即可,同属于一个信任池)

gluster peer probe nd2
gluster peer probe nd3
gluster peer probe nd4

5.查看存储信任池

[root@localhost yum.repos.d]# gluster peer status
Number of Peers: 3       

Hostname: nd2
Uuid: 638e659f-0be0-486f-83d0-b86e33ade30a
State: Peer in Cluster (Connected)

Hostname: nd3
Uuid: 761c4c44-7d24-4188-ac71-f38fd6e515a3
State: Peer in Cluster (Connected)

Hostname: nd4
Uuid: 5717440d-c2b8-4895-9a25-5d2978d994a4
State: Peer in Cluster (Connected)

分布式卷

//nd1节点的/sdb1和nd2节点的/sdb1

[root@localhost yum.repos.d]# gluster volume create fbs-vol nd1:/data/sdb1  nd2:/data/sdb1 force
//固定语法 +create 创建+名称+由nd1节点的/sdb1和nd2节点的/sdb1 组成的分布式卷+强制性执行

volume create: fbs-vol: success: please start the volume to access data

[root@localhost yum.repos.d]# gluster volume info fbs-vol       //查看分布式卷
 
Volume Name: fbs-vol
Type: Distribute             //类型:分布式卷
Volume ID: d610fedc-873a-4be6-b9b7-5179e2f21032
Status: Created              //创建状态,无法使用,需要开启
Snapshot Count: 0 
Number of Bricks: 2          //两块组成
Transport-type: tcp          //通信协议
Bricks:
Brick1: nd1:/data/sdb1
Brick2: nd2:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

[root@localhost yum.repos.d]# gluster volume start fbs-vol    //开启分布式卷
volume start: fbs-vol: success

条带卷

//nd1的/sdc和nd2的/sdc

[root@localhost yum.repos.d]# gluster volume create td-vol stripe 2 nd1:/data/sdc1/  nd2:/data/sdc1/ force


volume create: td-vol: success: please start the volume to access data

[root@localhost yum.repos.d]# gluster volume start td-vol
volume start: td-vol: success

[root@localhost yum.repos.d]# gluster volume info td-vol
 
Volume Name: td-vol
Type: Stripe
Volume ID: 58ad1cb2-8854-4db2-ae0c-2591dc8f2ee9
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: nd1:/data/sdc1
Brick2: nd2:/data/sdc1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on


复制卷

//nd3的/sdb1 和 nd4的/sdb1

[root@localhost yum.repos.d]# gluster volume create fz-vol replica 2 nd3:/data/sdb1  nd4:/data/sdb1 force
volume create: fz-vol: success: please start the volume to access data

[root@localhost yum.repos.d]# gluster volume start fz-vol
volume start: fz-vol: success

[root@localhost yum.repos.d]# gluster volume info fz-vol
 
Volume Name: fz-vol
Type: Replicate
Volume ID: b5a3953c-89f4-4510-9d3c-c4e77c1f8c3f
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: nd3:/data/sdb1
Brick2: nd4:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

分布式条带卷

//四个节点的/sdd1磁盘

[root@localhost yum.repos.d]# gluster volume create fb-td stripe 2 nd1:/data/sdd1 nd2:/data/sdd1 nd3:/data/sdd1 nd4:/data/sdd1 force
volume create: fb-td: success: please start the volume to access data
[root@localhost yum.repos.d]# gluster volume start fb-td
volume start: fb-td: success
[root@localhost yum.repos.d]# gluster volume info fb-td
 
Volume Name: fb-td
Type: Distributed-Stripe
Volume ID: cfa3f503-dd13-42df-9e7d-038d7fc3ef2a
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: nd1:/data/sdd1
Brick2: nd2:/data/sdd1
Brick3: nd3:/data/sdd1
Brick4: nd4:/data/sdd1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

分布式复制卷

///四个节点的/sde1硬盘

[root@localhost yum.repos.d]# gluster volume create fb-fz replica 2 nd1:/data/sde1 nd2:/data/sde1 nd3:/data/sde1 nd4:/data/sde1 force
volume create: fb-fz: success: please start the volume to access data
[root@localhost yum.repos.d]# gluster  volume start fb-fz
volume start: fb-fz: success
[root@localhost yum.repos.d]# gluster volume info fb-fz
 
Volume Name: fb-fz
Type: Distributed-Replicate
Volume ID: afaee781-1bb2-41cd-9a8e-193056dbb648
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: nd1:/data/sde1
Brick2: nd2:/data/sde1
Brick3: nd3:/data/sde1
Brick4: nd4:/data/sde1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

[root@localhost ~]# gluster volume  list        //查看所有卷
fb-fz
fb-td
fbs-vol
fz-vol
td-vol

客户端

1.关闭防火墙,核心防护

2.搭建GFS下载源

3.hosts主机映射

4.下载客户端,对接组件

yum -y install glusterfs glusterfs-fuse

5.创建挂载目录,临时挂载

mkdir -p /test/fbs
mkdir /test/fz
mkdir /test/fb-td
mkdir /test/fb-fz

//临时挂载
mount.glusterfs  nd1:fbs-vol /test/fbs/       //挂载分布式卷
mount.glusterfs nd1:td-vol /test/td/            //挂载条带卷
mount.glusterfs nd1:fz-vol  /test/fz/            //挂载复制卷
mount.glusterfs nd1:fb-td  /test/fb-td/         //挂载分布式条带卷
mount.glusterfs nd1:fb-fz  /test/fb-fz/          //挂载分布式复制卷

6.查看挂载

df -Th

nd1:fbs-vol    fuse.glusterfs   40G   65M   40G    1% /test/fbs
nd1:td-vol     fuse.glusterfs   40G   65M   40G    1% /test/td
nd1:fz-vol     fuse.glusterfs   20G   33M   20G    1% /test/fz
nd1:fb-td      fuse.glusterfs   80G  130M   80G    1% /test/fb-td
nd1:fb-fz      fuse.glusterfs   40G   65M   40G    1% /test/fb-fz

//除了复制卷的容量为总容量的1/2,其他都是总容量

测试

//创建5个40M的文件测试
dd if=/dev/zero of=/dem1.log bs=1M count=40
dd if=/dev/zero of=/dem2.log bs=1M count=40
dd if=/dev/zero of=/dem3.log bs=1M count=40
dd if=/dev/zero of=/dem4.log bs=1M count=40
dd if=/dev/zero of=/dem5.log bs=1M count=40

//dd:连续复制,if来自/dev/zero(垃圾站) 名称   一次1M  次数40次


//复制5个文件到不同的卷上
cp /dem*  /test/fbs
cp /dem*  /test/td
cp /dem*  /test/fz
cp /dem*  /test/fb-td
cp /dem*  /test/fb-fz

//查看每个卷的存储;

分布式卷:nd1,nd2的/data/sdb1
(文件按照原有大小40M,分布存储!)
nd1:   都是40m  文件4.5
nd2:    都是40m  文件123

条带卷:nd1,nd2的/data/sdc1
(文件会将原有大小拆分块来储存,两块硬盘分别存储20M的文件)
nd1:都是20m文件1-5
nd2:  都是20m文件1-5

复制卷:nd3,nd4的/data/sdb1
(卷内的所有硬盘,都存储了文件,相当于备份了一份文件,更安全)
nd3:都是40m文件1-5
nd4:都是40m文件1-5

分布式条带卷:四个节点的/sdd1硬盘
(将文件分块,分布式存储在卷内的四个节点的硬盘上,)
nd1: 都是20m 文件4和5
nd2: 都是20m 文件4和5
nd3: 都是20m  文件123
nd4: 都是20m  文件123

分布式复制卷:四个节点的/sde1硬盘
(文件完整的分别存储在四个节点硬盘上,分布在两块硬盘的数据相同,另两块数据相同)
nd1:都是40m  文件4.5
nd2:都是40m  文件4.5
nd3:都是40m  文件123
nd4:都是40m  文件123


破坏测试

//关闭nd2节点;
1.分布式卷缺少文件123
(挂了一个,只会显示没挂掉的内容)
客户端查看:
[root@localhost yum.repos.d]# ll -h /test/fbs
总用量 80M
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem4.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem5.log

2.条带卷因为nd2关闭,文件无法恢复完整性,无法显示文件,
(挂掉一个,就都挂了)
[root@localhost yum.repos.d]# ll -h /test/td
ls: 正在读取目录/test/td: 传输端点尚未连接
总用量 0


//关闭nd3节点
1.复制卷不受影响,因为另一块nd4硬盘内,复制的有数据
(数据保障,更安全,双重数据)
[root@localhost yum.repos.d]# ll -h /test/fz
总用量 200M
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem1.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem2.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem3.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem4.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem5.log

2.分布式条带
(无法访问,两个节点关闭,)
[root@localhost yum.repos.d]# ll -h /test/fb-td
ls: 正在读取目录/test/fb-td: 传输端点尚未连接
总用量 0

3.分布式复制
(nd2和nd3关掉了,但是1 (45文件)和4(123文件)存放的数据,仍然能保证数据的完整!)
[root@localhost yum.repos.d]# ll -h /test/fb-fz
总用量 200M
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem1.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem2.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem3.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem4.log
-rw-r--r-- 1 root root 40M 10月 27 14:02 dem5.log

删除卷

//
想要删除卷的时,需要先停止卷。
所有节点服务器要保持开启状态;(存储信任池内的节点,不允许有宕机的,不然无法删除)


[root@localhost yum.repos.d]# gluster volume stop td-vol
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) yes
volume stop: td-vol: success

[root@localhost yum.repos.d]# gluster volume delete td-vol        //宕机的节点未启动
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) yes
volume delete: td-vol: failed: Some of the peers are down

[root@localhost yum.repos.d]# gluster volume delete td-vol         //将存储信任池内关闭的节点启动
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) yes
volume delete: td-vol: success

访问控制

//仅拒绝20.0.0.15客户端访问分布式卷

[root@localhost yum.repos.d]# gluster volume set fbs-vol auth.reject 20.0.0.15
volume set: success

客户端查看挂载访问:
[root@localhost yum.repos.d]# ll /test/fbs
总用量 0



//仅允许
[root@localhost yum.repos.d]# gluster volume set fbs-vol auth.allow 20.0.0.15
volume set: success


[root@localhost yum.repos.d]# gluster volume info fbs-vol 
 
Volume Name: fbs-vol
Type: Distribute
Volume ID: d610fedc-873a-4be6-b9b7-5179e2f21032
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: nd1:/data/sdb1
Brick2: nd2:/data/sdb1
Options Reconfigured:
auth.allow: 20.0.0.15          //在这
auth.reject: 20.0.0.15          //在这
transport.address-family: inet
nfs.disable: on

猜你喜欢

转载自blog.csdn.net/weixin_47320286/article/details/109323856