zoukankan      html  css  js  c++  java
  • docker解决数据存储问题的方案

       

    如今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可能根本不在同一个主机上。

    那么数据迁移就是一个非常大的问题。想要非常优雅的解决问题不是那么easy的。
    先看看我曾经是怎么解决问题的(事实上你会发现和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共享数据。可是由于我们的需求并没有这一条所以就没做了。只是数据的备份和恢复始终是一门艺术(说艺术是由于能够做得非常复杂非常强大,也能够非常easy,主要依据需求和数据的重要性),想要100%解决掉这个问题非常难。特别是在持续增长的大数据领域尤为困难(同一时候保证数据高可靠性和高性能)。
      

    刚開始说了docker集群越大越好玩,我想当中解决各个container数据存储的问题就是当中个玩耍的点吧。如今docker自身系统应该还不能夸机器的container共享数据吧,要做事实上也简单,通过网络共享volume。可是为什么docker如今没有做(不知道是不是我不知道而已),我想这样的需求有吗?假设有分布式文件系统就能够解决问题,仅仅只是docker使用的volume是分布式文件系统的client吧。

    比如使用glusterfs。并且假设做了夸机器的container共享volume,那么docker的复杂度会添加不少,为了保证各种异常下的正确处理方法,一旦系统涉及到分布式,复杂度直接指数级别上涨。

    所以docker把夸机器的数据共享和迁移交给第三方去做吧。
      

    以上分析纯属个人见解。假设有不允许见欢迎PK。

  • 相关阅读:
    join函数——Gevent源码分析
    代理上网(ssh 动态端口转发)
    内核热patch
    技术债
    mysql 隔离级别与间隙锁等
    python type
    django : related_name and related_query_name
    ssh 卡主
    logistics regression
    __new__ 和 __init__
  • 原文地址:https://www.cnblogs.com/llguanli/p/7248315.html
Copyright © 2011-2022 走看看