• GFS分布式文件系统


    GFS概述

    1.GFS简介

    GFS(GlusterFS):是一个开源的分布式文件系统。

    传统的分布式文件系统大多通过元服务器来存储元数据,元服务器保存存储节点的目录树信息、存储服务器、客户端、网络(NFS/samba组成网关,实现各个节点之间的通信)等。
    一旦元数据服务器出现故障,即使节点具备再高的冗余性,整个存储系统也将崩溃。

    GlusterFS分布式文件系统现已取消了元服务器机制,数据横向扩展能力更强,可靠性更强,存储效率也更高。

    2.GFS特点

    1、扩展性更强,性能高。
    2、高可用,可以自动对文件进行复制。多次复制,确保数据总是可以访问,哪怕硬件故障也能正常访问。
    3、全局统一的命名空间,所有节点都在一个分支的管理之下,客户端访问分支节点即可。
    4、弹性卷管理,类似LVM。不同硬盘上的不同分区,组成一个逻辑上的硬盘。
    不同服务器上的不同硬盘分区,组成一个卷,可以动态地扩容。
    5、基于标准协议,GFS存储服务支持,NFS、FTP、HTTP以及自身的GFS协议都可以支持,应用程序可以直接使用数据,不需要做任何修改。

    3.GFS术语

    1、Brick(存储块,是其存储单位)
    存储服务器提供的用于物理存储的专用分区,GFS当中的基本存储单元,也是对外提供的存储目录。是由服务器和存储目录的绝对路径组成。
    存储目录格式:server:dir
    例:20.0.0.10:/opt/gfs        或者使用主机名:node1:/opt/gfs
    2、Volume(逻辑卷)
    一个逻辑卷就是一组Brick的集合。
    类似于LVM中的逻辑卷。大部分Gluster管理操作是在卷上进行的。
    3、FUSE
    GFS的内核模块,允许用户创建自己的文件系统。
    4、VFS
    内核空间对用户提供的访问磁盘的接口,是虚拟端口。
    5、Glusterd(后台管理进程),服务端
    服务端在每个存储节点上都要运行。

    4.GFS的卷类型

    1、分布式卷
    GFS的默认卷类型。
    文件通过HASH算法分布到所有Brick Server上,是GFS的默认卷;属于文件级的RAID0,不具有容错能力。
    在分布式卷模式下,没有对文件进行分块,文件直接存储在某个Server的节点上,存取效率也没有提高,直接使用本地文件系统进行存储。

    2、条带卷
    类似RAID0。

    3、复制卷(镜像化)
    复制卷将文件的每个数据块复制到多个物理节点上,以提供冗余和容错能力。
    将文件同步到多个Brick上,使其具备多个文件副本,属于文件级RAID 1,具有容错能力。
    因为数据分散在多个Brick中,所以读性能得到很大提升,但写性能下降。
    复制卷具备冗余性,即使一个节点损坏,也不影响数据的正常使用。但因为要保存副本,所以磁盘利用率较低。

    4、分布式复制卷
    分布式复制卷将文件的复制块分散在多个物理节点上,并在不同的节点之间进行复制。这种方式可以提高复制效率和容错能力。
    两两复制,文件会在组内同步。不同的组之间数据未必同步。

    部署GFS群集

    1. 实验架构:
    2. node120.0.0.10
    3. 磁盘:
    4. /dev/sdb1 /data/sdb1
    5. /dev/sdc1 /data/sdc1
    6. /dev/sdd1 /data/sdd1
    7. node220.0.0.20
    8. 磁盘:
    9. /dev/sdb1 /data/sdb1
    10. /dev/sdc1 /data/sdc1
    11. /dev/sdd1 /data/sdd1
    12. node320.0.0.30
    13. 磁盘:
    14. /dev/sdb1 /data/sdb1
    15. /dev/sdc1 /data/sdc1
    16. /dev/sdd1 /data/sdd1
    17. node420.0.0.40
    18. 磁盘:
    19. /dev/sdb1 /data/sdb1
    20. /dev/sdc1 /data/sdc1
    21. /dev/sdd1 /data/sdd1
    22. 客户端:20.0.0.61

    准备环境

     1.关闭防火墙

    1. systemctl stop firewalld
    2. setenforce 0

     2.磁盘分区并挂载

    1. #所有节点操作
    2. 虚拟机添加三个硬盘
    3. alias scan='echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- - -" > /sys/class/scsi_host/host1/scan;echo "- - -" > /sys/class/scsi_host/host2/scan'
    4. scan
    5. lsblk
    6. #查看磁盘添加情况
    7. cd /opt
    8. vim fdisk.sh
    9. --
    10. #!/bin/bash
    11. NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
    12. for VAR in $NEWDEV
    13. do
    14. echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
    15. mkfs.xfs /dev/${VAR}"1" &> /dev/null
    16. mkdir -p /data/${VAR}"1" &> /dev/null
    17. echo "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab
    18. done
    19. mount -a &> /dev/null
    20. --
    21. chmod +x /opt/fdisk.sh
    22. ./fdisk.sh
    23. lsblk
    24. #若脚本挂载失败
    25. mkfs.xfs /dev/sdn1
    26. mount -a

    3.修改主机名并做映射

    1. #所有节点修改主机名
    2. #以Node1节点为例:
    3. hostnamectl set-hostname node1
    4. su
    5. #所有节点做映射
    6. echo "20.0.0.10 node1" >> /etc/hosts
    7. echo "20.0.0.20 node2" >> /etc/hosts
    8. echo "20.0.0.30 node3" >> /etc/hosts
    9. echo "20.0.0.40 node4" >> /etc/hosts

    安装、启动GFS

    1. #所有节点操作:
    2. yum -y install centos-release-gluster
    3. cd /etc/yum.repos.d/
    4. mkdir repo.bak
    5. mv *.repo repo.bak
    6. cd repo.bak/
    7. mv CentOS-Gluster-9.repo ..
    8. yum clean all && yum makecache
    9. yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
    10. systemctl start glusterd.service
    11. systemctl enable glusterd.service
    12. systemctl status glusterd.service

    添加节点至存储信任池

    1. #只要在一台Node节点上添加其它节点即可
    2. gluster peer probe node1
    3. gluster peer probe node2
    4. gluster peer probe node3
    5. gluster peer probe node4
    6. #删除节点
    7. gluster peer detach noden
    8. #在每个Node节点上查看群集状态
    9. gluster peer status

    创建卷

    1.创建分布式卷

    1. #创建分布式卷,没有指定类型,默认创建的是分布式卷
    2. gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force
    3. -------------------------------------------------------------------------------------------
    4. gluster volume create: 这个部分表示创建一个新的 GlusterFS 卷。
    5. dis-volume: 这是新卷的名称,你可以根据需要选择一个唯一的名称。
    6. node1:/data/sdb1 node2:/data/sdb1: 这是卷的存储节点列表。在这个例子中,
    7. 卷将在两个节点 (node1 和 node2) 上创建,并使用这两个节点上的 /data/sdb1 目录作为卷的存储。
    8. -------------------------------------------------------------------------------------------
    9. #查看卷列表
    10. gluster volume list
    11. #启动新建分布式卷
    12. gluster volume start dis-volume
    13. #查看创建分布式卷信息
    14. gluster volume info dis-volume

    2.创建复制卷

    1. #指定类型为 replica,数值为 2,且后面跟了2个Brick Server,所以创建的是复制卷
    2. gluster volume create rep-volume replica 2 node2:/data/sdc1 node3:/data/sdc1 force
    3. gluster volume start rep-volume
    4. gluster volume info rep-volume
    5. -------------------------------------------------------------------------------------------
    6. replica 2: 这表示卷将使用两个副本。在 GlusterFS 中,副本表示数据将在多个节点之间复制,
    7. 以提高可靠性和容错性。在这个例子中,每个文件将在两个节点之间进行复制。
    8. -------------------------------------------------------------------------------------------

    3.创建分布式复制卷

    1. #指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式复制卷
    2. gluster volume create dis-rep replica 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
    3. gluster volume start dis-rep
    4. gluster volume info dis-rep
    5. -------------------------------------------------------------------------------------------
    6. 在 GlusterFS 中,指定 replica 2 意味着每个数据块将被复制到两个不同的节点。
    7. 在你的命令中,你指定了四个存储节点 node1, node2, node3, 和 node4
    8. 这意味着 GlusterFS 会在这四个节点中的两两之间进行复制。
    9. 具体来说,对于一个有 replica 2 的卷,如果你有四个存储节点,
    10. 那么每个文件的两个副本将被分布在其中两个节点上。例如:
    11. 文件的第一个副本可能存储在 node1 和 node2
    12. 文件的第二个副本可能存储在 node3 和 node4
    13. 这样,每个存储节点都有一些数据的副本,实现了冗余和容错性。
    14. 请注意,replica 的数量应该小于或等于存储节点的数量。
    15. 在你的命令中,replica 2 是合理的,因为你有四个存储节点。
    16. 如果指定的 replica 数量大于存储节点的数量,GlusterFS 将无法创建卷。
    17. -------------------------------------------------------------------------------------------
    18. #查看当前所有卷的列表
    19. gluster volume list

    部署GFS客户端

    1.安装客户端软件

    1. #所有节点操作:
    2. yum -y install centos-release-gluster
    3. cd /etc/yum.repos.d/
    4. mkdir repo.bak
    5. mv *.repo repo.bak
    6. cd repo.bak/
    7. mv CentOS-Gluster-9.repo ..
    8. yum clean all && yum makecache
    9. yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
    10. systemctl start glusterd.service
    11. systemctl enable glusterd.service
    12. systemctl status glusterd.service

    2.创建挂载目录

    1. mkdir -p /test/{dis,rep,dis_rep}
    2. ls /test

    3.映射节点

    1. echo "20.0.0.10 node1" >> /etc/hosts
    2. echo "20.0.0.20 node2" >> /etc/hosts
    3. echo "20.0.0.30 node3" >> /etc/hosts
    4. echo "20.0.0.40 node4" >> /etc/hosts

    4.挂载GFS文件系统

    1. #临时挂载
    2. mount.glusterfs node1:dis-volume /test/dis
    3. #挂载分布式卷
    4. mount.glusterfs node1:rep-volume /test/rep
    5. #挂载复制卷
    6. mount.glusterfs node1:dis-rep /test/dis_rep
    7. #挂载分布式复制卷
    8. df -h
    9. #永久挂载
    10. vim /etc/fstab
    11. node1:dis-volume /test/dis glusterfs defaults,_netdev 0 0
    12. node1:rep-volume /test/rep glusterfs defaults,_netdev 0 0
    13. node1:dis-rep /test/dis_rep glusterfs defaults,_netdev 0 0

    测试GFS文件系统

    1.客户端向卷中写入文件

    1. cd /opt
    2. dd if=/dev/zero of=/opt/demo1.log bs=1M count=40
    3. dd if=/dev/zero of=/opt/demo2.log bs=1M count=40
    4. dd if=/dev/zero of=/opt/demo3.log bs=1M count=40
    5. dd if=/dev/zero of=/opt/demo4.log bs=1M count=40
    6. dd if=/dev/zero of=/opt/demo5.log bs=1M count=40
    7. ll
    8. cp /opt/demo* /test/dis
    9. cp /opt/demo* /test/rep
    10. cp /opt/demo* /test/dis_rep

    2.查看文件分布

    查看分布式卷文件分布

    1. [root@node1 ~]# ls -lh /data/sdb1
    2. [root@node2 ~]# ll -h /data/sdb1

    查看复制卷分布

    1. [root@node2 ~]# ll -h /data/sdc1
    2. [root@node3 ~]# ll -h /data/sdc1

    查看分布式复制卷分布

    1. [root@node1 ~]# ll -h /data/sdd1
    2. [root@node2 ~]# ll -h /data/sdd1
    3. [root@node3 ~]# ll -h /data/sdd1
    4. [root@node4 ~]# ll -h /data/sdd1

    分布式复制卷破坏性测试

    1.破坏相同组的两个节点(node3、node4)

    只关闭节点服务

    1. #node3、node4关闭服务
    2. [root@node3 sdd1]# systemctl stop glusterd
    3. [root@node4 sdd1]# systemctl stop glusterd
    4. #客户端写入:
    5. [root@nginx1 dis_rep]# touch {1..5}.txt

    只挂起节点虚拟机服务

    1. #重启node3、node4服务
    2. [root@node3 sdd1]# systemctl restart glusterd
    3. [root@node4 sdd1]# systemctl restart glusterd
    4. #挂起node3、node4虚拟机

    1. #客户端删除原数据并写入
    2. [root@nginx1 dis_rep]# rm -rf *
    3. [root@nginx1 dis_rep]# touch {1..5}.txt
    4. touch: cannot touch ‘1.txt’: Transport endpoint is not connected
    5. touch: cannot touch ‘2.txt’: Transport endpoint is not connected
    6. touch: cannot touch ‘3.txt’: Transport endpoint is not connected
    7. touch: cannot touch ‘5.txt’: Transport endpoint is not connected

    #重新开启node3、node4的虚拟机
    

    2.破坏不同组的两个节点(node2、node3)

    只关闭节点服务

    1. #node3、node4关闭服务
    2. [root@node2 sdd1]# systemctl stop glusterd
    3. [root@node3 sdd1]# systemctl stop glusterd
    4. #客户端删除原数据并写入:
    5. [root@nginx1 dis_rep]# touch {1..5}.txt

    只挂起节点虚拟机服务

    1. #重启node2、node3服务
    2. [root@node3 sdd1]# systemctl restart glusterd
    3. [root@node4 sdd1]# systemctl restart glusterd
    4. #挂起node2、node3虚拟机

    1. #客户端删除原数据并写入
    2. [root@nginx1 dis_rep]# rm -rf *
    3. [root@nginx1 dis_rep]# touch {1..5}.txt

    #重新开启node2、node3的虚拟机
    

  • 相关阅读:
    Android Gradle插件对应的Gradle脚本所需版本
    To_Heart—题解——CF1592F1
    普中51单片机:串口通信原理与应用指南(八)
    Linux下排除死锁详细教程(基于C++11、GDB)
    MySQl-事务日志
    Aws配置钉钉告警实现
    【stm32】stm32MX定时器
    【计算机网络系列】物理层②:信道复用技术(频分复用、时分复用、波分复用及码分复用)
    element表单非必填数据的验证写法(自定义验证规则)
    Bug系列路径规划算法原理介绍(三)——Tangent BUG算法
  • 原文地址:https://blog.csdn.net/pupcarrot/article/details/134462932