• GlusterFS分布式存储


    GlusterFS分布式存储

     
    分类: 存储类

    目录

    glusterfs简介

    glusterfs部署

    glustefs分布式存储优化

    glusterfs在企业中应用场景

    参考文章地址

    一、glusterfs简介

    Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端。是整合了许多存储块(server)通过Infiniband RDMA或者 Tcp/Ip方式互联的一个并行的网络文件系统。

      特征:

    • 容量可以按比例的扩展,且性能却不会因此而降低。
    • 廉价且使用简单,完全抽象在已有的文件系统之上。
    • 扩展和容错设计的比较合理,复杂度较低
    • 适应性强,部署方便,对环境依赖低,使用,调试和维护便利

    二、glusterfs安装部署

    一般在企业中,采用的是分布式复制卷,因为有数据备份,数据相对安全。

     网络要求全部千兆环境,gluster 服务器至少有 2 块网卡,1 块网卡绑定供 gluster 使用,剩余一块分配管理网络 IP,用于系统管理。如果有条件购买万兆交换机,服务器配置万兆网卡,存储性能会更好。网络方面如果安全性要求较高,可以多网卡绑定。

     跨地区机房配置 Gluster,在中国网络格局下不适用。

    • 注意:GlusterFS将其动态生成的配置文件存储在/var/lib/glusterd中。如果在任何时候GlusterFS无法写入这些文件(例如,当后备文件系统已满),它至少会导致您的系统不稳定的行为; 或者更糟糕的是,让您的系统完全脱机。建议为/var/log等目录创建单独的分区,以确保不会发生这种情况。

    1、安装glusterfs前的环境准备 

      1.1、服务规划:

    操作系统 IP 主机名 硬盘数量(三块)
    centos 7.4 10.0.0.101 node1 sdb:5G  sdc:5G  sdd:5G
    centos 7.4 10.0.0.102 node2 sdb:5G  sdc:5G  sdd:5G
    centos 7.4 10.0.0.103 node3 sdb:5G  sdc:5G  sdd:5G
    centos 7.4 10.0.0.104 node4 sdb:5G  sdc:5G  sdd:5G
    centos 7.4 10.0.0.105 node5-client sda:20G

       1.2、首先关闭iptables和selinux,配置hosts文件如下(全部glusterfs主机)

    注:node01~node04所有的主机hosts文件均为此内容;同时全部修改为对应的主机名,centos7修改主机名方式:#hostnamectl set-hostname 主机名 (即为临时和永久生效)
    可以使用#hostnamectl status 查看系统基本信息
    复制代码
    [root@node01 ~]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.0.0.101  node01
    10.0.0.102  node02
    10.0.0.103  node03
    10.0.0.104  node04
    [root@node01 ~]# systemctl stop firewalld.service #停止firewalld
    [root@node01 ~]# systemctl disable firewalld.service #禁止firewalld开机自启
    [root@node01 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config #关闭SELinux
    [root@node01 ~]# setenforce 0
    [root@node01 ~]# getenforce
    Permissive
    [root@node01 ~]# ntpdate time.windows.com #同步时间
    复制代码

       1.3、安装gluterfs源(全部glusterfs主机)

    复制代码
    [root@node01 ~]#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo   #不是必须的
    [root@node01 ~]#yum search  centos-release-gluster #查看有哪些版本的glusterfs源    
    ================================================ N/S matched: centos-release-gluster =================================================
    centos-release-gluster310.noarch : Gluster 3.10 (Long Term Stable) packages from the CentOS Storage SIG repository
    centos-release-gluster312.noarch : Gluster 3.12 (Long Term Stable) packages from the CentOS Storage SIG repository
    centos-release-gluster313.noarch : Gluster 3.13 (Short Term Stable) packages from the CentOS Storage SIG repository
    centos-release-gluster36.noarch : GlusterFS 3.6 packages from the CentOS Storage SIG repository
    centos-release-gluster37.noarch : GlusterFS 3.7 packages from the CentOS Storage SIG repository
    centos-release-gluster38.noarch : GlusterFS 3.8 packages from the CentOS Storage SIG repository
    centos-release-gluster39.noarch : Gluster 3.9 (Short Term Stable) packages from the CentOS Storage SIG repository
    复制代码

         这里我们使用glusterfs的3.12版本的源

    [root@node01 ~]# yum  -y  install centos-release-gluster312.noarch

       1.4、安装glusterfs(全部glusterfs主机)

    在安装glusterfs的时候直接指定源为glusterfs源,由于 源[centos-gluster310-test]的enable为0,所以在指定源的时候用--enablerepo来让源生效

     cat /etc/yum.repos.d/CentOS-Gluster-3.12.repo

        安装glusterfs

    [root@node01 ~]# yum -y --enablerepo=centos-gluster*-test install glusterfs-server glusterfs-cli glusterfs-geo-replication

      1.5、查看glusterfs版本并启动glusterfs服务(全部glusterfs主机)

    复制代码
    [root@node01 ~]# glusterfs -V
    glusterfs 3.12.5

    [root@node01 ~]# systemctl start glusterd.service
    [root@node01 ~]# systemctl enable glusterd.service
    [root@node01 ~]# systemctl status glusterd.service
    [root@node01 ~]# netstat -lntup
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      866/sshd            
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      972/master          
    tcp        0      0 0.0.0.0:24007           0.0.0.0:*               LISTEN      2268/glusterd       
    tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
    tcp6       0      0 :::22                   :::*                    LISTEN      866/sshd            
    tcp6       0      0 ::1:25                  :::*                    LISTEN      972/master          
    udp        0      0 0.0.0.0:111             0.0.0.0:*                           2266/rpcbind        
    udp        0      0 0.0.0.0:745             0.0.0.0:*                           2266/rpcbind        
    udp        0      0 127.0.0.1:323           0.0.0.0:*                           527/chronyd         
    udp6       0      0 :::111                  :::*                                2266/rpcbind        
    udp6       0      0 :::745                  :::*                                2266/rpcbind        
    udp6       0      0 ::1:323                 :::*                                527/chronyd 
    复制代码

       1.6、格式化磁盘(全部glusterfs主机)

      在每台主机上创建几块硬盘,做接下来的分布式存储使用

     注:创建的硬盘要用xfs格式来格式化硬盘,如果用ext4来格式化硬盘的话,对于大于16TB空间格式化就无法实现了。所以这里要用xfs格式化磁盘(centos7默认的文件格式就是xfs),并且xfs的文件格式支持PB级的数据量

     如果是centos6默认是不支持xfs的文件格式,要先安装xfs支持包

    yum install xfsprogs -y

      用fdisk -l 查看磁盘设备,例如查看data-1-1的磁盘设备,这里的sdc、sdd、sde是新加的硬盘

    [root@node01 ~]# fdisk -l
    Disk /dev/sdb: 5368 MB, 5368709120 bytes
    Disk /dev/sdc: 5368 MB, 5368709120 bytes
    Disk /dev/sdd: 5368 MB, 5368709120 bytes

       特别说明:

       如果磁盘大于 2T 的话就用 parted 来分区,这里我们不用分区(可以不分区);
       做分布式文件系统的时候数据盘一般不需要做 RAID,一般系统盘会做 RAID 1;
       如果有raid卡的话,最好用上,raid卡有数据缓存功能,也能提高磁盘的iops,最好的话,用RAID 5;
       如果都不做raid的话,也是没问题的,glusterfs也是可以保证数据的安全的。

    这里使用官方推荐的格盘方式:http://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart/#purpose-of-this-document
    [root@node01 ~]# mkfs.xfs  -i size=512 /dev/sdb
    [root@node01 ~]# mkfs.xfs  -i size=512 /dev/sdc
    [root@node01 ~]# mkfs.xfs  -i size=512 /dev/sdd

      在四台机器上创建挂载块设备的目录,挂载硬盘到目录

    复制代码
    mkdir -p /data/brick{1..3}
    echo '/dev/sdb /data/brick1 xfs defaults 0 0' >> /etc/fstab
    echo '/dev/sdc /data/brick2 xfs defaults 0 0' >> /etc/fstab
    echo '/dev/sdd /data/brick3 xfs defaults 0 0' >> /etc/fstab
    #挂载
    mount -a

    [root@node01 ~]# df -h
    /dev/sdc        5.0G   33M  5.0G   1% /data/brick2
    /dev/sdd        5.0G   33M  5.0G   1% /data/brick3
    /dev/sdb        5.0G   33M  5.0G   1% /data/brick1
    复制代码

    注:再次说明——以上操作均在node01-node04上同时操作

     2、操作

       2.1、将分布式存储主机加入到信任主机池并查看加入的主机状态

     随便在一个开启glusterfs服务的主机上将其他主机加入到一个信任的主机池里,这里选择node01

    [root@node01 ~]# gluster peer probe node02
    peer probe: success. 
    [root@node01 ~]# gluster peer probe node03
    peer probe: success. 
    [root@node01 ~]# gluster peer probe node04
    peer probe: success.

           查看主机池中主机的状态

    复制代码
    [root@node01 ~]# gluster peer status
    Number of Peers: 3      #除本机外,还有三台主机主机池中
    
    Hostname: node02
    Uuid: 6020709d-1b46-4e2c-9cdd-c4b3bba47b4b
    State: Peer in Cluster (Connected)
    
    Hostname: node03
    Uuid: 147ee557-51f1-43fe-a27f-3dae2880b5d4
    State: Peer in Cluster (Connected)
    
    Hostname: node04
    Uuid: f61af299-b00d-489c-9fd9-b4f6a336a6c7
    State: Peer in Cluster (Connected)
    注意:一旦建立了这个池,只有受信任的成员可能会将新的服务器探测到池中。新服务器无法探测池,必须从池中探测。
    复制代码

      2.2、创建glusterfs卷

    GlusterFS 五种卷  

    • Distributed:分布式卷,文件通过 hash 算法随机分布到由 bricks 组成的卷上。
    • Replicated: 复制式卷,类似 RAID 1,replica 数必须等于 volume 中 brick 所包含的存储服务器数,可用性高。
    • Striped: 条带式卷,类似 RAID 0,stripe 数必须等于 volume 中 brick 所包含的存储服务器数,文件被分成数据块,以 Round Robin 的方式存储在 bricks 中,并发粒度是数据块,大文件性能好。
    • Distributed Striped: 分布式的条带卷,volume中 brick 所包含的存储服务器数必须是 stripe 的倍数(>=2倍),兼顾分布式和条带式的功能。
    • Distributed Replicated: 分布式的复制卷,volume 中 brick 所包含的存储服务器数必须是 replica 的倍数(>=2倍),兼顾分布式和复制式的功能。

     分布式复制卷的brick顺序决定了文件分布的位置,一般来说,先是两个brick形成一个复制关系,然后两个复制关系形成分布。

     企业一般用后两种,大部分会用分布式复制(可用容量为 总容量/复制份数),通过网络传输的话最好用万兆交换机,万兆网卡来做。这样就会优化一部分性能。它们的数据都是通过网络来传输的。

     配置分布式卷

    复制代码
    #在信任的主机池中任意一台设备上创建卷都可以,而且创建好后可在任意设备挂载后都可以查看
    [root@node01 ~]# gluster volume create gv1 node01:/data/brick1 node02:/data/brick1 force #创建分布式卷 volume create: gv1: success: please start the volume to access data [root@node01 ~]# gluster volume start gv1 #启动卷gv1 volume start: gv1: success [root@node01 ~]# gluster volume info gv1 #查看gv1的配置信息 Volume Name: gv1 Type: Distribute #分布式卷 Volume ID: 85622964-4b48-47d5-b767-d6c6f1e684cc Status: Started Snapshot Count: 0 Number of Bricks: 2 Transport-type: tcp Bricks: Brick1: node01:/data/brick1 Brick2: node02:/data/brick1 Options Reconfigured: transport.address-family: inet nfs.disable: on [root@node01 ~]# mount -t glusterfs 127.0.0.1:/gv1 /opt #挂载gv1卷 [root@node01 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点/dev/sdc 5.0G 33M 5.0G 1% /data/brick2 /dev/sdd 5.0G 33M 5.0G 1% /data/brick3 /dev/sdb 5.0G 33M 5.0G 1% /data/brick1 127.0.0.1:/gv1 10G 65M 10G 1% /opt #连个设备容量之和 [root@node01 ~]# cd /opt/ [root@node01 opt]# touch {a..f} #创建测试文件 [root@node01 opt]# ll 总用量 0 -rw-r--r--. 1 root root 0 2月 2 23:59 a -rw-r--r--. 1 root root 0 2月 2 23:59 b -rw-r--r--. 1 root root 0 2月 2 23:59 c -rw-r--r--. 1 root root 0 2月 2 23:59 d -rw-r--r--. 1 root root 0 2月 2 23:59 e -rw-r--r--. 1 root root 0 2月 2 23:59 f
    # 在node04也可看到新创建的文件,信任存储池中的每一台主机挂载这个卷后都可以看到
    [root@node04 ~]# mount -t glusterfs 127.0.0.1:/gv1 /opt
    [root@node04 ~]# ll /opt/
    总用量 0
    -rw-r--r--. 1 root root 0 2月   2 2018 a
    -rw-r--r--. 1 root root 0 2月   2 2018 b
    -rw-r--r--. 1 root root 0 2月   2 2018 c
    -rw-r--r--. 1 root root 0 2月   2 2018 d
    -rw-r--r--. 1 root root 0 2月   2 2018 e
    -rw-r--r--. 1 root root 0 2月   2 2018 f
    [root@node01 opt]# ll /data/brick1/
    总用量 0
    -rw-r--r--. 2 root root 0 2月   2 23:59 a
    -rw-r--r--. 2 root root 0 2月   2 23:59 b
    -rw-r--r--. 2 root root 0 2月   2 23:59 c
    -rw-r--r--. 2 root root 0 2月   2 23:59 e
    [root@node02 ~]# ll /data/brick1
    总用量 0
    -rw-r--r--. 2 root root 0 2月   2 23:59 d
    -rw-r--r--. 2 root root 0 2月   2 23:59 f
    #文件实际存在位置node01和node02上的/data/brick1目录下,通过hash分别存到node01和node02上的分布式磁盘上
    复制代码

    配置复制卷

    复制代码
    注:复制模式,既AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中。
    这条命令的意思是使用Replicated的方式,建立一个名为gv2的卷(Volume),存储块(Brick)2个,分别为node01:/data/brick2和node02:/data/brick2;
    fore为强制创建:因为复制卷在双方主机通信有故障再恢复通信时容易发生脑裂。本次为实验环境,生产环境不建议使用。

    [root@node01 ~]# gluster volume create gv2 replica 2 node01:/data/brick2 node02:/data/brick2 force volume create: gv2: success: please start the volume to access data [root@node01 ~]# gluster volume start gv2 #启动gv2卷 volume start: gv2: success [root@node01 ~]# gluster volume info gv2 #查看gv2信息 Volume Name: gv2 Type: Replicate #复制卷 Volume ID: 9f33bd9a-7096-4749-8d91-1e6de3b50053 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport-type: tcp Bricks: Brick1: node01:/data/brick2 Brick2: node02:/data/brick2 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off
    [root@node01 ~]# mount -t glusterfs 127.0.0.1:/gv2 /mnt
    [root@node01 ~]# df -h
    文件系统        容量  已用  可用 已用% 挂载点
    /dev/sdc        5.0G   33M  5.0G    1% /data/brick2
    /dev/sdd        5.0G   33M  5.0G    1% /data/brick3
    /dev/sdb        5.0G   33M  5.0G    1% /data/brick1
    127.0.0.1:/gv1   10G   65M   10G    1% /opt
    127.0.0.1:/gv2  5.0G   33M  5.0G    1% /mnt #容量是总容量的一半
    [root@node01 ~]# cd /mnt/
    [root@node01 mnt]# touch {1..6}
    [root@node01 mnt]# ll /data/brick2
    总用量 0
    -rw-r--r--. 2 root root 0 2月   3 01:06 1
    -rw-r--r--. 2 root root 0 2月   3 01:06 2
    -rw-r--r--. 2 root root 0 2月   3 01:06 3
    -rw-r--r--. 2 root root 0 2月   3 01:06 4
    -rw-r--r--. 2 root root 0 2月   3 01:06 5
    -rw-r--r--. 2 root root 0 2月   3 01:06 6
    [root@node02 ~]# ll /data/brick2
    总用量 0
    -rw-r--r--. 2 root root 0 2月   3 01:06 1
    -rw-r--r--. 2 root root 0 2月   3 01:06 2
    -rw-r--r--. 2 root root 0 2月   3 01:06 3
    -rw-r--r--. 2 root root 0 2月   3 01:06 4
    -rw-r--r--. 2 root root 0 2月   3 01:06 5
    -rw-r--r--. 2 root root 0 2月   3 01:06 6
    #创建文件的实际存在位置为node01和node02上的/data/brick2目录下,因为是复制卷,这两个目录下的内容是完全一致的。
    复制代码

    配置条带卷

    
    
    复制代码
    [root@node01 ~]# gluster volume create gv3 stripe 2 node01:/data/brick3 node02:/data/brick3 force
    volume create: gv3: success: please start the volume to access data
    [root@node01 ~]# gluster volume start gv3
    volume start: gv3: success
    [root@node01 ~]# gluster volume info gv3
     
    Volume Name: gv3
    Type: Stripe
    Volume ID: 54c16832-6bdf-42e2-81a9-6b8d7b547c1a
    Status: Started
    Snapshot Count: 0
    Number of Bricks: 1 x 2 = 2
    Transport-type: tcp
    Bricks:
    Brick1: node01:/data/brick3
    Brick2: node02:/data/brick3
    Options Reconfigured:
    transport.address-family: inet
    nfs.disable: on
    [root@node01 ~]# mkdir /data01
    [root@node01 ~]# mount -t glusterfs 127.0.0.1:/gv3 /data01
    [root@node01 ~]# df -h
    文件系统        容量  已用  可用 已用% 挂载点
    127.0.0.1:/gv3   10G   65M   10G    1% /data01
    [root@node01 ~]# dd if=/dev/zero bs=1024 count=10000 of=/data01/10M.file
    [root@node01 ~]# dd if=/dev/zero bs=1024 count=20000 of=/data01/20M.file
    [root@node01 ~]# ll /data01/ -h
    总用量 30M
    -rw-r--r--. 1 root root 9.8M 2月   3 02:03 10M.file
    -rw-r--r--. 1 root root  20M 2月   3 02:04 20M.file
    *************************************************************************************
    #文件的实际存放位置:
    [root@node01 ~]# ll -h /data/brick3
    总用量 15M
    -rw-r--r--. 2 root root 4.9M 2月   3 02:03 10M.file
    -rw-r--r--. 2 root root 9.8M 2月   3 02:03 20M.file
    [root@node02 ~]# ll -h /data/brick3
    总用量 15M
    -rw-r--r--. 2 root root 4.9M 2月   3 02:03 10M.file
    -rw-r--r--. 2 root root 9.8M 2月   3 02:04 20M.file
    # 上面可以看到 10M 20M 的文件分别分成了 2 块(这是条带的特点),写入的时候是循环地一点一点在node01和node02的磁盘上.

    #上面配置的条带卷在生产环境是很少使用的,因为它会将文件破坏,比如一个图片,它会将图片一份一份地分别存到条带卷中的brick上。
    复制代码
    
    

     配置分布式复制卷

    最少需要4台服务器才能创建,[生产场景推荐使用此种方式]

    复制代码
    #将原有的复制卷gv2进行扩容,使其成为分布式复制卷;
    #要扩容前需停掉gv2
      [root@node01 ~]# gluster volume stop gv2
    [root@node01 ~]# gluster volume add-brick gv2 replica 2 node03:/data/brick1 node04:/data/brick1 force  #添加brick到gv2中
    volume add-brick: success
    [root@node01 ~]# gluster volume start gv2
    volume start: gv2: success
    [root@node01 ~]# gluster volume info gv2
     
    Volume Name: gv2
    Type: Distributed-Replicate    # 这里显示是分布式复制卷,是在 gv2 复制卷的基础上增加 2 块 brick 形成的
    Volume ID: 9f33bd9a-7096-4749-8d91-1e6de3b50053
    Status: Started
    Snapshot Count: 0
    Number of Bricks: 2 x 2 = 4
    Transport-type: tcp
    Bricks:
    Brick1: node01:/data/brick2
    Brick2: node02:/data/brick2
    Brick3: node03:/data/brick1
    Brick4: node04:/data/brick1
    Options Reconfigured:
    transport.address-family: inet
    nfs.disable: on
    performance.client-io-threads: off

    注意:当你给分布式复制卷和分布式条带卷增加 bricks 时,你增加的 bricks 数目必须是复制或条带数目的倍数,
    例如:你给一个分布式复制卷的 replica 为 2,你在增加 bricks 的时候数量必须为2、4、6、8等。
    扩容后进行测试,发现文件都分布在扩容前的卷中。
    复制代码

    配置分布式条带卷
    复制代码
    #将原有的复制卷gv3进行扩容,使其成为分布式条带卷
    #要扩容前需停掉gv3
    [root@node01 ~]# gluster volume stop gv3 [root@node01 ~]# gluster volume add-brick gv3 stripe 2 node03:/data/brick2 node04:/data/brick2 force #添加brick到gv3中 [root@node01 ~]# gluster volume start gv3 volume start: gv3: success [root@node01 ~]# gluster volume info gv3 Volume Name: gv3 Type: Distributed-Stripe # 这里显示是分布式条带卷,是在 gv3 条带卷的基础上增加 2 块 brick 形成的 Volume ID: 54c16832-6bdf-42e2-81a9-6b8d7b547c1a Status: Started Snapshot Count: 0 Number of Bricks: 2 x 2 = 4 Transport-type: tcp Bricks: Brick1: node01:/data/brick3 Brick2: node02:/data/brick3 Brick3: node03:/data/brick2 Brick4: node04:/data/brick2 Options Reconfigured: transport.address-family: inet nfs.disable: on
  • 相关阅读:
    一名3年工作经验的程序员面试分享应该具备的技能
    [activiti] Activiti 5.18 的Mybatis版本依赖问题
    [java] JVM监控与调优
    [mysql] mysqldump 导出数据库表
    【extjs】 extjs5 Ext.grid.Panel 搜索示例
    [tomcat] tomcat+nginx 负载均衡配置
    [mysql] mysql explain 使用
    Oracle自用脚本(持续更新)
    Mysql 简单问题汇总(持续更新)
    开源项目导入eclipse的一般步骤
  • 原文地址:https://www.cnblogs.com/xiexun/p/14550073.html
Copyright © 2020-2023  润新知