鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

基于GlusterFS设计 Docker(swarm) 集群存储方案

一个去中心化的分布式存储方案,搭建起来还比较容易哦。

关于GlusterFS

关于glusterFS的概念介绍见:基于 GlusterFS 实现 Docker 集群的分布式存储
本文主要是具体的实践。

部署GLusterFS集群

本地 vs docker容器

有两种部署方式:本地和容器。本地部署的优势是重启机器后不用手工挂载(在rc.local中挂载,根据启动顺序,此时gluster-server已经开始运行了)。
不过,本着all in docker的想法,再加上需要重启的情况很少,最终还是采用了基于docker容器部署的方式。

首先,找到了一个镜像:glusterfs/gluster_centos,有点老,而且用的人也少。不过,我们是基于实验目的,稳定性什么的可以暂时不考虑,如果对稳定性、性能有要求的话,还是推荐本地部署。

设置gluster数据存储文件夹

1
mkdir /data

启动多个glsuter实例

在若干节点上执行如下命令

1
2
3
4
5
6
7
8
9
10
11
docker run \
--restart always \
-v /var/gluster/configuration:/etc/glusterfs:z \
-v /var/gluster/metadata:/var/lib/glusterd:z \
-v /var/gluster/logs:/var/log/glusterfs:z \
-v /var/gluster/data:/data \
-d \
--privileged=true \
--net=host \
--name gluster_server \
gluster/gluster-centos

构建集群,创建卷,挂载

加入其他节点

进入某一个glsuter实例,输入如下命令,将其他节点依次加入集群:

1
gluster peer probe 192.168.1.x

检查集群节点

1
gluster peer status

会输出类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Number of Peers: 5

Hostname: 192.168.1.223
Uuid: 1932a722-888b-488e-bc31-eb362a978339
State: Peer in Cluster (Disconnected)

Hostname: 192.168.1.222
Uuid: efa31aab-d2ef-42be-8843-59e08151a717
State: Peer in Cluster (Disconnected)

Hostname: 192.168.1.225
Uuid: 3c44a093-46db-44d2-a1d2-f6e6ed5c0610
State: Peer in Cluster (Disconnected)

Hostname: 192.168.1.226
Uuid: 98b4bf29-8168-40e1-8953-803d59afea68
State: Peer in Cluster (Disconnected)

Hostname: 192.168.1.224
Uuid: 98979983-8bc8-4055-8d58-e0937c57eece
State: Peer in Cluster (Disconnected)

创建volumn

创建一个名为data的volumn,存储位置在/data/data 文件夹下

1
gluster volume create data replica 3 192.168.1.221:/data/data 192.168.1.222:/data/data 192.168.1.223:/data/data 192.168.1.224:/data/data 192.168.1.225:/data/data 192.168.1.226:/data/data
  • /data/data目录需要实现创建,每个节点都要
  • 需要指定这个卷的实际存储文件将分布在哪些节点上的哪些目录上,好长

启动volumn

1
gluster volume start data

主机安装gluster-client驱动

1
sudo apt-get install -y glusterfs-client

主机挂载glusterfs

有两种方式挂载:docker volumn plugin 和 nfs

docker volumn pulgin

以插件形式挂载的优点是不需要提前挂载,并且gluster集群启动前docker容器(我猜)不会创建成功。
如何安装插件及如何挂载见Docker GlusterFS Volume 插件

NFS

另外一种就是基于NFS协议挂载,这种方式对docker来说是透明的,启动脚本不变。

1
sudo mount -t glusterfs 192.168.1.221:/data /mnt/data  && sudo chmod 777 /mnt/data

docker容器先于gluster启动的解决思路

本文中一些过程或设计思路可能会出现docker容器先于gluster集群启动的情况,实际测试也发现在以docker容器形式启动gluster、nfs形式挂载的情况下,即使gluster尚未挂载,容器也会依旧启动成功。
针对这个问题,有一些思路。

  • 将gluster以docker stack的形式启动,并利用控制顺序的参数(忘了是哪个参数了。。。)
  • 本地部署gluster
  • 插件形式挂载

性能测试

比较3种文件系统的性能。
测试方法:
利用iozone

1
2
3
4
sudo apt -install -y iozone3
iozone -a -f /mnt/data/iozone_test -Rb test_gluster.xls
iozone -a -f /mnt/nfs/iozone_test -Rb test_nfs.xls
iozone -a -f /home/test/iozone_test -Rb test_local.xls
环境 参数等信息 结果(write)
NAS服务器(nfs) raid10,专用NFS服务器 113M/s~186M/s 详细
本地文件系统 淘汰的PC,4G,150G 68M/s~132M/s 详细
glusterFS文件系统 6节点,3备份 4.7M/s~8.5M/s 详细

gluster副本数为3,且运行在容器里,对性能会有一定影响
结果单位是Kb/s
根据测试结果,并结合实际。发现基于glusterFS的容器(wordpress)在访问时能感到明显的延迟。
综上,gluster在对性能有要求的场景不是非常适合(尽管它应该会有各种优化,但是它的架构决定速度很难超过本地读写速度,至少在单文件上)。