从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器。
无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的 web 服务器。
有状态是指容器需要保存数据,而且数据会发生变化,访问的结果依赖之前请求的处理结果,最典型的就是数据库服务器。
简单来讲,状态(state)就是数据,如果容器需要处理并存储数据,它就是有状态的,反之则无状态。
对于有状态的容器,如何保存数据呢?
前面在 Docker 存储章节我们学习到 data volume 可以存储容器的状态,不过当时讨论的 volume 其本质是 Docker 主机 本地 的目录。
本地目录就存在一个隐患:如果 Docker Host 宕机了,如何恢复容器?
一个办法就是定期备份数据,但这种方案还是会丢失从上次备份到宕机这段时间的数据。更好的方案是由专门的 storage provider 提供 volume,Docker 从 provider 那里获取 volume 并挂载到容器。这样即使 Host 挂了,也可以立刻在其他可用 Host 上启动相同镜像的容器,挂载之前使用的 volume,这样就不会有数据丢失。
本章将详细讨论如何实现跨 Docker 主机管理 data volume。
假设有两个 Dokcer 主机,Host1 运行了一个 MySQL 容器,为了保护数据,data volume 由 storage provider 提供,如下图所示。
当 Host1 发生故障,我们会在 Host2 上启动相同的 MySQL 镜像,并挂载 data volume。
Docker 是如何实现这个跨主机管理 data volume 方案的呢?
答案是 volume driver。
任何一个 data volume 都是由 driver 管理的,创建 volume 时如果不特别指定,将使用 <code>local</code> 类型的 driver,即从 Docker Host 的本地目录中分配存储空间。如果要支持跨主机的 volume,则需要使用第三方 driver。
我们这里将选择 Rex-Ray driver,其原因是:
Rex-Ray 是开源的,而且社区活跃。
支持多种 backend,VirtualBox 的 Virtual Media、Amazon EBS、Ceph RBD、OpenStack Cinder 等。
支持多种操作系统,Ubuntu、CentOS、RHEL 和 CoreOS。
支持多种容器编排引擎,Docker Swarm、Kubernetes 和 Mesos。
Rex-Ray 安装使用方法非常简单。
下一节我们开始实践 Rex-Ray。
本文转自CloudMan6 51CTO博客,原文链接:http://blog.51cto.com/cloudman/1969005