docker解决数据存储问题的方案

来源:互联网 发布:redis connect php 编辑:程序博客网 时间:2024/04/28 12:56

   

现在docker在云计算领域发展的势头很猛,各个公司不论大小都开始研究这个开源工具和技术,围绕docker的开源项目和创业公司也多如牛毛,就是一个简单管理container的web ui都有很多开源项目。不过还是一个人说的好,docker必须要是集群才好玩,而且越大越好玩。当然这是从玩技术的人眼中看待的问题,如果要真正用于生产还是有很多问题需要解决,很多方案需要设计,很多容错需要处理。今天看资料学习到了docker是怎样解决容器里面数据存储的问题的方案,以前做PAAS遇到过这种问题,不过自己也设计了相应的方案解决了问题。不过docker提供的volumes解决方案好像感觉更加完美和灵活一些,但是总体架构和思路其实都是一样的。

下面就根据自己的理解说说docker的volumes解决方案,官方文档有详细的使用说明,如果想要尝试一把,请自行google或者直接访问docker官方问题:https://docs.docker.com/userguide/dockervolumes/
在介绍具体方案以前先说说基于container运行的程序有什么样的数据存储问题。传统的软件开发人员都习惯了使用本地磁盘保存文件等数据,如果程序挂了以后重新启动以后那么数据还在(硬盘没坏的情况下),你可能会说为什么不使用云存储或者分布式文件系统或者数据库之类的,首先传统行业开发者可能还没有接受或者接触云存储系统和概念,其次小公司或者个人开发者不一定能够可以自己使用的云存储系统(第三方往往需要收费,而且不一定好用),数据库不合适存储文件。所以这些问题就需要PAAS平台(不管是公有还是私有,当然这里把docker也算在内了)去解决,如果PAAS平台是基于container运行应用的架构那么就存在本地数据存储的问题。因为PAAS平台需要合理利用资源,那么就需要动态调度运行程序到不同的主机上去运行,那么在应用被从一个container调度另一个container运行的时候,怎样保证数据也被同样迁移过去,而且迁移后的container和以前的container可能根本不在同一个主机上。那么数据迁移就是一个很大的问题,想要很优雅的解决这个问题不是那么容易的。
先看看我以前是怎么解决这个问题的(其实你会发现和docker的解决方案是那么惊人的相似),我们为开发者提供一个目录,承诺在这个目录下存放的文件保证在大多数情况下不会丢失(极端情况可能会丢失一些数据,例如硬盘坏掉而且这时数据刚好还没有成功备份,当然也有解决方案,不过需要牺牲用户体验和性能:就是同步写云存储),然后我们有一个文件系统的监听agent会监控这些目录的变化,如果在一个固定间隔时间内有文件变化就会定期把这个目录压缩成一个压缩文件然后上传云存储,当用户的应用被迁移到另一个container中去的时候在从云存储下载并且解压到相应目录即可。这里为了解决用户不停的写文件导致频繁的进行压缩和上传操作,我们设置了一个时间间隔来做这些操作。如果在这个时间间隔内有数据写入并且还没有执行压缩上传操作的时候主机挂掉或者硬盘坏掉那么部分数据丢失。为了解决上传过多文件到云存储每次都是覆盖以前老的文件,即一个应用只有一个压缩文件被存放在云存储。通过这种方案我们解决了基本上99%以上的数据存储问题。
  

下面我们在来看看docker的解决方案,他们的方案优越的一点就是在同一台主机的多个container之间可以共享数据。这个优点也是和他们的解决方案直接相关的,因为docker在创建启动container的时候可以指定一个主机目录作为volume,其他容器也可以继续使用这个volume,那么在同一个主机上的所有container都可以通过这个volume来共享数据。但是还是有上面同样的问题,一旦你的应用程序和数据关联起来以后在迁移这些container的时候(跨主机)就需要考虑数据迁移,docker没有提供完整的解决方案(也不能提供,除非你直接使用docker公司自己部署的系统),不过它提供了更加灵活的方式来支持,把这个交给使用docker系统的人和开发者。就是在启动或者创建或者使用volume的时候可以执行一些命令来操作这些数据,这些命令完全可以是自己开发的程序,例如把volume里面的数据备份到云存储系统。这个就是docker里面提供的volume的backup、restore和migrate功能。功能是提供了,怎么使用还是需要看各个使用者自己的需求和系统设计了。
 
对比了docker的数据存储方案和我们以前自己的方案,思路和架构基本上一样,我们也同样可以做到同主机的container共享数据,但是因为我们的需求并没有这一条所以就没做了。不过数据的备份和恢复始终是一门艺术(说艺术是因为可以做得很复杂很强大,也可以很简单,主要根据需求和数据的重要性),想要100%解决掉这个问题很难,特别是在持续增长的大数据领域尤为困难(同时保证数据高可靠性和高性能)。
  

刚开始说了docker集群越大越好玩,我想其中解决各个container数据存储的问题就是其中个玩耍的点吧。现在docker自身系统应该还不能夸机器的container共享数据吧,要做其实也简单,通过网络共享volume。但是为什么docker现在没有做(不知道是不是我不知道而已),我想这种需求有吗?如果有分布式文件系统就可以解决这个问题,只不过docker使用的volume是分布式文件系统的客户端吧。例如使用glusterfs。而且如果做了夸机器的container共享volume,那么docker的复杂度会增加不少,为了保证各种异常下的正确处理方法,一旦系统涉及到分布式,复杂度直接指数级别上涨。所以docker把夸机器的数据共享和迁移交给第三方去做吧。
  

以上分析纯属个人见解,如果有不同意见欢迎PK。

1 0