容器存储的今生来世

2024-03-25 18:10
文章标签 存储 容器 今生 来世

本文主要是介绍容器存储的今生来世,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

宽为限 紧用功 功夫到 滞塞通

容器生态现状

容器生态,对比2015年之前已经有重大变化,2015-2016年间,互联网、新兴企业都在将其Workload向容器环境迁。容器已不仅仅是两年前的部署工具,更是一种成熟的技术和平台,已经普遍的应用在公有云的运营和运维侧、PaaS的虚拟化主流技术中。伴随而来的容器持久化问题也必然会成为容器管理的核心之一。

近两年,特别是2016年容器持久化生态有很快的发展,例如EMC、NetAPP、Huawei的企业存储厂商积极拥抱容器生态,纷纷推出其Docker Volume-plugin实现,特别像EMC更是打造其开源社区EMC Code,并在今年5、6月陆续发布其容器管控面生态Polly和Libstorage,意图将其企业存储更好地融入Docker生态。新兴存储厂商更是抓住容器可能颠覆云基础设施的机会推出针对容器定制的存储,继2015年的Portworx,2016年CoreOS、StorageOS也纷纷发布其容器存储产品.

面对容器持久化生态,应该如何分类,未来趋势如何,我们不妨梳理并大胆预测下:

形态1: Data-volume + Volume-plugin

最原始的方式不一定是最有效的,Docker发布之初便考虑到数据持久化问题,提供了Data-volume的支持,但最初的数据卷只是本地卷,不支持外置存储,直到1.8版本才提供了数据卷插件。原因可能是Docker最早的定位只是Stateless,但后来发现本地无法满足有状态服务的需求,又或者是Docker考虑过于超前,认为Cloud-native的应用应该向无状态存储API迁移,数据卷不应该作为主存储吧。总之卷插件来的很晚,但这并不妨碍存储厂商趋之若鹜,大量的卷插件雨后春笋,2016年上半年统计就有40余个,如ClusterHQ的Flocker、Rancher的Convoy、EMC的REX-Ray,以及华为的Fuxi等等。

卷插件最大的问题在于,它只是Docker公司解决持久化的简单方案,卷插件仅提供几个简单的卷管理接口(当然你可以扩展,但那不是标准),让存储管控面对接,但并未在数据面上做任何优化。当然这解决了有无问题,传统存储可以通过卷插件给容器发放数据卷了,但问题还在后面,存储发放的效率、如何适配Cloud-native的高弹性要求,如何在数据提供主机高密度的容器存储发放,以及更高的并发性能,这些问题还是原地踏步。

— 典型卷插件实现-Flocker:

这里写图片描述

形态2: Container-define

显然有些容器生态的厂商意识到了卷插件的局限,便有了后面的第二阶段,不能仅依靠Docker的Volume-plugin,还需要结合存储数据面的能力,针对容器的特征定制管控面和数据面特性,或者充分发挥企业存储的高级特性,都是打破卷插件束缚的思路。这里面我们看到有CoreOS,基于ServerSAN和容器生态的kv-store etcd打造的容器定义存储torus,相比单纯的控制面,torus能够更好的与k8s调度集成,并且具有更快的发放和伸缩能力。 容器定义存储最大的特点在于融合了控制面和数据面能力,并且结合容器特点定制,相对单纯控制面更具优势,产品形态以ServerSAN为主。不足在于存储本身不是cloud-native的,与容器本身还是在两个层面,仍需要解决两层间的调度联动,适配cloud-native的能力。

— 典型容器定义存储-torus:

这里写图片描述

形态3:STaaC

STaaC(Storage as a Container),存储即容器。应该是目前最贴合容器的存储了,集数据面、控制面与一身,更重要的是存储自身也是容器化的,可以随应用容器一起发布,这也天然的解决了Cloud-native应用业务变化不可预期,弹性要求高的问题,相比容器定义存储更具优势。一些典型的STaaC如:Portworx、StorageOS、BlockBridge等。特点是控制面+数据面,并且自身是Cloud-native形态。缺点可以认为暂无,但下个形态中我们会看到还有优化的空间。

— 典型STaaC-Portworx:

形态4: Container-aware

之前的3个形态,虽然都有不同程度的演进,但没有本质的改变,即仍是以传统的存储形态给容器使用:将卷、文件挂载到容器宿主机,再通过Docker引擎将挂载目录映射给容器数据卷,对于具有高密部署、微服务架构的Cloud-native应用来说,单主机会挂载非常多的容器,更重要的是宿主机的卷会变得越来越难于管理,数据卷的放速度也很难保证,要知道容器毫秒级的启动速度可能因为存储的发放而变成秒或数十秒,那么应用如果是几百或上千个容器的启动那问题是不能容忍的,便会丧失容器相对虚拟化敏捷的优势。

Container-aware应该是什么?除了应该具备前3种形态的特点之外,应该还具备感知容器的能力,容器粒度的能力,而不是将这部分能力卸载到主机侧,可以参考虚拟化存储的例子:Tintri。Tintri定位于虚拟化感知,不同于传统虚拟化存储大LUN,小LUN的方式,Tintri直接将整个存储集群定义为一个VMstore,并且映射给vmware的一个Datastore,后面在这个Datastore创建的虚拟机不需要在关注卷,Tintri摒弃了卷的概念,而是通过自身数据面去感知VM,并实现了VM-Level的管理、分析、保护和迁移能力,这才是真正面向一种虚拟化技术的存储最佳方式。容器生态也是同理的,若能实现面向容器引擎甚至Pod集群的ContainerStore,而不是在Container这一级,将大大减少容器存储的粒度,并实现数据面的容器感知能力,基于感知容器数据卷实现Container-level的管理、分析、保护、迁移,才是容器存储的最佳形态。 Container-aware兼具之前3种形态的特点,管控面+数据面,形态上兼具Cloud-native+ContainerStore。

— Tintri的VM-aware参考:

这里写图片描述

4个形态的演进总结:

这里写图片描述

尽头?

IT云技术瞬息万变,伴随着IoT、AI、VR\AR这些新兴应用的未来我们不得而知,或许未来的应用存储都像无状态转型,S3、MQ、NoSQL、EventHub,这些将成为主存储也未尝不可,存储则只是一个数据总线或共享数据池,非结构化数据完全替代结构化数据,那时候可能不再需要不需要容器存储了。

-

站在巨人的肩膀上

本文转载的网络地址
http://mervinsun.github.io/2016/11/26/container-storage-trend/

这篇关于容器存储的今生来世的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845833

相关文章

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点