以 Docker 为代表的容器技术在云计算领域正扮演着越来越重要的角色,甚至一度被认为是虚拟化技术的替代品。企业级的容器应用常常需要将重要的数据持久化,方便在不同容器间共享。为了能够持久化数据以及共享容器间的数据,Docker 提出了 Volume 的概念。单机环境的数据卷难以满足 Docker 集群化的要求,因此需要引入分布式文件系统。目前开源的分布式文件系统有许多,例如 GFS,Ceph,HDFS,FastDFS,GlusterFS 等。
正常安装环境下云帮需要一个分布式文件系统,社区版默认使用NFS作为共享存储,如果你的环境中有分布式文件存储系统,需要使用dc-ctl set storage --mode custom 命令安装存储管理服务,然后再将你系统中的分布式存储挂载到 /grdata 目录。GlusterFS 支持文件接口, Ceph 支持块,文件,对象接口 本文的应用场景主要针对云帮如何使用GlusterFS,后期会介绍云帮如何支持块存储。
GlusterFS是一个开源的分布式文件系统,它可以将分散的存储空间聚合在一起,形成一个虚拟的存储池。它支持横向扩展(Scale-Out),可通过增加存储节点来提升整个系统的容量或性能,存储容量可扩展至PB级。这一扩展机制是目前的存储技术热点,能有效应对容量、性能等存储需求。GlusterFS除了支持分散存储(Distributed,将不同的文件放在不同的存储节点)之外,还支持镜像存储(Replicated,同一个文件存放在两个以上的存储节点) 和分片存储(Stripped,将一个文件分划分为多个固定长度的数据,分散存放在所有存储节点),其总体架构如下所示:
注意:GlusterFS会将集群的动态配置信息存放到/var/lib/glusterd文件中,需要确保这个文件可以写入,否则集群可能会发生问题,甚至下线,因此,需要确保系统某有足够的空间,不要让磁盘写满。
机器配置
主机名IP地址说明gfs01172.16.0.151存储节点01gfs02172.16.0.150存储节点01client172.16.0.152测试挂载的机器主要目的就是将磁盘格式化为xfs,作为glusterfs的底层存储文件系统.
(2个节点都需要执行): 注意: 这个示例是以/dev/sdb作为数据磁盘。 如果是Debian/Ubuntu系统可能没有mkfs.xfs命令,需要手动执行安装 apt-get install -y xfsprogs
mkfs.xfs -i size=512 /dev/sdb mkdir -p /grdata echo '/dev/sdb /grdata xfs defaults 1 2' >> /etc/fstab mount -a && mount命令执行完成后,你可以看到 /dev/sdb被挂载到了 /grdata 目录下。
root@gfs01:~# df -h ... /dev/sdb 97M 5.2M 92M 6% /grdata注意: 当使用主机名时,需要确保两台机器之间都设置了主机名(ip也可以)。
查看状态 # gluster peer status Number of Peers: 1 Hostname: gfs02 Uuid: c191b17b-ab9d-4b15-a70d-dcc92be067c9 State: Peer in Cluster (Connected)注意:一旦存储池建立之后,只有池中的信任成员可以添加新的节点,新服务器不能从外部加入到已经存在的池
#### 逻辑卷问题 逻辑卷由一个或多个存储块(Brick)组成,每个存储块对应存储池中的一个目录。 GlusterFS的基本类型有三个,分别是分散存储(Distributed,将不同的文件放在不同的存储块)、镜像存储(Replicated,同一个文件存放在两个以上的存储块,相当于RAID1) 和分片存储(Striped,将一个文件分划分为多个固定长度的数据,分散存放在所有存储块,相当于RAID0)。另外Distributed也可以跟Replicated和Striped组合形成新的类型。 这里简单介绍一些基本卷 ###### distribute volume 分布式卷 基于 Hash 算法将文件分布到所有 brick server,只是扩大了磁盘空间,不具备容错能力。由于distribute volume 使用本地文件系统,因此存取效率并没有提高,相反会因为网络通信的原因使用效率有所降低,另外本地存储设备的容量有限制,因此支持超大型文件会有一定难度。 ###### stripe volume 条带卷 类似 RAID0,文件分成数据块以 Round Robin 方式分布到 brick server 上,并发粒度是数据块,支持超大文件,大文件的读写性能高。 ###### replica volume 复制卷 文件同步复制到多个 brick 上,文件级 RAID1,具有容错能力,写性能下降,读性能提升。Replicated 模式,也称作 AFR(Auto File Replication),相当于 RAID1,即同一文件在多个镜像存储节点上保存多份,每个 replicated 子节点有着相同的目录结构和文件,replica volume 也是在容器存储中较为推崇的一种
gfs01和gfs02都需要执行
#这里跳过,已经建立了 mkdir -p /grdata/随便在一台机器上执行
root@gfs01:~# gluster volume create gv0 replica 2 gfs01:/grdata/ gfs02:/grdata/ volume create: gv0: success: please start the volume to access data # 使用Replicated的方式,建立一个名为gv0的卷(Volume),存储块(Brick)为2个,分别为gfs01:/grdata和gfs02:/grdata。启用逻辑卷
root@gfs01:~# gluster volume start gv0 volume start: gv0: success查看逻辑卷状态,确认状态为 “Started”
root@gfs01:~# gluster volume info Volume Name: gv0 Type: Replicate Volume ID: fde79f7d-294b-4eea-ac95-73bba9f24435 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport-type: tcp Bricks: Brick1: 172.16.0.151:/grdata Brick2: 172.16.0.150:/grdata Options Reconfigured: transport.address-family: inet performance.readdir-ahead: on nfs.disable: on注意:如果存储卷没有启动,需要/var/log/glusterfs 目录查看日志,文件通常是 glusterfs-glusterd.vol.log
在这一步中,我们使用client这台机器来挂载GlusterFS的存储卷进行测试。这台机器需要安装GlusterFS的client端程序,这里我们只使用client机器进行挂载和文件读写测试。
# 安装GlusterFS client程序 ### CentOS / RHEL ### yum install -y glusterfs-client ### Ubuntu / Debian ### apt-get install -y glusterfs-client # 将GlusterFS 存储卷挂载到/mnt mount -t glusterfs 172.16.0.151:/gv0 /grdata df -h 172.16.0.151:/gv0 97M 5.4M 92M 6% /grdata # 确认挂载结果 mount -t fuse.glusterfs 172.16.0.151:/gv0 on /grdata type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072) # 重启自动挂载 在/etc/fstab 172.16.0.151:/grdata /grdata glusterfs defaults,_netdev 0 0 # 将/var/log/messages复制到存储卷,循环执行100次 for i in `seq -w 1 100`; do cp -rp /var/log/messages /grdata/copy-test-$i; done先检查挂载点
ls -lA /mnt | wc -l可以看到 100个文件,在每个存储节点查看挂载点信息
ls -lA /grdata因为创建卷gv0的时候使用的是镜像存储(Replicated),所以在gv0上写入的文件应该同时出现在两个服务器的/grdata目录上,你可以看到每台机器都有100个文件,如果集群不是复制模式,每台机器的存储文件应该各50
到这里关于GlusterFS介绍就到这里了。那么云帮如何配置呢,很简单第一步 dc-ctl set storage –mode custom,接着按照如上的操作将系统中的分布式存储挂载到 /grdata 目录即可。