PB级容量、高可用、读写性能、基于文件系统级别共享、分布式、无metadata(元数据)的存储方式。PB级容量、高可用、读写性能、基于文件系统级别共享、分布式、无metadata(元数据)的存储方式。
GlusterFS(GNU ClusterFile System)是一种全对称的开源分布式文件系统,所谓全对称是指GlusterFS采用弹性哈希算法,没有中心节点,所有节点全部平等。GlusterFS配置方便,稳定性好,可轻松达到PB级容量,数千个节点。
birck:GlusterFS的基本元素,以节点服务器目录形式展现;
volume:多个brick的逻辑集合;
metadata:元数据,用于描述文件、目录等的信息;
self-heal:用于后台运行检测副本卷中文件和目录的不一致性并解决这些不一致;
FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接;
Gluster Server:数据存储服务器,即组成GlusterFS存储集群的节点;
Gluster Client:使用GlusterFS存储服务的服务器,如KVM、OpenStack、LB RealServer、HA node。
GlusterFS外部架构
GlusterFS内部架构
一、配置安装服务
1.使用阿里的yum源安装gluster4.1版本
[root@glusterfs1 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
Glusterfs1节点和glusterfs2节点安装服务,配置服务启动
[root@glusterfs1 ~]# yum -y install centos-release-gluster41 [root@glusterfs1 ~]# yum -y install glusterfs-server [root@glusterfs1 ~]# systemctl restart glusterd [root@glusterfs1 ~]# systemctl enable glusterd [root@glusterfs2 ~]# yum -y install centos-release-gluster41 [root@glusterfs2 ~]# yum -y install glusterfs-server [root@glusterfs2 ~]# systemctl restart glusterd [root@glusterfs2 ~]# systemctl enable glusterd
二、配置GlusterFS
1.配置挂载磁盘
每个节点添加三块磁盘,大小5G
#对三块磁盘各创建1个分区
[root@glusterfs1 ~]# fdisk /dev/sdb [root@glusterfs1 ~]# fdisk /dev/sdc [root@glusterfs1 ~]# fdisk /dev/sdd
#将分区进行格式化,创建分步存储数据源挂载点文件夹,将分区分别挂载
[root@glusterfs1 ~]# mkfs.xfs /dev/sdb1 [root@glusterfs1 ~]# mkfs.xfs /dev/sdc1 [root@glusterfs1 ~]# mkfs.xfs /dev/sdd1 [root@glusterfs1 ~]# mkdir -p /data/brick{1..3} [root@glusterfs1 ~]# mount /dev/sdb1 /data/brick1 [root@glusterfs1 ~]# mount /dev/sdc1 /data/brick2 [root@glusterfs1 ~]# mount /dev/sdd1 /data/brick3 [root@glusterfs1 ~]# df -h|grep brick /dev/sdb1 5.0G 33M 5.0G 1% /data/brick1 /dev/sdc1 5.0G 33M 5.0G 1% /data/brick2 /dev/sdd1 5.0G 33M 5.0G 1% /data/brick3
2.创建主机信任对等体
任意一台节点上配置
[root@glusterfs1 ~]# gluster peer probe glusterfs1 peer probe: success. Probe on localhost not needed [root@glusterfs1 ~]# gluster peer probe glusterfs2 peer probe: success. [root@glusterfs1 ~]# gluster peer status Number of Peers: 1 Hostname: glusterfs2 Uuid: 36515c7d-2b84-4f37-9ecf-d738887929aa State: Peer in Cluster (Connected)
配置分布卷
Distributed:分布式卷,文件通过哈希随机算法分步到由bricks组成的卷上
3.创建配置glusterfs分布卷
#创建存储目录
[root@glusterfs1 ~]#mkdir -p /data/brick1/gv1
#创建分布卷
[root@glusterfs1 ~]# gluster volume create gv1 glusterfs1:/data/brick1/gv1/ glusterfs2:/data/brick1/gv1/ volume create: gv1: success: please start the volume to access data
#启动分布卷
[root@glusterfs1 ~]# gluster volume start gv1 volume start: gv1: success
#查看gv1状态
[root@glusterfs1 ~]#gluster volume status gv1 Status of volume: gv1 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick glusterfs1:/data/brick1/gv1 49152 0 Y 25156 Brick glusterfs2:/data/brick1/gv1 49152 0 Y 24611 Task Status of Volume gv1 ------------------------------------------------------------------------------ There are no active volume tasks
#查看vg1信息
[root@glusterfs1 ~]#gluster volume info gv1 Volume Name: gv1 Type: Distribute Volume ID: 6cee1268-6401-4f0b-9dde-8e3f0e45cb74 Status: Started Snapshot Count: 0 Number of Bricks: 2 Transport-type: tcp Bricks: Brick1: glusterfs1:/data/brick1/gv1 Brick2: glusterfs2:/data/brick1/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on
测试
#挂载gv1到目录
[root@glusterfs1 ~]# mkdir /opt/gv1 [root@glusterfs1 ~]# mount -t glusterfs glusterfs1:/gv1 /opt/gv1 [root@glusterfs1 ~]# df -h |grep gv1 glusterfs1:/gv1 10G 167M 9.9G 2% /opt/gv1 #卷大小为两个节点容量和5G+5G
#测试文件分布存储
在挂载了gv1卷的目录下,创建10个测试文件
进入glusterfs1节点的数据存储目录查看文件存储情况
进入glusterfs2节点的数据存储目录查看文件存储情况
将gv1分布卷再挂载到glusterfs2节点,可以看到同一分布卷的文件共享存储
三、配置复制卷
Replicated:复制式卷,类似RAID1,replica数等于卷中brick存储服务器数量
#创建存储目录
[root@glusterfs1 ~]# mkdir -p /data/brick1/gv2
#创建分布式卷,副本数为2,会提示出发生脑裂警告,输入Y继续即可
[root@glusterfs1 ~]#gluster volume create gv2 replica 2 glusterfs1:/data/brick1/gv2 glusterfs2:/data/brick1/gv2 Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/. Do you still want to continue? (y/n) y volume create: gv2: success: please start the volume to access data
#启动卷
[root@glusterfs1 ~]#gluster volume start gv2 volume start: gv2: success
#查看gv2状态
[root@glusterfs1 ~]# gluster volume status gv2 Status of volume: gv2 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick glusterfs1:/data/brick1/gv2 49153 0 Y 100756 Brick glusterfs2:/data/brick1/gv2 49153 0 Y 62646 Self-heal Daemon on localhost N/A N/A Y 100805 Self-heal Daemon on glusterfs2 N/A N/A Y 62669 Task Status of Volume gv2 ------------------------------------------------------------------------------ There are no active volume tasks
#查看gv2信息
[root@glusterfs1 ~]#gluster volume info gv2 Volume Name: gv2 Type: Replicate Volume ID: 5c8ccf1a-8808-49de-b36f-74e4a2a7f215 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport-type: tcp Bricks: Brick1: glusterfs1:/data/brick1/gv2 Brick2: glusterfs2:/data/brick1/gv2 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off
测试
#创建挂载点目录,挂载gv2,可见容量大小为一半(5G+5G)/2
[root@glusterfs1 ~]# mkdir -p /opt/gv2 [root@glusterfs1 ~]#mount -t glusterfs glusterfs1:/gv2 /opt/gv2 [root@glusterfs1 ~]#df -h|grep gv2 glusterfs1:/gv2 5.0G 84M 5.0G 2% /opt/gv2
创建10个测试文件,查看brick下gv目录,文件数量为完整的10个
在glusterfs2节点查看文件数量,也是完整的10个,可见两个节点存储的文件为相同的
四、配置条带卷
Striped:条带式卷,类似RAID0,文件被分为数据块,并发粒度为数据块,大文件性能好
[root@glusterfs1 ~]# gluster volume create gv3 stripe 2 glusterfs1:/data/brick3/gv3 glusterfs2:/data/brick3/gv3 volume create: gv3: success: please start the volume to access data [root@glusterfs1 ~]# gluster volume start gv3 volume start: gv3: success [root@glusterfs1 ~]# gluster volume status gv3 Status of volume: gv3 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick glusterfs1:/data/brick3/gv3 49154 0 Y 129779 Brick glusterfs2:/data/brick3/gv3 49154 0 Y 77272 Task Status of Volume gv3 ------------------------------------------------------------------------------ There are no active volume tasks [root@glusterfs1 ~]# gluster volume info gv3 Volume Name: gv3 Type: Stripe Volume ID: cdee0ae8-e821-44a3-8bb7-71671e3f108a Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport-type: tcp Bricks: Brick1: glusterfs1:/data/brick3/gv3 Brick2: glusterfs2:/data/brick3/gv3 Options Reconfigured: transport.address-family: inet nfs.disable: on
测试
#创建挂载点文件夹,挂载gv3,可用容量为5G+5G
[root@glusterfs1 ~]# mkdir /opt/gv3 [root@glusterfs1 ~]# mount -t glusterfs glusterfs1:/gv3 /opt/gv3 [root@glusterfs1 ~]# df -h|grep gv3 glusterfs1:/gv3 10G 167M 9.9G 2% /opt/gv3
#在挂载文件夹里创建一个大小为10M一个20M的测试文件
[root@glusterfs1 ~]# dd if=/dev/zero bs=1024 count=10000 of=/opt/gv3/10M.file 记录了10000+0 的读入 记录了10000+0 的写出 10240000字节(10 MB)已复制,0.883662 秒,11.6 MB/秒 [root@glusterfs1 ~]# dd if=/dev/zero bs=1024 count=20000 of=/opt/gv3/20M.file 记录了20000+0 的读入 记录了20000+0 的写出 20480000字节(20 MB)已复制,1.5851 秒,12.9 MB/秒
#分别查看glusterfs1节点和glusterfs2节点,10M的文件以5M大小文件块分别存储在两个节点上,20M文件同理
[root@glusterfs1 ~]# ll -h /data/brick3/gv3/ 总用量 15M -rw-r--r-- 2 root root 4.9M 7月 25 04:51 10M.file -rw-r--r-- 2 root root 9.8M 7月 25 04:51 20M.file [root@glusterfs2 ~]# ll -h /data/brick3/gv3/ 总用量 15M -rw-r--r-- 2 root root 4.9M 7月 25 04:51 10M.file -rw-r--r-- 2 root root 9.8M 7月 25 04:51 20M.file
五、参考命令
集群节点操作
#添加节点
gluster peer probe <主机名或IP>
#删除节点
gluster peer detach <主机名或IP>
#查看节点连接状态
gluster peer status
#列出所有节点
gluster pool list
卷操作
#查看卷信息
gluster volume info <卷名或all>
#列出所有卷
gluster volume list
#查看卷状态
gluster volume stat<卷名>
#启动/停止/删除卷
gluster volume start/stop/delete <卷名>
#修复卷
gluster volume heal <卷名> //只修复有问题文件
gluster volume heal <卷名> full //修复所有文件
gluster volume heal <卷名> info //查看修复自愈详情
#创建卷
gluster volume create <新卷名> [stripe 条带卷数] [replica 副本卷数] <brick卷1(格式-IP或主机名:/存储目录)> <brick卷2>
#添加brick到卷,条带卷和副本卷添加brick需要添加的数量是之前的整数倍
gluster volume add-brick <卷名> <brick卷(格式-IP或主机名:/存储目录)>
#移除brick到卷,条带卷和副本卷添加brick需要移除的数量是之前的整数倍
gluster volume remove-brick <卷名> <brick卷(格式-IP或主机名:/存储目录)>