数据持久化之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 目录下,容器挂掉后,数据不丢失,再次启动容器,再挂载即可