Gluster的搭建和使用node
咱们为何要去使用分布式存储,在一家大型公司或者大规模的集群中,你们可能会常常遇到一个问题,个人数据怎么存放,放在那,数据空间不够了怎么办,这些问题常常困扰着咱们。linux
笔者是在电信的一个部门工做的,咱们的环境比较复杂。环境有NAS,各类NFS,还有为了高可用搭建的HA上面跑的共享目录,每次咱们遇到的一个最大的问题就是,哪哪哪的空间不够了,咱们须要迁移数据,这个已经成为了平常工做中的一个限制,很难受,尤为是公司目前尚未分布式存储。算法
在这个环境下,为了解决繁琐的劳动,打算研究一下。目前的话,打算考虑的就两个方向,一个是CEPH,一个Gluster。可是在以前的调研中,CEPH手头的资料比较少,另外多是笔者比较笨,没有看懂,目前只更新Gluster的用法,后续会去研究CEPH。centos
时间:服务器
2018年5月28日网络
1,环境搭建:负载均衡
最少两台Centos7的机器,也能够选择其余机器。若是搭建分布条带复制卷的话,最好是4台机器为基础(注意:扩容的时候必须以搭建的基数来扩建)tcp
服务器分布式 |
IP性能 |
主机名 |
系统 |
1 |
10.251.26.193 |
gluster_test1 |
Centos7.3 |
2 |
10.251.26.194 |
gluster_test2 |
Centos7.3 |
3 |
10.251.26.195 |
gluster_test3 |
Centos7.3 |
2,主机名设置
(由于Gluster能够根据主机名来访问,这里最好设置一下。若是是根据IP来访问,那这就没有必要了),设置环境须要相同
vi /etc/hosts
10.251.26.193 gluster_test1
10.251.26.194 gluster_test2
10.251.26.195 gluster_test3
3,时钟同步
搭建的时候时间必需要同步好,时间有偏差,集群的通讯也可能会有问题。
ntpdate 时钟服务器
4,安装Gluster仓库
yum install centos-release-gluster -y
5,格式化和挂载Brick
Brick:GFS中的存储单元,经过是一个受信存储池中的服务器的一个导出目录。能够经过主机名和目录名来标识,如'SERVER:EXPORT'
mkfs.xfs -i size=512 /dev/sdb
mkdir -p /gluster/test1
在/etc/fstab中添加以下
/dev/sdb /gluster/test1 xfs defaults 0 0
而后进行挂载
mount -a
6,安装GlusterFS
yum --enablerepo=centos-gluster*-test install glusterfs-server
7,添加开机启动并启动服务
systemctl enable glusterd
systemctl start glusterd
安装完成后GlusterFS以后,须要配置,配置以前最好ping下本身的主机名。
1,配置trusted pool
Gluster peer probe 主机IP
对于一台服务器来讲,只须要添加其余的server就行了。
2,查看集群的状态
gluster peer status
3,配置glusterFS卷
好比说你要建立一个fbtdfz共享卷
(mkdir /gluster/test1/fbtdfz,前面的是我们已经创建好的,后面的是输出目录,可是我在实际环境中能够直接建立一条命令)
gluster volume create fbtdfz stripe 2 replica 2 10.251.26.193:/gluster/test4/fbtdfz 10.251.26.194:/gluster/test3/fbtdfz 10.251.26.193:/gluster/test5/fbtdfz 10.251.26.194:/gluster/test4/fbtdfz
4,启动共享卷
gluster volume start fbtdfz
5,查看共享卷状态
gluster volume info
6,挂载卷
注意,挂载卷的时候须要安装gluster客户端
mount -t glusterfs IP:/共享目录 /mnt
1、分布式文件系统
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源并不直接与本地节点相连,而是分布于计算网络中的一个或者多个节点的计算机上。目前意义上的分布式文件系统大多都是由多个节点计算机构成,结构上是典型的客户机/服务器模式。流行的模式是当客户机须要存储数据时,服务器指引其将数据分散的存储到多个存储节点上,以提供更快的速度,更大的容量及更好的冗余特性。
目前流行的分布式文件系统有许多,如MooseFS、OpenAFS、GoogleFS,具体实现原理我这里再也不介绍。
2、GlusterFS概述
GlusterFS系统是一个可扩展的网络文件系统,相比其余分布式文件系统,GlusterFS具备高扩展性、高可用性、高性能、可横向扩展等特色,而且其没有元数据服务器的设计,让整个服务没有单点故障的隐患。
术语:
Brick:GFS中的存储单元,经过是一个受信存储池中的服务器的一个导出目录。能够经过主机名和目录名来标识,如'SERVER:EXPORT'
Client:挂载了GFS卷的设备
Extended Attributes:xattr是一个文件系统的特性,其支持用户或程序关联文件/目录和元数据。
FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户建立本身的文件系统而不须要修改内核代码。经过在用户空间运行文件系统的代码经过FUSE代码与内核进行桥接。
Geo-Replication
GFID:GFS卷中的每一个文件或目录都有一个惟一的128位的数据相关联,其用于模拟inode
Namespace:每一个Gluster卷都导出单个ns做为POSIX的挂载点
Node:一个拥有若干brick的设备
RDMA:远程直接内存访问,支持不经过双方的OS进行直接内存访问。
RRDNS:round robin DNS是一种经过DNS轮转返回不一样的设备以进行负载均衡的方法
Self-heal:用于后台运行检测复本卷中文件和目录的不一致性并解决这些不一致。
Split-brain:脑裂
Translator:
Volfile:glusterfs进程的配置文件,一般位于/var/lib/glusterd/vols/volname
Volume:一组bricks的逻辑集合
1、无元数据设计
元数据是用来描述一个文件或给定区块在分布式文件系统中所在的位置,简而言之就是某个文件或某个区块存储的位置。传统分布式文件系统大都会设置元数据服务器或者功能相近的管理服务器,主要做用就是用来管理文件与数据区块之间的存储位置关系。相较其余分布式文件系统而言,GlusterFS并无集中或者分布式的元数据的概念,取而代之的是弹性哈希算法。集群中的任何服务器和客户端均可以利用哈希算法、路径及文件名进行计算,就能够对数据进行定位,并执行读写访问操做。
这种设计带来的好处是极大的提升了扩展性,同时也提升了系统的性能和可靠性;另外一显著的特色是若是给定肯定的文件名,查找文件位置会很是快。可是若是要列出文件或者目录,性能会大幅降低,由于列出文件或者目录时,须要查询所在节点并对各节点中的信息进行聚合。此时有元数据服务的分布式文件系统的查询效率反而会提升许多。
2、服务器间的部署
在以前的版本中服务器间的关系是对等的,也就是说每一个节点服务器都掌握了集群的配置信息,这样作的好处是每一个节点度拥有节点的配置信息,高度自治,全部信息均可以在本地查询。每一个节点的信息更新都会向其余节点通告,保证节点间信息的一致性。但若是集群规模较大,节点众多时,信息同步的效率就会降低,节点信息的非一致性几率就会大大提升。所以GlusterFS将来的版本有向集中式管理变化的趋势。
3、客户端访问流程
当客户端访问GlusterFS存储时,首先程序经过访问挂载点的形式读写数据,对于用户和程序而言,集群文件系统是透明的,用户和程序根本感受不到文件系统是本地仍是在远程服务器上。读写操做将会被交给VFS(Virtual File System)来处理,VFS会将请求交给FUSE内核模块,而FUSE又会经过设备/dev/fuse将数据交给GlusterFS Client。最后通过GlusterFS Client的计算,并最终通过网络将请求或数据发送到GlusterFS Server上。
3、GlusterFS集群的模式
GlusterFS 集群的模式只数据在集群中的存放结构,相似于磁盘阵列中的级别。
1、分布式卷(Distributed Volume)
又称哈希卷,近似于RAID0,文件没有分片,文件根据hash算法写入各个节点的硬盘上,优势是容量大,缺点是没冗余。
Gluster volume create test-volume server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
2、复制卷(Replicated Volume)
至关于raid1,复制的份数,决定集群的大小,一般与分布式卷或者条带卷组合使用,解决前两种存储卷的冗余缺陷。缺点是磁盘利用率低。
复本卷在建立时可指定复本的数量,一般为2或者3,复本在存储时会在卷的不一样brick上,所以有几个复本就必须提供至少多个brick,当其中一台服务器失效后,能够从另外一台服务器读取数据,所以复制GlusterFS卷提升了数据可靠性的同事,还提供了数据冗余的功能。
Gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2
3、分布式复制卷(Distributed Replicated Volume)
分布式复制GlusterFS卷结合了分布式和复制Gluster卷的特色,看起来相似RAID10,但其实不一样,RAID10其实质是条带化,但分布式复制GlusterFS卷则没有。
gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
4、条带卷(Striped Volume)
至关于raid0,文件是分片均匀写在各个节点的硬盘上的,优势是分布式读写,性能总体较好。缺点是没冗余,分片随机读写可能会致使硬盘IOPS饱和。
gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2
5、分布式条带卷(Distributed Striped Volume)
当单个文件的体型十分巨大,客户端数量更多时,条带卷已经没法知足需求,此时将分布式与条带化结合起来是一个比较好的选择。其性能与服务器数量有关。
gluster volume create test-volume stripe 4 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8
若是底层作了 RAID 配置,有硬件故障,直接更换硬盘,会自动同步数据。
若是没有作 RAID,处理方法以下:
正常节点上执行 gluster volume status,记录故障节点 uuid
执行:getfattr -d -m ‘.*’ /brick 记录 trusted.gluster.volume-id 及 trusted.gfid
如下为故障模拟及修复过程:
在 VMware Workstation 上移除 mystorage1 主机的第三块硬盘(对应 sdc /storage/brick2),至关于硬盘故障
# 系统提示以下:
Message from syslogd@linux-node01 at Jul 30 08:41:46 ...
storage-brick2[5893]: [2016-07-30 00:41:46.729896] M [MSGID: 113075] [posix-helpers.c:1844:posix_health_check_thread_proc] 0-gv2-posix: health-check failed, going down
Message from syslogd@linux-node01 at Jul 30 08:42:16 ...
storage-brick2[5893]: [2016-07-30 00:42:16.730518] M [MSGID: 113075] [posix-helpers.c:1850:posix_health_check_thread_proc] 0-gv2-posix: still alive! -> SIGTERM
# 查看卷状态,mystorage1:/storage/brick2 不在线了,不过这是分布式复制卷,还能够访问另外 brick 上的数据
[root@mystorage1 ~]# gluster volume status gv2
Status of volume: gv2
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick mystorage1:/storage/brick2 N/A N/A N N/A
在 VMware Workstation 上新增 mystorage1 一块硬盘,至关于更换了新硬盘,下面先格式挂载新硬盘:
# mkfs.xfs -f /dev/sdc
# mkdir -p /storage/brick2
# mount -a
# df -h
# 新硬盘挂载后目录为空
[root@mystorage1 ~]# ll /storage/brick2
total 0
开始手动配置新增硬盘的 gluster 参数
# 在 mystorage2 是获取 glusterfs 相关参数:
[root@mystorage2 tmp]# getfattr -d -m '.*' /storage/brick2
getfattr: Removing leading '/' from absolute path names
# file: storage/brick2
trusted.gfid=0sAAAAAAAAAAAAAAAAAAAAAQ==
trusted.glusterfs.dht=0sAAAAAQAAAAAAAAAAf////g==
trusted.glusterfs.dht.commithash="3168624641"
trusted.glusterfs.quota.dirty=0sMAA=
trusted.glusterfs.quota.size.1=0sAAAAAATiAAAAAAAAAAAAAwAAAAAAAAAE
trusted.glusterfs.volume-id=0sEZKGliY6THqhVVEVrykiHw==
# 在 mystorage1 上执行配置 glusterfs 参数和上述同样
setfattr -n trusted.gfid -v 0sAAAAAAAAAAAAAAAAAAAAAQ== /storage/brick2
setfattr -n trusted.glusterfs.dht -v 0sAAAAAQAAAAAAAAAAf////g== /storage/brick2
setfattr -n trusted.glusterfs.dht.commithash -v "3168624641" /storage/brick2
setfattr -n trusted.glusterfs.quota.dirty -v 0sMAA= /storage/brick2
setfattr -n trusted.glusterfs.quota.size.1 -v 0sAAAAAATiAAAAAAAAAAAAAwAAAAAAAAAE /storage/brick2
setfattr -n trusted.glusterfs.volume-id -v 0sEZKGliY6THqhVVEVrykiHw== /storage/brick2
[root@mystorage1 ~]# /etc/init.d/glusterd restart
Starting glusterd: [ OK ]
[root@mystorage1 ~]# gluster volume heal gv2 info
Brick mystorage1:/storage/brick2
Status: Connected
Number of entries: 0
Brick mystorage2:/storage/brick2
/data
Status: Connected
Number of entries: 1 # 显示一个条目在修复,自动修复完成后会为 0
Brick mystorage3:/storage/brick1
Status: Connected
Number of entries: 0
Brick mystorage4:/storage/brick1
Status: Connected
Number of entries: 0
# 自动修复同步完成后,查看新硬盘的数据同步过来了
[root@mystorage1 ~]# ll /storage/brick2
total 40012
-rw-r--r-- 2 root root 20480000 Jul 30 02:41 20M.file
-rw-r--r-- 2 root root 20480000 Jul 30 03:13 20M.file1
drwxr-xr-x 2 root root 21 Jul 30 09:14 data
一台节点故障的状况包含如下状况:
解决方法:
找一台彻底同样的机器,至少要保证硬盘数量和大小一致,安装系统,配置和故障机一样的 IP,安装 gluster 软件,
保证配置同样,在其余健康节点上执行命令 gluster peer status,查看故障服务器的 uuid
[root@mystorage2 ~]# gluster peer status
Number of Peers: 3
Hostname: mystorage3
Uuid: 36e4c45c-466f-47b0-b829-dcd4a69ca2e7
State: Peer in Cluster (Connected)
Hostname: mystorage4
Uuid: c607f6c2-bdcb-4768-bc82-4bc2243b1b7a
State: Peer in Cluster (Connected)
Hostname: mystorage1
Uuid: 6e6a84af-ac7a-44eb-85c9-50f1f46acef1
State: Peer in Cluster (Disconnected)
修改新加机器的 /var/lib/glusterd/glusterd.info 和 故障机器同样
[root@mystorage1 ~]# cat /var/lib/glusterd/glusterd.info
UUID=6e6a84af-ac7a-44eb-85c9-50f1f46acef1
operating-version=30712
在信任存储池中任意节点执行
# gluster volume heal gv2 full
就会自动开始同步,但在同步的时候会影响整个系统的性能。
能够查看状态
# gluster volume heal gv2 info
上面两种办法是在网上借鉴的,可是在实际的恢复过程当中,第一种恢复硬盘的方式是不成功的,因此就利用了另一种方法:
模拟的是一块盘坏了新换了一块盘上去:
替换步骤:
先把坏了那个那个brick移除掉
gluster volume remove-brick fuzhi replica 1 server1:/data/fuzhi_b1 force
fuzhi:这里指的是坏了的那个卷组名
replica:1 这里代指的是还剩下一个备份
server1:/data/fuzhi 这是坏了的那个卷组
force :暂时不清楚含义
而后再把新得brick加进去
gluster volume add-brickfuzhi replica 2 server3:/data/fuzhi_b3force
注意如今这个replica后面跟的数量必定是大于1的
最后执行节点健康数据检查,恢复数据:
gluster volume heal fuzhi
Fuzhi:这里是要恢复的名字
gluster peer
帮助 gluster volume create help
本次把sdb1挂在到了/date/下
卷的类型
哈希卷 gluster volume create haxi server1:/data/haxi_b1 server2:/data/haxi_b2 force
复制卷 gluster volume create fuzhi replica 2 server1:/data/fuzhi_b1 server2:/data/fuzhi_b2
条带卷 gluster volume create tiaodai stripe 2 server1:/data/tiaodai_b1 server2:/data/tiaodai_b2
哈希条带复制卷 gluster volume create hxfz server1:/data/hxfz_b1 server2:/data/hxfz_b1 server1:/data/hxfz_b2 server2:/data/hxfz_b2 force
增长节点
gluster peer probe ip/主机名
删除节点
gluster peer detach ip/主机名
查看节点状态
gluster peer status
为哈希卷扩容
gluste volume add-brick 卷的名字 servername:/brick的位置
为哈希卷缩小空间
gluster volume remove-brick 卷的名字 servername:/brik的位置 start
gluster volume remove-brick 卷的名字 servername:/brick的位置 commit -->此时会丢失数据
为复制卷扩容
gluster volume add=brick 卷的名字 replica 2 servername:/brick的位置 servername:/brick的位置 start
为复制卷缩小空间
gluster volume remove-brick 卷的名字 replica 2 servername:/brick的位置 servername:/brick的位置 start
gluster volume remove-brick 卷的名字 servername:/brick的位置 servername:/brick的位置 commit
负载均衡
命令格式
volume rebalance 卷的名字 fix-layout start
数据监控检测以及修复
gluster volume heal 卷的名称
磁盘配额
gluster volume quota 卷的名字 limit-usage 路径 限额大小