GlusterFS存储
GlusterFS最早由Gluster公司开发,其目标是开发出一个能为客户提供全局命名空间、分布式前端、高达百PB级别扩展性的开源分布式文件系统,相比其他分布式文件系统,Gluster具有高扩展性、高可用性、高性能、可横向扩展等特点,并且其没有元数据服务器的设计,让整个服务没有单点故障的隐患。正式由于GlusterFS拥有众多优点的特点,红帽公司于2011年收购Gluster公司,并将GlusterFS作为其大数据解决方案的一部分
GlusterFS主要应用在集群系统中,其软件结构设计良好,易于扩展和配置,通过各个模块的灵活搭配可以得到针对性的解决方案,可解决以下问题:网络存储、联合存储(融合多个节点上的存储空间)、冗余备份、大文件的负载均衡(分块),但也因为缺乏一些关键特性,可靠性也未经过长时间考验,还不适合应用于需要提供24小时不间断服务的产品环境,目前适用于大量数据的离线应用
认识“分布式文件系统”
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源并不直接与本地节点相连(即非直连存储),而是通过计算机网络由多个节点计算机构成。分布式文件系统的设计基于C/S(Client/Server)模式。流行的模式是当用户需要存储数据时,服务器指引其将数据分散地存储到多个存储节点上,以提供更快的速度,更大的容量、更高的冗余性。下文将先拿三种分布式文件系统举例讲解,使读者更好的理解分布式文件系统
GlusterFS部署与应用
FQDN | 硬盘A | 硬盘B |
server1 | /dev/sda(系统盘) | /dev/sdb(Gluster卷) |
server2 | /dev/sda(系统盘) | /dev/sdb(Gluster卷) |
server3 | /dev/sda(系统盘) | /dev/sdb(Gluster卷) |
STEP1:设置三台服务器及客户机的/etc/hosts文件
[root@Server1 ~]# cat /etc/hosts
192.168.10.1 server1
192.168.10.2 server2
192.168.10.3 server3
STEP2:三台服务器和客户机下载网易的YUM源并生成本地缓存
# cd /etc/yum.repos.d/
# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
# yum repolist
STEP3:用YUM源安装centos-release-gluster软件包(三台服务器与客户机)
# yum install -y centos-release-gluster
##这个软件包必须安装,很重要,它包含了后续所需的YUM库文件
# ls /etc/yum.repos.d/
CentOS7-Base-163.repo CentOS-Gluster-6.repo CentOS-Storage-common.repo
##红字的YUM库就是刚刚下载的,后续会用到
STEP4:三台服务器安装GlusterFS
# yum install glusterfs-server -y
STEP5:启动并设置gluster开机自启(三台服务器都要配置)
# systemctl enable glusterd
# systemctl restart glusterd
STEP6:关闭三台服务器的防火墙
# systemctl stop firewalld
STEP7:使用fdisk为/dev/sdb硬盘进行分区(不做详细演示了,因为很简单)(三台服务器都要配置)
[root@server1 yum.repos.d]# fdisk -l /dev/sdb
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x8e8f44d0Device Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 83 Linux
STEP8:使用mkfs.xfs命令对新分区写入文件系统(三台服务器都要配置)
# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
STEP9:创建/dev/sdb1文件系统挂载点(三台服务器都要配置)
# mkdir -p /bricks/brick1
STEP10:修改/etc/fstab,添加分区与挂载点参数(三台服务器都要配置)
# vim /etc/fstab
/dev/sdb1 /bricks/brick1 xfs defaults 1 2
STEP11:使用mount命令将文件系统挂载(三台服务器都要配置)
# mount -a && mount
/dev/sdb1 on /bricks/brick1 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
STEP12:在Server1将三台服务器添加至“可信池”并查看池状态(只需要在一台执行即可,不是网状结构)
[root@Server1 ~]# gluster peer probe 192.168.10.1
[root@Server1 ~]# gluster peer probe 192.168.10.2
[root@Server1 ~]# gluster peer probe 192.168.10.3
[root@Server1 ~]# gluster peer status
Number of Peers: 2
Hostname: 192.168.10.2
Uuid: c3c9d8ca-1318-4696-b4f5-9ef486401c10
State: Accepted peer request (Connected)Hostname: 192.168.10.3
Uuid: c2f0e33f-8367-4362-9b00-29837eedc7d1
State: Accepted peer request (Connected)
STEP13:三台服务器都创建bl0目录
# mkdir /bricks/brick1/bl0
STEP14:在任何一台服务器都可执行以下操作(创建GlusterFS卷)
# gluster volume create bl0 replica 3 192.168.10.1:/bricks/brick1/bl0 192.168.10.2:/bricks/brick1/bl0 192.168.10.3:/bricks/brick1/bl0
volume create: bl0: success: please start the volume to access data
▲该命令的语法如下图:
gluster volume create volume-name [replica <count>] <host>:/filepath <host>:/filepath <host>:/filepath
STEP15:启动GlusterFS卷(在任何一台服务器上执行都可以)
# gluster volume start bl0
volume start: bl0: success
STEP16:使用gluster命令查看卷详细信息
[root@server1 ~]# gluster volume info bl0
Volume Name: bl0
Type: Distribute
Volume ID: d32d778d-26c2-43a3-8055-b1afd2c82bbe
Status: Started
Snapshot Count: 0
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: 192.168.10.1:/bricks/brick1/bl0
Brick2: 192.168.10.2:/bricks/brick1/bl0
Brick3: 192.168.10.3:/bricks/brick1/bl0
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
使用Linux客户端进行测试
STEP1:安装centos-release-gluster软件包
[root@Server4 ~]# yum install centos-release-gluster -y
STEP2:安装glusterfs-fuse软件包
[root@Server4 ~]# yum install glusterfs-fuse -y
STEP3:安装glusterfs-fuse
[root@Server4 yum.repos.d]# yum install -y glusterfs-fuse
STEP4:安装glusterfs-server,并且启动Gluster
[root@Server4 yum.repos.d]# yum install glusterfs
STEP5:挂载Gluster卷
[root@Server4 yum.repos.d]# mount -t glusterfs server1:/bl0 /mnt/
STEP6:使用df -h或mount命令查看挂载状态
[root@server4 yum.repos.d]# df -h
server1:/bl0 20G 268M 20G 2% /mnt
[root@server4 yum.repos.d]# mount
server1:/bl0 on /mnt type fuse.glusterfs
STEP7:在客户端使用下列组合命令,对GlusterFS写入文件测试
# for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done
STEP8:查看/mnt目录下创建的文件个数(在客户机上)
# ls -lA /mnt | wc -l
STEP9:查看GlusterFS服务器上的目录(三台服务器的目录中可以看到一模一样的文件,因为是复制模式)
[root@server1 yum.repos.d]# ls -lA /bricks/brick1/bl0/
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-001
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-002
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-003
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-004
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-005
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-006
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-007
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-008
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-009
-rw-------. 2 root root 318304 Oct 27 00:41 copy-test-010
………………………………………………、
-----------------------------------------------------------------------------------------------------------------------------------------
总结以下配置顺序:
- 修改三台服务器及客户机的网络配置(IP地址,/etc/hosts文件)等
- 先从网易获取CentOS7的yum库文件安装centos-release-gluster软件再通过centos-release-gluster软件获取gluster软件
- 配置新硬盘分区并写入文件系统,创建挂载点并将文件系统挂载(不想修改配置文件可以直接用mount挂载)
- 将三台服务器加入“可信池”
- 在三台服务器的新硬盘挂载点中创建目录用于GlusterFS卷(/bricks/brick1/bl0)
- 使用每台服务器下的/bricks/brick/bl0目录创建Gluster FS卷
- 启动新创建的Gluster FS卷
- 客户端安装glusterfs,glusterfs-fuse两个软件包,使用mount命令连接GlusterFS卷
☆附注1:一定要glusterfs-fuse这个软件包,否则在挂载Gluster卷时会发生如下报错
[root@Server4 yum.repos.d]# mount -t glusterfs server1:/bl0 /mnt
mount: unknown filesystem type 'glusterfs'
-----------------------------------------------------------------------------------------------------------------------------------------
☆附注2:一定要安装glusterfs软件包否则将会出现如下报错
[root@Server4 yum.repos.d]# mount -t glusterfs server1:/bl0 /mnt
Mount failed. Please check the log file for more details.
-----------------------------------------------------------------------------------------------------------------------------------------
☆附注3:当出现如下报错时,应用该解决方案
[root@Server3 yum.repos.d]# gluster peer status
Number of Peers: 2
Hostname: server1
Uuid: b902df09-5489-45ba-9853-5be5cda68e76
State: Peer in Cluster (Connected)Hostname: server2
Uuid: dd01f530-fe43-4604-90e4-df4d497e6297
State: Peer in Cluster (Disconnected)##如果这里有邻居Disconnected,解决方案如下
STEP1:在/var/lib/glusterd/peers目录下,找到与该UUID相同的文件
[root@Server3 yum.repos.d]# vim /var/lib/glusterd/peers/dd01f530-fe43-4604-90e4-df4d497e6297
uuid=dd01f530-fe43-4604-90e4-df4d497e6297
state=3
hostname1=server2 ##修改为server2
STEP2:重启Gluster服务
[root@Server3 yum.repos.d]# systemctl restart glusterd
STEP3:再次查看Gluster邻居状态
[root@Server3 yum.repos.d]# gluster peer status
Number of Peers: 2
Hostname: server1
Uuid: b902df09-5489-45ba-9853-5be5cda68e76
State: Peer in Cluster (Connected)Hostname: server2
Uuid: dd01f530-fe43-4604-90e4-df4d497e6297
State: Peer in Cluster (Connected)
☆造成这个故障的原因,基本是/etc/hosts文件修改有问题,也就是主机名解析环节,出现了问题
-----------------------------------------------------------------------------------------------------------------------------------------
☆附注4:如果出现以下报错,则有可能是以下错误
[root@Server4 yum.repos.d]# mount -t glusterfs server1:/bl0 /mnt
Mount failed. Please check the log file for more details.
第一:有可能是因为客户机没有安装glusterfs软件
解决方案:在客户机安装glusterfs软件(yum install -y glusterfs)
第二:有可能是因为服务器端没有启动bl0卷
解决方案:gluster volume start bl0
-----------------------------------------------------------------------------------------------------------------------------------------
☆附注5:如果每台服务器上有两块磁盘,那么命令就如下图
# gluster volume create bl0 server1:/bricks/brick1/bl0 server2:/bricks/brick1/bl0 server1:/bricks/brick2/bl0 server2:/bricks/brick2/bl0
▲该命令的语法为:
# gluster volume create volume-name [replica <count>] <host1>:/filepath1 <host2>:/filepath1 <host1>:/filepath2 <host2>:/filepath2
-----------------------------------------------------------------------------------------------------------------------------------------
☆附注6:Volume卷扩容
STEP1:首先修改四台(原来三台与新加一台)服务器的/etc/hosts文件
[root@server1 ~]# cat /etc/hosts
192.168.10.1 server1
192.168.10.2 server2
192.168.10.3 server3
192.168.10.4 server4
STEP2:Server4要完成于其他三台相同的配置
- 安装glusterfs-server并启动
- 创建文件系统挂载点/bricks/brick1/bl0
- 对硬盘进行分区,对分区写入文件系统,将文件系统挂载至/bricks/brick1/bl0
- 关闭防火墙
STEP3:在Server1上将Server4加入可信池
[root@server1 ~]# gluster peer probe server4
peer probe: success.
STEP4:将Server4硬盘添加至Volume卷
[root@server1 ~]# gluster volume add-brick bl0 server4:/bricks/brick1/bl0
volume add-brick: success
STEP5:查看Volume卷状态
[root@server1 ~]# gluster volume info
Volume Name: br0
Type: Distribute
Volume ID: cf1ab742-e0c6-485d-8d38-58c771c5cade
Status: Started
Snapshot Count: 0
Number of Bricks: 4
Transport-type: tcp
Bricks:
Brick1: server1:/bricks/brick1/br0
Brick2: server2:/bricks/brick1/br0
Brick3: server3:/bricks/brick1/br0
Brick4: server4:/bricks/brick1/br0
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
☆附注7:在线收缩,将Server4的/bricks/brick1/br0从Gluster FS卷中移除
STEP1:在Server1执行命令
[root@server1 ~]# gluster volume remove-brick br0 server4:/bricks/brick1/br0 force
Remove-brick force will not migrate files from the removed bricks, so they will no longer be available on the volume
Do you want to continue? (y/n) y
volume remove-brick commit force: success
STEP2:查看Gluster FS卷状态
[root@server1 ~]# gluster volume info br0
Volume Name: br0
Type: Distribute
Volume ID: cf1ab742-e0c6-485d-8d38-58c771c5cade
Status: Started
Snapshot Count: 0
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: server1:/bricks/brick1/br0
Brick2: server2:/bricks/brick1/br0
Brick3: server3:/bricks/brick1/br0
Options Reconfigured:
performance.client-io-threads: on
transport.address-family: inet
nfs.disable: on
▲该命令的语法为:
volume remove-brick <VOLNAME> [replica <count>] <BRICK> ... <start|stop|status|commit|force> - remove brick from volume <VOLNAME>
-----------------------------------------------------------------------------------------------------------------------------------------
☆附注8:当远程卷,加入Gluster分布式文件系统后,被移除,再被添加时,将会如下报错:
[root@server1 ~]# gluster volume add-brick br0 server4:/bricks/brick1/br0
volume add-brick: failed: Pre Validation failed on server4. /bricks/brick1/br0 is already part of a volume
▲解决方案:
[root@server1 ~]# gluster volume add-brick br0 server4:/bricks/brick1/br0 force
##在后面加上force就可以添加成功
-----------------------------------------------------------------------------------------------------------------------------------------
☆附注9:在客户端使用命令组合测试时,如果出现如下报错:
[root@localhost br0]# for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/br0/copy-test-$i; done
cp: cannot create regular file ‘/mnt/br0/copy-test-001’: Input/output error
cp: cannot create regular file ‘/mnt/br0/copy-test-002’: Input/output error
cp: cannot create regular file ‘/mnt/br0/copy-test-003’: Input/output error
cp: cannot create regular file ‘/mnt/br0/copy-test-005’: Input/output error
▲copy-test-001到copy-test-003与copy-test-005都创建失败,那么4呢?
▲因为Gluster分布式文件系统默认采用的是分布式存储,所以我们就可以直接猜到,集群中有某块存储盘故障了
STEP1:在Server1查看Volume卷的状态
[root@server1 br0]# gluster volume status
Status of volume: br0
Gluster process TCP Port RDMA Port Online Pid
-------------------------------------------------------------------------------------------------------------
Brick server1:/bricks/brick1/br0 N/A N/A N N/A
Brick server2:/bricks/brick1/br0 49152 0 Y 8455
Brick server3:/bricks/brick1/br0 N/A N/A N N/A
Brick server4:/bricks/brick1/br0 49152 0 Y 19190Task Status of Volume br0
-------------------------------------------------------------------------------------------------------------
There are no active volume tasks
STEP2:拿Server1举例子,在/bricks/brick1目录下创建一个新目录
[root@server1 brick1]# mkdir /bricks/brick1/br1
STEP3:使用命令,使刚刚创建的新目录顶替之前挂掉的目录
[root@server1 brick1]# gluster volume replace-brick br0 server1:/bricks/brick1/br0 server1:/bricks/brick1/br1 commit force ##一定要打选项哦
volume replace-brick: success: replace-brick commit force operation successful
▲该命令的语法为:
gluster volume replace-brick <VOLNAME> <SOURCE-BRICK> <NEW-BRICK> {commit force}
STEP4:完成后查看Volume卷状态
[root@server1 brick1]# gluster volume status
Status of volume: br0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick server1:/bricks/brick1/br1 49152 0 Y 19337
Brick server2:/bricks/brick1/br0 49152 0 Y 8975
Self-heal Daemon on localhost N/A N/A Y 19345
Self-heal Daemon on server2 N/A N/A Y 19099
Task Status of Volume br0
------------------------------------------------------------------------------
There are no active volume tasks
STEP5:这样就完成了,但是我中间省略了很多步骤,详情可以阅读官网文档,从《Replacing bricks in Replicate/Distributed Replicate volumes》开始
☆附注10:当卸载设备时,若出现如下报错:
[root@server1 br0]# umount /bricks/brick1/
umount: /bricks/brick1: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
解决方案1:
STEP1:使用fuser命令查看正在使用的进程
[root@server1 br0]# fuser -mv /bricks/brick1
USER PID ACCESS COMMAND
/bricks/brick1: root kernel mount /bricks/brick1
root 19653 ..c.. bash
STEP2:使用fuser命令结束占用的进程
[root@server1 br0]# fuser -kv /bricks/brick1
USER PID ACCESS COMMAND
/bricks/brick1: root kernel mount /bricks/brick1
STEP3:再次使用umount命令卸载即可
解决方案2:
STEP1:使用lsof命令找到占用进程(该命令需要yum安装,下框只是举例子!!)
[root@server1 brick1]# lsof /dev
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
glusterfs 19337 root 0r CHR 1,3 0t0 1035 /dev/null
glusterfs 19337 root 1w CHR 1,3 0t0 1035 /dev/null
STEP2:使用kill命令终止该进程
[root@server1 brick1]# kill 19337
☆附注11:如果服务器重启后,出现了与☆附注3同样的报错时,很有可能是防火墙自启动了
解决方案:
# systemctl stop firewalld ##关闭防火墙
# systemctl disable firewalld ##取消防火墙开机自启动
还没写完呢,别急