一个去中心化的分布式存储方案,搭建起来还比较容易哦。
关于GlusterFS
关于glusterFS的概念介绍见:基于 GlusterFS 实现 Docker 集群的分布式存储
本文主要是具体的实践。
部署GLusterFS集群
本地 vs docker容器
有两种部署方式:本地和容器。本地部署的优势是重启机器后不用手工挂载(在rc.local中挂载,根据启动顺序,此时gluster-server已经开始运行了)。
不过,本着all in docker的想法,再加上需要重启的情况很少,最终还是采用了基于docker容器部署的方式。
首先,找到了一个镜像:glusterfs/gluster_centos,有点老,而且用的人也少。不过,我们是基于实验目的,稳定性什么的可以暂时不考虑,如果对稳定性、性能有要求的话,还是推荐本地部署。
设置gluster数据存储文件夹
1 | mkdir /data |
启动多个glsuter实例
在若干节点上执行如下命令
1 | docker run \ |
构建集群,创建卷,挂载
加入其他节点
进入某一个glsuter实例,输入如下命令,将其他节点依次加入集群:
1 | gluster peer probe 192.168.1.x |
检查集群节点
1 | gluster peer status |
会输出类似:
1 | Number of Peers: 5 |
创建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 | sudo apt -install -y iozone3 |
环境 | 参数等信息 | 结果(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在对性能有要求的场景不是非常适合(尽管它应该会有各种优化,但是它的架构决定速度很难超过本地读写速度,至少在单文件上)。