GlusterFS分布式存储系统

一,分布式文件系统理论基础

 

1.1 分布式文件系统出现

计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量的方式,已经不能满足目前的需求。

分布式文件系统可以有效解决数据的存储和管理难题,将固定于某个地点的某个文件系统,扩展到任意多个地点/多个文件系统,众多的节点组成一个文件系统网络。每个节点可以分布在不同的地点,通过网络进行节点间的通信和数据传输。人们在使用分布式文件系统时,无需关心数据是存储在哪个节点上,或者是从哪个节点从获取的,只需要像使用本地文件系统一样管理和存储文件系统中的数据。

 

1.2 典型代表NFS

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS的优点如下:

 

(1)节约使用的磁盘空间

客户端经常使用的数据可以集中存放在一台机器上,并使用NFS发布,那么网络内部所有计算机可以通过网络访问,不必单独存储。

 

(2)节约硬件资源

NFS还可以共享软驱,CDROM和ZIP等的存储设备,减少整个网络上的可移动设备的数量。

 

(3)用户主目录设定

对于特殊用户,如管理员等,为了管理的需要,可能会经常登陆到网络中所有的计算机,若每个客户端,均保存这个用户的主目录很繁琐,而且不能保证数据的一致性。实际上,经过NFS服务的设定,然后在客户端指定这个用户的主目录位置,并自动挂载,就可以在任何计算机上使用用户主目录的文件。

 

1.3 面临的问题

存储空间不足,需要更大容量的存储 
直接用NFS挂载存储,有一定风险,存在单点故障 
某些场景不能满足需求,大量的访问磁盘IO是瓶颈

 

1.4 GlusterFS概述

GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。

GlusterFS支持运行在任何标准IP网络上标准应用程序的标准客户端,用户可以在全局统一的命令空间中使用NFS/CIFS等标准协议来访问应用程序。GlusterFS使得用户可摆脱原有的独立,高成本的封闭存储系统,能够利用普通廉价的存储设备来部署可集中管理,横向扩展,虚拟化的存储池,存储容量可扩展至TB/PB级。

目前glusterfs已被redhat收购,它的官方网站是:http://www.gluster.org/

超高性能(64个节点时吞吐量也就是带宽甚至达到32GB/s)

image_1ctf2od6k1thm6r91q97n9v19.png-322.2kB

 

1.5 GlusterFS企业主要应用场景

image_1ctf2ontqcea5sg13ci3d58ep1m.png-328.5kB


image_1ctf2p17p1ogr1m5mpml1rsifrk23.png-307kB

理论和实践上分析,GlusterFS目前主要适用大文件存储场景,对于小文件尤其是海量小文件(小于1M),存储效率和访问性能都表现不佳。海量小文件LOSF问题是工业界和学术界公认的难题,GlusterFS作为通用的分布式文件系统,并没有对小文件作额外的优化措施(小于1M),性能不好也是可以理解的。

  • Media 
    文档,图片,音频,视频

  • Shared storage 
    云存储,虚拟化存储,HPC(高性能计算)

  • Big data 
    日志文件,RFID(射频识别)数据

 

二,部署安装

 

GlusterFS所有包

链接:https://pan.baidu.com/s/1EYmg29G8v-98kCbcHj8DYQ 
提取码:t6cn

 

2.1 GlusterFS安装前的准备(四台都需要)

  1. 电脑一台,内存>=4G,可用磁盘空间大于50G
  2. 安装VMWARE Workstation虚拟机软件
  3. 安装好四台CentOS-6-x86_64(6.2-6.8都可以)的虚拟机
  4. 基本系统:1核CPU+1024M内存+10G硬盘
  5. 网络选择:网络地址转换(NAT)
  6. 关闭iptables和SELinux
  7. 预装glusterfs软件包
描述IP主机名需求
GlusterFS01 192.168.200.69 GlusterFS01 多添加两块各10G的sdb和sdc
GlusterFS02 192.168.200.92 GlusterFS02 多添加两块各10G的sdb和sdc
GlusterFS03 192.168.200.93 GlusterFS03 多添加两块各10G的sdb和sdc
GlusterFS04 192.168.200.94 GlusterFS04 多添加两块各10G的sdb和sdc
WebClient 192.168.200.95 WebClient 多添加两块各10G的sdb和sdc
 

为了实验的准确性,请尽量和我用一个版本的Linux操作系统(四台都需要)

并用上文下载链接里给的rpm包作为yum源

cat /etc/redhat-release

uname -r

pwd

ls

 
  1. dbench-4.0-12.el6.x86_64.rpm libaio-0.3.107-10.el6.x86_64.rpm
  2. glusterfs-3.7.20-1.el6.x86_64.rpm libevent-1.4.13-4.el6.x86_64.rpm
  3. glusterfs-api-3.7.20-1.el6.x86_64.rpm libgssglue-0.1-11.el6.x86_64.rpm
  4. glusterfs-api-devel-3.7.20-1.el6.x86_64.rpm libntirpc-1.3.1-1.el6.x86_64.rpm
  5. glusterfs-cli-3.7.20-1.el6.x86_64.rpm libntirpc-devel-1.3.1-1.el6.x86_64.rpm
  6. glusterfs-client-xlators-3.7.20-1.el6.x86_64.rpm libtirpc-0.2.1-13.el6_9.x86_64.rpm
  7. glusterfs-coreutils-0.0.1-0.1.git0c86f7f.el6.x86_64.rpm nfs-utils-1.2.3-75.el6_9.x86_64.rpm
  8. glusterfs-coreutils-0.2.0-1.el6_37.x86_64.rpm nfs-utils-lib-1.1.5-13.el6.x86_64.rpm
  9. glusterfs-devel-3.7.20-1.el6.x86_64.rpm python-argparse-1.2.1-2.1.el6.noarch.rpm
  10. glusterfs-extra-xlators-3.7.20-1.el6.x86_64.rpm python-gluster-3.7.20-1.el6.noarch.rpm
  11. glusterfs-fuse-3.7.20-1.el6.x86_64.rpm pyxattr-0.5.0-1.el6.x86_64.rpm
  12. glusterfs-ganesha-3.7.20-1.el6.x86_64.rpm repodata
  13. glusterfs-geo-replication-3.7.20-1.el6.x86_64.rpm rpcbind-0.2.0-13.el6_9.1.x86_64.rpm
  14. glusterfs-libs-3.7.20-1.el6.x86_64.rpm rsync-3.0.6-12.el6.x86_64.rpm
  15. glusterfs-rdma-3.7.20-1.el6.x86_64.rpm userspace-rcu-0.7.16-2.el6.x86_64.rpm
  16. glusterfs-resource-agents-3.7.20-1.el6.noarch.rpm userspace-rcu-0.7.7-1.el6.x86_64.rpm
  17. glusterfs-server-3.7.20-1.el6.x86_64.rpm userspace-rcu-devel-0.7.16-2.el6.x86_64.rpm
  18. keyutils-1.4-5.el6.x86_64.rpm userspace-rcu-devel-0.7.7-1.el6.x86_64.rpm
  19. keyutils-libs-1.4-5.el6.x86_64.rpm

image_1cv4iojp81dh4gn4bj1tj3eu49.png-114.1kB

 

2.2 GlusterFS 安装

 

2.2.1 修改主机名

 

2.2.2 添加hosts文件实现集群主机之间相互能够解析(四台都需要)

vim /etc/hosts

 
  1. 192.168.200.69 glusterfs01
  2. 192.168.200.92 glusterfs02
  3. 192.168.200.93 glusterfs03
  4. 192.168.200.94 glusterfs04

cat /etc/hosts

scp /etc/hosts 192.168.200.92:/etc/

scp /etc/hosts 192.168.200.93:/etc/

scp /etc/hosts 192.168.200.94:/etc/

image_1cv4ird8ombi1inre721er1nu2m.png-72.5kB

 

2.2.3 关闭selinux和防火墙(四台都需要)

service iptables stop

setenforce 0

image_1cv4irvo11q36ghe12h11e6g1dee13.png-13.3kB

 

2.2.4 利用教程附带的rpm软件包组,充当本地定制化yum源(四台都需要)

cd /etc/yum.repos.d

vim /etc/yum.repos.d/CentOS-Media.repo

tail -15 CentOS-Media.repo

 
  1. [c6-media]
  2. name=CentOS-$releasever - Media
  3. baseurl=file:///media/CentOS/
  4. file:///media/cdrom/
  5. file:///media/cdrecorder/
  6. gpgcheck=1
  7. enabled=0
  8. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
  9. [rpm]
  10. name=rpm
  11. baseurl=file:///root/rpm
  12. gpgcheck=0
  13. enabled=1

yum -y install glusterfs-server glusterfs-cli glusterfs-geo-replication 
如果安装时候有冲突,把冲突的软件包卸载了就可以 
rpm -qa | grep 冲突的软件包 
rpm -e 冲突的软件包 --nodeps

which glusterfs

image_1cv4jg2m01sln1cos1o6d7eahl51g.png-103.5kB


image_1cv4jhv4b1d2a1oq712k9er5ic31t.png-129.4kB

 

2.3 配置glusterfs

 

2.3.1 查看glusterfs版本信息

which glusterfs

glusterfs -V

image_1cv4jmh8b9qo9hjplt1ndn1caj2a.png-42kB

 

2.3.2 启动服务(四台都需要)

/etc/init.d/glusterd status --->查看服务状态

/etc/init.d/glusterd start --->启动

/etc/init.d/glusterd status

chkconfig glusterd on --->添加开机启动

chkconfig glusterd --list

image_1cv4jvmdha565h51b8l8otd0k2n.png-33.8kB

 

2.3.3 存储主机加入信任存储池

虚拟机添加信任存储池 
特别提示:只需要让一个虚拟机进行添加操作即可。但自己并不需要添加信任自己

确保所有的虚拟机的glusterd服务都处于开启状态,然后执行如下操作

gluster peer probe glusterfs02

gluster peer probe glusterfs03

gluster peer probe glusterfs04

image_1cv4kf1am1da41j5l1r0h150cr4834.png-21kB

 

2.3.4 查看虚拟机信任状态添加结果

gluster peer status

可以查看每台虚拟机的信任状态,他们此时彼此都应该已经互有信任记录了

image_1cv4kgbj01b201dk1mlrpip133b3h.png-36.8kB


image_1cv4kii9m106k18cl15f4cmq17n83u.png-36.9kB


image_1cv4kiulm15b01rkh15uktlp2dh4r.png-37.5kB


image_1cv4kj79h1i313p3ihb19531amu58.png-37kB

 

2.3.5 配置前的准备工作

 

xfsprogs格式化(工作中也许会用到)

链接光盘源,安装xfs支持包(Centos7已经不再需要安装) 
所有都要装

yum -y install xfsprogs

在企业里我们还需要分区然后才能进行格式化。但是我们这里就省略了,我们直接格式化每台虚拟机的那块10G硬盘

 

ext4格式化sdb(四台都需要)

ll /dev/sd*

mkfs.ext4 /dev/sdb

image_1cv4l5lb31roo193r1loe1bthpd55l.png-97.3kB

 

建立挂在块设备的目录并把sdb磁盘挂载到此目录上

在四台机器上执行mkdir -p /gluster/brick1 建立挂在块设备的目录 
挂载磁盘到文件系统(4台都做,步骤相同)

mkdir -p /gluster/brick1

mount /dev/sdb /gluster/brick1

df -h

image_1cv4lg8c01qb5n5fcum1orj10gp62.png-37.1kB

 

ext4格式化sdc(四台都需要)

ll /dev/sd*

mkfs.ext4 /dev/sdc

image_1cv4litdibt91m4funs1uur10is6f.png-97.4kB

 

建立挂在块设备的目录并把sdc磁盘挂载到此目录上

在四台机器上执行mkdir -p /gluster/brick2 建立挂在块设备的目录 
挂载磁盘到文件系统(4台都做,步骤相同)

mkdir -p /gluster/brick2

mount /dev/sdc /gluster/brick2

df -h

image_1cv4lmnaf12qm1ltorei7g31lc06s.png-40.9kB

 

4台虚拟机加入开机自动挂载

echo "mount /dev/sdb /gluster/brick1" >> /etc/rc.local

echo "mount /dev/sdc /gluster/brick2" >> /etc/rc.local

tail -2 /etc/rc.local

image_1cv4m14cls4q16tm1ipd34q1fgh79.png-28.7kB

 

2.3.6 创建volume分布式卷

  • 基本卷: 
    • 分布式卷(Distributed): --->相当于raid0读写速度
    • 复制卷(Replicated): --->相当于raid1
    • 条带式卷(Striped): --->针对大文件才会用
  • 复合卷: --->通常工作中都是用复合卷 
    • 分布式复制卷(Distributed Replicated): --->相当于raid1+0
    • 分布式条带卷(Distributed Striped): --->大文件
    • 复制条带卷(Replicated Striped):
    • 分布式复制条带卷(Distributed Replicated Striped): --->三种方式总和
 

创建分布式卷(在glusterfs01上操作)

gluster volume create gs1 glusterfs01:/gluster/brick1 glusterfs02:/gluster/brick1 force

image_1cv4n7hob1prvg411h2ltkklc7m.png-16.1kB

 

启动创建的卷(在glusterfs01上操作)

gluster volume start gs1

image_1cv4n8u2dpsvnud16o5mne15qn93.png-12kB

 

然后我们发现4台虚拟机都能看到如下信息(在任意虚拟机上操作)

gluster volume info

 
  1. Volume Name: gs1 #卷名
  2. Type: Distribute #分布式
  3. Volume ID: 0f0adf7a-3b8f-4016-ac72-83f633e90fac #ID号
  4. Status: Started #启动状态
  5. Number of Bricks: 2 #一共两个块设备
  6. Transport-type: tcp #tcp的连接方式
  7. Bricks: #块信息
  8. Brick1: glusterfs01:/gluster/brick1
  9. Brick2: glusterfs02:/gluster/brick1
  10. Options Reconfigured:
  11. performance.readdir-ahead: on

image_1cv4n9bu2cn91vl68u31teook9g.png-32.9kB

 

2.3.7 volume的两种挂载方式

 

(1)以glusterfs方式挂载

 

挂载卷到/mnt目录下并查看(在glusterfs01上操作)

mount -t glusterfs 127.0.0.1:/gs1 /mnt 
-t参数是指定挂载类型

挂载成功后,我们看到磁盘空间已经整合

image_1cv4nareesq818v5s4a12mh1qm39t.png-40.2kB

 

在挂载好的/mnt目录里创建实验文件(在glusterfs01上操作)

touch /mnt/{1..5}

ls /mnt

image_1cv4nc63u15cgbaa1mnhj3h1um9aa.png-15.6kB

 

在其他虚拟机上挂载分布式卷gs1,查看同步挂载结果

mount -t glusterfs 127.0.0.1:/gs1 /mnt

ls /mnt

image_1cv4nd1tbog1kf9br31a29166lan.png-17.5kB

 

在glusterfs01和02上查询实验文件结果

ls /gluster/brick1

image_1cv4nea6t9ugcdffh69fv7lbb4.png-41.9kB


image_1cv4nenls877pfnope151u22rbh.png-41.1kB

 

(2)以NFS方式进行挂载

在挂载之前我们先来看一下如何打开glusterfs的NFS挂载方式

 

在glusterfs01上执行如下操作

gluster volume status --->查看分布式卷的状态

image_1cv4ni03q2rj13kk1flt46t1obfbu.png-42.1kB

以上结果是是什么原因呢?

如果NFS Server的挂载端口显示N/A表示未开启挂载功能,这是由于要先进行nfs挂载是需要装两个nfs的软件包的rpcbind和nfs-utils

当然就算系统装了这两个软件包,那么我们也需要开启rpcbind服务,然后在重启glusterfs服务才能够进行nfs挂载的操作。

 

开启glusterfs01的nfs挂载功能

rpm -qa nfs-utils rpcbind #查看是否安装nfs-utils rpcbind

/etc/init.d/rpcbind status #查看rpcbind服务状态

/etc/init.d/rpcbind start #开启rpcbind服务

/etc/init.d/glusterd stop #停止glusterd服务

/etc/init.d/glusterd start #开启glusterd服务

gluster volume status #这里需要等几秒再查看,就会发现nfs挂载方式开启了

image_1cv4oso5v1jgfadca4pkplifhcb.png-76.6kB

 

在WebServer服务器上进行nfs方式的挂载

rpm -qa nfs-utils #查看nfs-utils是否安装

yum -y install nfs-utils

mount -t nfs 192.168.200.69:/gs1 /mnt #以nfs方式远程挂载分布式卷

 
  1. mount.nfs: rpc.statd is not running but is required for remote locking.
  2. mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
  3. mount.nfs: an incorrect mount option was specified #根据提示我们加上-o nolock参数

mount -o nolock -t nfs 192.168.200.69:/gs1 /mnt

ls /mnt #挂载成功

df -hT

image_1cv4p23c21q4n1bn11qla1hsm1o3co.png-145.1kB

 

2.3.8 创建分布式复制卷

 

在任意一台gluster虚拟机上进行如下操作

gluster volume create gs2 replica 2 glusterfs03:/gluster/brick1 glusterfs04:/gluster/brick1 force

gluster volume start gs2 #启动卷

gluster volume info gs2

 
  1. Volume Name: gs2
  2. Type: Replicate #复制卷
  3. Volume ID: c76fe8fd-71a7-4395-9dd2-ef1dc85163b8
  4. Status: Created
  5. Number of Bricks: 1 x 2 = 2
  6. Transport-type: tcp
  7. Bricks:
  8. Brick1: glusterfs03:/gluster/brick1
  9. Brick2: glusterfs04:/gluster/brick1
  10. Options Reconfigured:
  11. performance.readdir-ahead: on

image_1cv4pjpne1ukro0r1skb16kng0adl.png-55kB

 

2.3.9 创建分布式条带卷

gluster volume create gs3 stripe 2 glusterfs01:/gluster/brick2 glusterfs02:/gluster/brick2 force

gluster volume start gs3 #启动卷

gluster volume info gs3

 
  1. Volume Name: gs3
  2. Type: Stripe #条带卷
  3. Volume ID: 6d2e27c7-f5a1-4473-9df8-a7261851a2ed
  4. Status: Created
  5. Number of Bricks: 1 x 2 = 2
  6. Transport-type: tcp
  7. Bricks:
  8. Brick1: glusterfs01:/gluster/brick2
  9. Brick2: glusterfs02:/gluster/brick2
  10. Options Reconfigured:
  11. performance.readdir-ahead: on

image_1cv4pl9ibc56kthqbf1961dqle2.png-54.1kB

 

三,进行卷的数据写入测试

在WebServer服务器挂载创建的三种类型卷gs1,gs2,gs3,进行数据写入测试


gs1

image_1cv4qouier5a15932qtu7tt24j0.png-37kB


gs2

image_1cv4qq7qal6e1kr0s81l82u30k6.png-37.3kB


gs3

image_1cv4qrdh612lr1lfd9je1kgu1jf3kj.png-37.3kB

 

3.1 分布式卷gs1的数据写入测试

 

在WebServer上进行数据写入操作

mount -o nolock -t nfs 192.168.200.69:gs1 /mnt

df -h

touch /mnt/{1..10}

ls /mnt/

image_1cv4qfepn1j3f16b11r2pl6ur3aev.png-43.9kB

 

在glusterfs01和glusterfs02上进行查看(看看数据到底写入了哪个盘)

ls /gluster/brick1

image_1cv4qhatrmc418ci1du9o9vdd2gf.png-13.8kB


image_1cv4qhkuc1dtgaoq1ktk10d11srbgs.png-14.2kB

结论:分布式卷的数据存储方式是将数据平均写入到每个整合的磁盘中,类似于raid0,写入速度快,但这样磁盘一旦损坏没有纠错能力。

 

3.2 分布式复制卷gs2的数据写入测试

 

在WebServer上进行数据写入操作

mount -o nolock -t nfs 192.168.200.69:gs2 /mnt

df -h

ls /mnt

touch /mnt/{1..10}

ls /mnt

image_1cv4qmks2u9qb9d1m5fi0d1fpihp.png-52kB

 

在glusterfs03和glusterfs04上进行查看(看看数据到底写入了哪个盘)

ls /gluster/brick1

image_1cv4qnb481fqd1c4pcmd4lc6v2i6.png-15.1kB


image_1cv4qnjc4pc976e1k3i2qm172cij.png-15kB

结论:分布式复制卷的数据存储方式为,每个整合的磁盘中都写入同样的数据内容,类似于raid1,数据非常安全,读取性能高,占磁盘容量。

 

3.3 分布式条带卷gs3的数据写入测试

 

在WebServer上进行数据写入操作

umount /mnt

mount -o nolock -t nfs 192.168.200.69:gs3 /mnt

df -h

dd if=/dev/zero of=/root/test bs=1024 count=262144 #创建大小为256M的文件

ls

cp test /mnt/ #复制到/mnt目录下

ls /mnt

du -sh /mnt/test #查看大小为256M

image_1cv4r48kvdqv1u1c1eh31kagsll0.png-70.1kB

 

在glusterfs01和glusterfs02上进行查看(看看数据到底是怎么存的)

du -sh /gluster/brick2/test

image_1cv4r59tbhoe16gr1ssjivt5tpld.png-14.2kB


image_1cv4r5idl1s6u1alj1ksr1gvt1paqlq.png-15.3kB

结论:我们发现分布式条带卷,是将数据的容量平均分配到了每个整合的磁盘节点上。大幅提高大文件的并发读访问。

 

四,存储卷中brick块设备的扩容

 

4.1 分布式复制卷的扩容

gluster volume add-brick gs2 replica 2 glusterfs03:/gluster/brick2 glusterfs04:/gluster/brick2 force #添加两个块设备

gluster volume info gs2

 
  1. Volume Name: gs2
  2. Type: Distributed-Replicate
  3. Volume ID: 0b425dac-fe4b-4e97-882e-39a8d35cc15a
  4. Status: Started
  5. Number of Bricks: 2 x 2 = 4 #已经扩容
  6. Transport-type: tcp
  7. Bricks:
  8. Brick1: glusterfs03:/gluster/brick1
  9. Brick2: glusterfs04:/gluster/brick1
  10. Brick3: glusterfs03:/gluster/brick2
  11. Brick4: glusterfs04:/gluster/brick2
  12. Options Reconfigured:
  13. performance.readdir-ahead: on

image_1cv4t5umgb2sl3k3gcq34dmln7.png-55.1kB

特别提示: 
对分布式复制卷和分布式条带卷进行扩容时,要特别注意,如果创建卷之初的时候选择的是replica 2 或者stripe 2。那么扩容时,就必须一次性扩容两个或两个的倍数的块设备。 
例如你给一个分布式复制卷的replica为2,你在增加bricks的时候数量必须为2,4,6,8等。

 

4.2 查看扩容后的容量并进行写入测试

 

在WebServer上挂载gs2并查看挂载目录的容量

umount /mnt

mount -o nolock -t nfs 192.168.200.69:gs2 /mnt

df -hT

image_1cv4t9fvs1mv35ounr35761u8hnk.png-42.8kB

 

在WebServer上进行数据写入操作

touch /mnt/{11..20}

ls /mnt

image_1cv4tbivggts2011i8h3c1iluo1.png-17.8kB

 

在glusterfs03和glusterfs04上查看数据存到哪里去了

gluster volume info gs2

 
  1. Volume Name: gs2
  2. Type: Distributed-Replicate
  3. Volume ID: 0b425dac-fe4b-4e97-882e-39a8d35cc15a
  4. Status: Started
  5. Number of Bricks: 2 x 2 = 4
  6. Transport-type: tcp
  7. Bricks:
  8. Brick1: glusterfs03:/gluster/brick1 #组成gs2的块设备就在03和04上
  9. Brick2: glusterfs04:/gluster/brick1
  10. Brick3: glusterfs03:/gluster/brick2
  11. Brick4: glusterfs04:/gluster/brick2
  12. Options Reconfigured:
  13. performance.readdir-ahead: on

ls /gluster/brick1

ls /gluster/brick2

image_1cv4tf1hmt11oovca597bb47oe.png-57.3kB


image_1cv4tfcu24najdd1cs91tl91ajfor.png-20.9kB

通过对扩容的gs2进行写入测试,我们发现数据并没有被写入到新加入的块设备中,这是为甚什么? 
这是因为,为了数据的安全,新扩容块设备的卷,默认必须先做一次磁盘平衡(块设备同步),如此才能正常开始使用。

 

4.3 进行磁盘存储的平衡

注意:平衡布局是很有必要的,因为布局结构是静态的,当新的bricks加入现有卷,新创建的文件会分布到旧的bricks中,所以需要平衡布局结构,使新加入的bricks生效。布局平衡只是使新布局生效,并不会在新的布局移动老的数据,如果你想在新布局生效后,重新平衡卷中的数据,还需要对卷中的数据进行平衡。

 

对gs2进行磁盘存储平衡

gluster volume rebalance gs2 start

image_1cv4ti6kdouodta1i7h14qciffp8.png-24.5kB

 

检查gs2块设备磁盘平衡结果

ls /gluster/brick1

ls /gluster/brick2

执行磁盘存储平衡以后(要想写入文件需要重新挂载),我们发现数据被复制成了4份在4个块设备中。

image_1cv4tili22k316fq1jlt1svv470pl.png-21.9kB


image_1cv4tj46c101s1pdm1of81qggk7q2.png-22.3kB

 

五,存储卷的缩减与删除

 

(1)对存储卷中的brick进行缩减

注意:你可能想在线缩小卷的大小,例如:当硬件损坏或者网络故障的时候,你可能想在卷中移除相关的bricks。注意,当你移除bricks的时候,你在gluster的挂载点将不能继续访问是数据,只有配置文件中的信息移除后你才能继续访问bricks的数据。当移除分布式复制卷或者分布式条带卷的时候,移除的bricks数目必须是replica或者stripe的倍数。例如:一个分布式条带卷的stripe是2,当你移除bricks的时候必须是2,4,6,8等。

 
  1. #先停止卷gs2
  2. [root@glusterfs01 ~]# gluster volume stop gs2
  3. Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
  4. volume stop: gs2: success
  5. #然后移除卷,因为是复制卷且replica为2,因此每次移除必须是2的倍数
  6. [root@glusterfs01 ~]# gluster volume remove-brick gs2 replica 2 glusterfs03:/gluster/brick2 glusterfs04:/gluster/brick2 force
  7. Removing brick(s) can result in data loss. Do you want to Continue? (y/n) y
  8. volume remove-brick commit force: success
  9. #我们发现gs2的卷已经被移除
  10. [root@glusterfs01 ~]# gluster volume info gs2
  11. Volume Name: gs2
  12. Type: Replicate
  13. Volume ID: c76fe8fd-71a7-4395-9dd2-ef1dc85163b8
  14. Status: Stopped
  15. Number of Bricks: 1 x 2 = 2
  16. Transport-type: tcp
  17. Bricks:
  18. Brick1: glusterfs03:/gluster/brick1
  19. Brick2: glusterfs04:/gluster/brick1
  20. Options Reconfigured:
  21. performance.readdir-ahead: on
  22. #重新启动卷gs2
  23. [root@glusterfs01 ~]# gluster volume start gs2
  24. volume start: gs2: success
 

(2)对存储卷进行删除

 
  1. #停止卷gs1
  2. [root@glusterfs01 ~]# gluster volume stop gs1
  3. Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
  4. volume stop: gs1: success
  5. #删除卷gs1
  6. [root@glusterfs01 ~]# gluster volume delete gs1
  7. Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
  8. volume delete: gs1: success
  9. #查看卷信息,发现gs1已经没了
  10. [root@glusterfs01 ~]# gluster volume info
  11. Volume Name: gs2
  12. Type: Replicate
  13. Volume ID: c76fe8fd-71a7-4395-9dd2-ef1dc85163b8
  14. Status: Started
  15. Number of Bricks: 1 x 2 = 2
  16. Transport-type: tcp
  17. Bricks:
  18. Brick1: glusterfs03:/gluster/brick1
  19. Brick2: glusterfs04:/gluster/brick1
  20. Options Reconfigured:
  21. performance.readdir-ahead: on
  22. Volume Name: gs3
  23. Type: Stripe
  24. Volume ID: 6d2e27c7-f5a1-4473-9df8-a7261851a2ed
  25. Status: Started
  26. Number of Bricks: 1 x 2 = 2
  27. Transport-type: tcp
  28. Bricks:
  29. Brick1: glusterfs01:/gluster/brick2
  30. Brick2: glusterfs02:/gluster/brick2
  31. Options Reconfigured:
  32. performance.readdir-ahead: on
 

*特别提示

无论是缩减卷还是删除卷,并不会是清除卷中的数据。数据仍旧会保存在对应磁盘上。

 

六,构建企业级分布式存储

 

6.1 硬件要求

一般选择2U的机型,磁盘STAT盘4T,如果I/O要求比较高,可以采购SSD固态硬盘。为了充分保证系统的稳定性和性能,要求所有glusterfs服务器硬件配置尽量一致,尤其是硬盘数量和大小。机器的RAID卡需要带电池,缓存越大,性能越好。一般情况下,建议做RAID10,如果出于空间要求考虑,需要做RAID5,建议最好能有1-2块硬盘的热备盘。

 

6.2 系统要求和分区划分

系统要求使用CentOS6.x,安装完成后升级到最新版本,安装的时候,不要使用LVM,建议/boot分区200M,根分区100G,swap分区和内存一样大小,剩余空间给gluster使用,划分单独的硬盘空间。系统安装软件没有特殊要求,建议除了开发工具和基本的管理软件,其他软件一律不装。

 

6.3 网络环境

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

 

6.4 服务器摆放分布

服务器主备机器要放在不同的机柜,连接不同的交换机,即使一个机柜出现问题,还有一份数据正常访问。

image_1ctf3q9n911or1sctaof1n7aemh9.png-287.9kB


image_1ctf3qg0q1ftddp6iog1c0ceem.png-225.9kB

 

6.5 构建高性能,高可用存储

一般在企业中,采用的是分布式复制卷,因为有数据备份,数据相对安全,分布式条带卷目前对glusterfs来说没有完全成熟,存在一定的是数据安全风险。

 

6.5.1 开启防火墙端口

一般在企业应用中Linux防火墙是打开的,开通服务器之间访问的端口

 
  1. iptables -I INPUT -p tcp --dport 24007:24011 -j ACCEPT
  2. iptables -I INPUT -p tcp --dport 49152:49162 -j ACCEPT
 
  1. [root@glusterfs01 ~]# cat /etc/glusterfs/glusterd.vol
  2. volume management
  3. type mgmt/glusterd
  4. option working-directory /var/lib/glusterd
  5. option transport-type socket,rdma
  6. option transport.socket.keepalive-time 10
  7. option transport.socket.keepalive-interval 2
  8. option transport.socket.read-fail-log off
  9. option ping-timeout 0
  10. option event-threads 1
  11. # option base-port 49152 #默认端口可以在这里改,因为这个端口可能会和企业里的kvm端口冲突
 

6.5.2 Glusterfs文件系统优化

image_1ctf3sau339d8331a15nl1mqh13.png-42.1kB

Performance.quick-read:优化读取小文件的性能

Performance.read-ahead:用预读的方式提高读取的性能,有利于应用频繁持续性的访问文件,当应用完成当前数据块读取的时候,下一个数据块就已经准备好了。

Performance.write-behind:写入数据时,先写入缓存内,再写入硬盘内,以提高写入的性能。

Performance.io-cache:缓存已经被读过的。

 

文件系统优化调整方法

Glusster volume set <卷> <参数>

 
  1. [root@glusterfs01 ~]# gluster volume info gs2
  2. Volume Name: gs2
  3. Type: Replicate
  4. Volume ID: c76fe8fd-71a7-4395-9dd2-ef1dc85163b8
  5. Status: Started
  6. Number of Bricks: 1 x 2 = 2
  7. Transport-type: tcp
  8. Bricks:
  9. Brick1: glusterfs03:/gluster/brick1
  10. Brick2: glusterfs04:/gluster/brick1
  11. Options Reconfigured:
  12. performance.readdir-ahead: on
  13. [root@glusterfs01 ~]# gluster volume set gs2 performance.read-ahead on #设置预缓存优化
  14. volume set: success
  15. [root@glusterfs01 ~]# gluster volume info gs2
  16. Volume Name: gs2
  17. Type: Replicate
  18. Volume ID: c76fe8fd-71a7-4395-9dd2-ef1dc85163b8
  19. Status: Started
  20. Number of Bricks: 1 x 2 = 2
  21. Transport-type: tcp
  22. Bricks:
  23. Brick1: glusterfs03:/gluster/brick1
  24. Brick2: glusterfs04:/gluster/brick1
  25. Options Reconfigured:
  26. performance.read-ahead: on #已经添加上了
  27. performance.readdir-ahead: on
  28. [root@glusterfs01 ~]# gluster volume set gs2 performance.cache-size 256MB #设置读缓存大小
  29. volume set: success
  30. [root@glusterfs01 ~]# gluster volume info gs2
  31. Volume Name: gs2
  32. Type: Replicate
  33. Volume ID: c76fe8fd-71a7-4395-9dd2-ef1dc85163b8
  34. Status: Started
  35. Number of Bricks: 1 x 2 = 2
  36. Transport-type: tcp
  37. Bricks:
  38. Brick1: glusterfs03:/gluster/brick1
  39. Brick2: glusterfs04:/gluster/brick1
  40. Options Reconfigured:
  41. performance.cache-size: 256MB #已经添加上了
  42. performance.read-ahead: on
  43. performance.readdir-ahead: on
 

6.5.3 监控及日常维护

使用Zabbix自带模板即可。Cpu,内存,主机存活,磁盘空间,主机运行时间,系统load。日常情况要查看服务器的监控值,遇到报警要及时处理。

 
  1. #以下命令在复制卷的场景下才会有
  2. #gluster volume status gs2 查看节点NFS是否在线
  3. (开没开端口)
  4. #gluster volume heal gs2 full 启动完全修复
  5. #gluster volume heal gs2 info 查看需要修复的文件
  6. #gluster volume heal gs2 info healed 查看修复成功的文件
  7. #gluster volume heal gs2 info heal-failed 查看修复失败文件
  8. #gluster volume heal gs2 info split-brain 查看脑裂的文件
  9. #gluster volume quota gs2 enable --激活quota功能
  10. #gluster volume quota gs2 disable --关闭quota功能
  11. #gluster volume quota gs2 limit-usage /data 10GB --/gs2/data 目录限制
  12. #gluster volume quota gs2 list --quota 信息列表
  13. #gluster volume quota gs2 list /data --限制目录的quota信息
  14. #gluster volume set gs2 features.quota-timeout 5 --设置信息的超时事实上时间
  15. #gluster volume quota gs2 remove /data -删除某个目录的quota设置
  16. 备注:
  17. 1quota 功能,主要是对挂载点下的某个目录进行空间限额。如:/mnt/glusterfs/data目录,而不是对组成卷组的空间进行限制
 

七 生产环境遇到常见故障处理

 

7.1 硬盘故障

因为底层做了raid配置,有硬件故障,直接更换硬盘,会自动同步数据。(raid5)

 

7.2 一台主机故障

一台节点故障的情况包括以下类型: 
1,物理故障 
2,同时有多块硬盘故障,造成是数据丢失 
3,系统损坏不可修复

解决方法: 
找一台完全一样的机器,至少要保证硬盘数量和大小一致,安装系统,配置和故障机同样的ip,安装gluster软件,保证配置一样,在其他健康的节点上执行命令gluster peer status,查看故障服务器的uuid

 
  1. #例如:
  2. [root@glusterfs03 ~]# gluster peer status
  3. Number of Peers: 3
  4. Hostname: glusterfs02
  5. Uuid: 0b52290d-96b0-4b9c-988d-44062735a8a8
  6. State: Peer in Cluster (Connected)
  7. Hostname: glusterfs04
  8. Uuid: a43ac51b-641c-4fc4-be56-f6873423b462
  9. State: Peer in Cluster (Connected)
  10. Hostname: glusterfs01
  11. Uuid: 198f2c7c-1104-4671-8989-b430b77540e9
  12. State: Peer in Cluster (Connected)
  13. [root@glusterfs03 ~]#

修改新加机器的/var/lib/glusterd/glusterd.info和故障机器的一样

 
  1. [root@glusterfs04 ~]# cat /var/lib/glusterd/glusterd.info
  2. UUID=a43ac51b-641c-4fc4-be56-f6873423b462
  3. operating-version=30712

在新机器挂载目录上执行磁盘故障的操作(任意节点)

 
  1. [root@glusterfs04 ~]# gluster volume heal gs2 full
  2. Launching heal operation to perform full self heal on volume gs2 has been successful
  3. Use heal info commands to check status

就会自动开始同步,但是同步的时候会影响整个系统的性能 
可以查看状态

 
    1. [root@glusterfs04 ~]# gluster volume heal gs2 info
    2. Brick glusterfs03:/gluster/brick1
    3. Status: Connected
    4. Number of entries: 0
    5. Brick glusterfs04:/gluster/brick1
    6. Status: Connected
    7. Number of entries: 0
posted @ 2019-07-24 15:06  L1n  阅读(9616)  评论(0编辑  收藏  举报