admin

docker方式安装配置GlusterFS分布式文件系统

admin linux服务 2019-01-24 2382浏览 0

glusterfs简介

GlusterFS是一个高层次的分布式文件系统解决方案。通过增加一个逻辑层,对上层使用者掩盖了下面的实现,使用者不用了解也不需知道,文件的存储形式、分布。

 内部实现是整合了许多存储块(server)通过Infiniband RDMA或者 Tcp/Ip方式互联的一个并行的网络文件系统,这样的许多存储块可以通过许多廉价的x86主机,通过网络搭建起来

 其相对于传统NAS 、SAN、Raid的优点就是:

  1.容量可以按比例的扩展,且性能却不会因此而降低。

  2.廉价且使用简单,完全抽象在已有的文件系统之上。

  3.扩展和容错设计的比较合理,复杂度较低。扩展使用translator方式,扩展调度使用scheduling接口,容错交给了本地的文件系统来处理。

   4.适应性强,部署方便,对环境依赖低,使用,调试和维护便利。

 支持主流的linux系统发行版,包括 fc,ubuntu,debian,suse等,并已有若干成功应用。

glusterfs安装配置

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

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

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

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形成一个复制关系,然后两个复制关系形成分布。

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


下面对glusterfs做分布式复制卷操作演示如下:

1、安装glusterfs

 首先关闭iptables或者firewalld和selinux, glusterfs的开发者制作了docker镜像 我们可以直接使用docker方式。

 到/home/下新建一个glusterfs目录

安装docker和docker-compose 详见:https://mhsj.net/59.html

cd /home
mkdir glusterfs
cd glusterfs

每台机器编写docker-compose.yml

vim docker-compose.yml

version: '2'services:
    gfs:
        image: gluster/gluster-centos
        network_mode: host
        privileged: true
        volumes:
            - /home/glusterfs/data:/var/lib/glusterd:rw
            - /home/glusterfs/volume:/data:rw
            - /home/glusterfs/logs:/var/log/glusterfs:rw
            - /home/glusterfs/conf:/etc/glusterfs:rw
            - /dev:/dev:rw
            - /etc/hosts:/etc/hosts:rw

每台机器配置/etc/hosts

[root@localhost gfs]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.9.144 data-1-1

192.168.9.145 data-1-2

192.168.9.146 data-1-3

192.168.9.147 data-1-4

 

每台机器 创建docker-compose 并执行命令

cd /home/glusterfs

# 启动

docker-compose up -d

# 创建文件存储目录

docker-compose exec gfs mkdir /data/gfs


到192.168.9.144这台机器上执行(重点)

cd /home/glusterfs


# 进入容器

docker-compose exec gfs bash

### 容器内执行
##关联其他3台的glusterfs,这个执行完后 4台glusterfs处于集群状态

gluster peer probe data-1-2
gluster peer probe data-1-3
gluster peer probe data-1-4

#查看状态

#gluster peer status
Number of Peers: 3
Hostname: data-1-2Uuid: db3af9cc-7b66-4045-927b-4e0e076e64f7State: Peer in Cluster (Connected)
Hostname: data-1-3Uuid: aac5465c-d714-4704-ad59-9a9d72e62ac8State: Peer in Cluster (Connected)
Hostname: data-1-4Uuid: 93dc539f-338a-45b0-a911-1c907a7a42fdState: Peer in Cluster (Connected)

## 创建复制卷,volume 命名为gfs 备份1份
gluster  volume  create  gv1 replica 2 data-1-1:/data/gfs data-1-2:/data/gfs force

#这里创建分布式复制卷,是在 gv1 复制卷的基础上增加 2 块 brick 形成的

gluster  volume  add-brick gv1  replica 2  data-1-3:/data/gfs  data-1-4:/data/gfs force

## 启动gfs

[root@data-1-1 /]# gluster volume  start  gv1

## 退出容器
exit

到这里分布式复制卷就创建完成了。

客户端测试:

安装客户端:

yum install glusterfs-client
mount  -t  glusterfs  127.0.0.1:/gv1  /mnt/

批量创建文件测试:

touch {a..f

结果显示:

192.168.9.144 data-1-1

[root@data-1-1 gfs]# cd /home/glusterfs/volume/gfs/

[root@data-1-1 gfs]# ls

a  b  c  e

192.168.9.145 data-1-2

[root@data-1-1 gfs]# cd /home/glusterfs/volume/gfs/

[root@data-1-1 gfs]# ls

a  b  c  e

 

192.168.9.146 data-1-3

[root@localhost gfs]# cd /home/glusterfs/volume/gfs/

[root@localhost gfs]# ls

  d  f

192.168.9.147 data-1-4

[root@localhost gfs]# cd /home/glusterfs/volume/gfs/

[root@localhost gfs]# ls

  d  f

如上同理,只有两台服务器需要创建复制卷

gluster  volume  create  gv1 replica 2 data-1-1:/data/gfs data-1-2:/data/gfs force

如果需要创建分布式条带卷(4台)

先创建复制卷

gluster  volume  create  gv1 replica 2 data-1-1:/data/gfs data-1-2:/data/gfs force

分布式条带卷,是在 gv1 条带卷的基础上增加 2 块 brick 形成的

gluster volume  add-brick gv1 stripe 2  data-1-3:/data/gfs data-1-4:/data/gfs force


glusterfs的常见维护问题处理(如下是摘录其他地方)

分布式复制卷的最佳实践:

  1)搭建条件
  - 块服务器的数量必须是复制的倍数
  - 将按块服务器的排列顺序指定相邻的块服务器成为彼此的复制
  例如,8台服务器:
  - 当复制副本为2时,按照服务器列表的顺序,服务器1和2作为一个复制,3和4作为一个复制,5和6作为一个复制,7和8作为一个复制
  - 当复制副本为4时,按照服务器列表的顺序,服务器1/2/3/4作为一个复制,5/6/7/8作为一个复制
  2)创建分布式复制卷

 磁盘存储的平衡

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

  平衡布局是很有必要的,因为布局结构是静态的,当新的 bricks 加入现有卷,新创建的文件会分布到旧的 bricks 中,所以需要平衡布局结构,使新加入的 bricks 生效。布局平衡只是使新布局生效,并不会在新的布局中移动老的数据,如果你想在新布局生效后,重新平衡卷中的数据,还需要对卷中的数据进行平衡。
#在gv2的分布式复制卷的挂载目录中创建测试文件入下

[root@data-1-4 opt]# touch  {X..Z}
#新创建的文件只在老的brick中有,在新加入的brick中是没有的
[root@data-1-4 opt]# ll  /storage/brick1
总用量 0
[root@data-1-3 ~]# ll /storage/brick1
总用量 0
[root@data-1-1 ~]# ls  /storage/brick2
1  2  3  4  5  6  X  Y  Z
[root@data-1-2 ~]# ls /storage/brick2
1  2  3  4  5  6  X  Y  Z
# 从上面可以看到,新创建的文件还是在之前的 bricks 中,并没有分布中新加的 bricks 中
# 下面进行磁盘存储平衡
[root@data-1-2 ~]# gluster volume rebalance gv2 start
#查看平衡存储状态
[root@data-1-4 opt]# gluster volume rebalance gv2 status
# 查看磁盘存储平衡后文件在 bricks 中的分布情况
[root@data-1-3 ~]# ls  /storage/brick1
1  5  Y  Z
[root@data-1-4 opt]# ls  /storage/brick1
1  5  Y  Z
[root@data-1-1 ~]# ls  /storage/brick2
2  3  4  6  X
[root@data-1-2 ~]# ls /storage/brick2               
2  3  4  6  X

#从上面可以看出部分文件已经平衡到新加入的brick中了
每做一次扩容后都需要做一次磁盘平衡。 磁盘平衡是在万不得已的情况下再做的,一般再创建一个卷就可以了。

移除 brick

你可能想在线缩小卷的大小,例如:当硬件损坏或网络故障的时候,你可能想在卷中移除相关的 bricks。
注意:当你移除 bricks 的时候,你在 gluster 的挂载点将不能继续访问数据,只有配置文件中的信息移除后你才能继续访问 bricks 中的数据。当移除分布式复制卷或者分布式条带卷的时候,移除的 bricks 数目必须是 replica 或者 stripe 的倍数。
但是移除brick在生产环境中基本上不做的,没什么意思,如果是硬盘坏掉的话,直接换个好的硬盘即可,然后再对新的硬盘设置卷标识就可以使用了,后面会演示硬件故障或系统故障的解决办法。

#移除gv2中的data-1-3 data-1-4下的brick
[root@data-1-2 ~]# gluster volume  stop  gv2
[root@data-1-2 ~]# gluster volume remove-brick gv2 replica 2 data-1-3:/storage/brick1 data-1-4:/storage/brick1 force
[root@data-1-2 ~]# gluster  volume start  gv2
[root@data-1-3 ~]# ls  /storage/brick1
1  5  Y  Z
# 如果误操作删除了后,其实文件还在 /storage/brick1 里面的,加回来就可以了
[root@data-1-3 ~]# gluster volume  stop  gv2
[root@data-1-3 ~]# gluster volume add-brick  gv2  replica 2 data-1-3:/storage/brick1 data-1-4:/storage/brick1 force
[root@data-1-3 ~]# gluster volume info  gv2
  
Volume Name: gv2
Type: Distributed-Replicate
Volume ID: 27b85504-0a78-4dae-9332-056da410be2e
Status: Stopped
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: data-1-1:/storage/brick2
Brick2: data-1-2:/storage/brick2
Brick3: data-1-3:/storage/brick1
Brick4: data-1-4:/storage/brick1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

 删除卷

一般会用在命名不规范的时候才会删除

[root@data-1-3 ~]# gluster volume stop gv1
[root@data-1-3 ~]# gluster volume delete  gv1
[root@data-1-3 mnt]# ls  /var/lib/glusterd/vols
gv2  gv3  gv4


#复制卷的存储位置的数据如下:

[root@data-1-1 ~]# ls /storage/brick2
2  3  4  6  X
[root@data-1-2 ~]# ls /storage/brick2
2  3  4  6  X
#接着在data-1-1上删除一个数据来模拟复制卷数据不一致
[root@data-1-1 ~]# rm -f  /storage/brick2/X
[root@data-1-1 ~]# ls /storage/brick2
2  3  4  6 
[root@data-1-2 ~]# ls /storage/brick2
2  3  4  6  X
#通过访问这个复制卷的挂载点的数据来同步数据
[root@data-1-3 mnt]# mount  -t glusterfs 127.0.0.1:/gv2 /opt/
[root@data-1-3 mnt]# cat /opt/X
#这时候再看复制卷的数据是否同步成功
[root@data-1-1 ~]# ls /storage/brick2
2  3  4  6  X
[root@data-1-2 ~]# ls /storage/brick2
2  3  4  6  X


版权声明

本站《作品展示》类文章均为原创,转载必须注明出处,技术分享类文章部分来源于网络,版权归原作者所有,若侵权请留言。

发表评论