所有文章

Docker - 数据持久化之GlusterFS

在用 Docker 搭建集群时,遇到一些数据持久化的问题,如果容器内的数据量大的话就不能将数据保存在容器内,否则不方便迁移,而如果使用 Volume 这样的方式挂载,那么假如容器挂掉以后,会在别的物理机上重新启起来(如 Swarm 模式),这样 Volume 方式就不生效了。所以容器内的数据的持久化是个必须解决的问题,相信很多人也遇到了这样的需求,本文就此问题介绍一些解决方法。

关于 GlusterFS

GlusterFS 是一种开源的分布式文件系统,易于横向扩展,性能高,可直接用 Linux 系统的 mount 命令从远程挂载到本地来使用,比如下面一条命令:

mount -t glusterfs glusterfs.server.com:/src-volume /mnt

说明: -t glusterfs 是指挂载格式为 glusterfs glusterfs.server.com 是指 glusterfs 服务所在的机器是址,这里换成IP当然也是可以的啦 /mnt 是一个本地目录 这样就将 glusterfs 服务器上的一个卷挂载到本地了,然后就可以直接对 /mnt 下的文件进行存取,是不是感觉很方便?那怎么把它跟 Docker 结合起来呢?有两种方式, Docker 的 plugin 功能和容器内部挂载方式

第一种:Docker 的 plugin 功能

Docker 本身提供了一个 plugin 的功能模块,允许用户安装各种插件来扩展 Docker 的功能,而 GlusterFS 就是被其支持的插件之一,安装此插件后,就可以在启动容器的时候挂载 GlusterFS 类型的 Volume ,那么具体怎么做呢?

部署 GlusterFS 服务,教程网上多的是,这里提供一篇: http://navyaijm.blog.51cto.com/4647068/1258250 我们假设有三台主机部署了 GlusterFS ,分别为:gfs-1 gfs-2 gfs-3

在你安装有 Docker 的主机上,安装 go 语言环境,如已安装请跳过此步,安装方法请转到: https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.1.md

用go命令下载 GlusterFS 插件

go get github.com/calavera/docker-volume-glusterfs

启动 GlusterFS 插件

sudo docker-volume-glusterfs -servers gfs-1:gfs-2:gfs-3

启动容器

sudo docker run --volume-driver glusterfs --volume datastore:/data alpine touch /data/helo

这样就将GlusterFS上的一个名为datastore的卷挂载到了你启动的容器中,这样即使你在另一台机器上再次启动容,数据也不会丢失

第二种:容器内部挂载方式

这次我们用容器的方式安装GlusterFS服务,这样就容易多了

[user@ser0 ~]$ docker run -tid --name glusterfs -h glusterfs \
--network overlay --privileged=true -v /home/data/src:/data \
paulczar/glusterfs glusterd --pid-file=/app/gluster.pid --log-file=- --no-daemon 
[user@ser0 ~]$ docker exec -ti glusterfs bash  # 进入 glusterfs 容器
root@glusterfs:/app# gluster volume create mydata glusterfs:/data force  # 创建一个名为mydata的卷
root@glusterfs:/app# gluster volume start mydata  # 启动卷
root@glusterfs:/app# gluster volume info  # 查看一下所有卷的情况
 
Volume Name: mydata 
Type: Distribute
Volume ID: 24b67e3c-c343-4b07-b65c-5b9481c396b7
Status: Started
Number of Bricks: 1
Transport-type: tcp
Bricks:
Brick1: glusterfs:/data/mydata

说明: –network overlay.com 这里指定了一个自定义网络,可以让不同物理机上的容器互相通信,如果你还不知道怎样实现,请看这篇教程:Docker 多主机通信之ZK -v /home/data/src:/data 用物理机上的一个目录来存储 GlusterFS 服务上的数据

启动你的容器

[user@ser0 ~]$ docker run -tid -h centos --network overlay centos:6.8 bash  # 容器也要加入 overlay 这个网络
[user@ser0 ~]$ docker exec -ti centos bash
[root@centos /]# yum install glusterfs glusterfs-fuse -y  # 在容器内安装GlusterFS客户端
[root@centos /]# mount -t glusterfs glusterfs:/your-gluster-volume /mnt  

这样就将glusterfs上的卷挂载到了容器内的 /mnt 目录下,容器挂掉后,数据不丢失,再次启动容器,再挂载即可

参考资料

  1. go语言下载与安装
  2. Docker插件-GlusterFS安装
  3. Gluster在物理机上的安装与使用
  4. 容器版的GlusterFS的下载与使用

编写日期:2017-01-15