基于容器微服务的文件存储优化
基于多代理的容器微服务远程文件存储系统
摘要
本研究基于先前提出的远程文件存储系统,通过引入容器微服务来提升系统性能和可扩展性。本文提出的系统采用容器调用模块来完成主要功能,以提高性能并扩展功能。同时还提出了一种新颖的设计理念。
一、引言
随着个人数据数字化的持续发展趋势,系统用户对便捷且安全的数据存储功能的需求日益增加。因此,以网络硬盘为代表的远程存储变得流行起来。随着面向个人的商业网络存储服务逐渐成熟,用户存储数据容量的增长暴露了许多缺陷。为了向个人提供定制化远程存储服务,早前的一份报告[1]描述了一种基于多代理的个人远程存储系统。然而,该系统存在一些设计缺陷,包括性能和可扩展性不足。容器微服务技术可以改进该系统设计。
II. 早期工作
考虑到商业公司负责大部分网络存储服务,用户必须面对与服务持续时间和隐私相关的风险。早期的研究工作一直致力于解决上述困难。
早期工作研究了一种基于多智能体的个人远程存储系统。用户可以将文件上传到远程节点,文件会被分割成较小的部分,以实现更安全的冗余存储。此外,当用户上传同一文件的新更新版本时,系统模块会避免相同数据的传输。
关于基于CDC[2]算法的重复排除部分,CDC算法将整个文件分割为不同长度的子部分。它避免了微小变化影响过多子部分的情况。CDC的流程如下。
- 读取原始文件的最小长度(人工设置)字节作为原型块。
- 使用一个(长度远小于最小长度的)滑动窗口与块的末端对齐。
- 在滑动窗口中的值上使用哈希。如果结果与预设余数相同,则分割当前块。
- 如果结果不等于预设余数,则在原型块末尾追加文件的下一个字节,同时滑动窗口后移一个字节。
- 重复步骤3和4,直到块被分割或块长度等于最大长度(人工设置)。
- 返回步骤1以拆分下一个块,直到所有文件处理完毕。
在本研究中,我们特别考察了原系统中该文件处理组件的改进。改进主要体现在两个方面。
CDC算法需要消耗主机的大量计算资源,尤其是处理大量数据时。原始系统的多代理框架Dash允许开发者使用Java程序创建扩展,但在计算密集型任务中,Java的性能和效率不够理想。
CDC算法是重复排除的常见功能,在许多情况下无法获得理想效果。通过不同功能处理不同类型文件是实现最佳效果的最佳方式。然而,仅使用原始框架方法会使开发变得更加复杂。
III. 所提出的系统
该系统使用DASH容器调用模块,使代理能够将容器用作微服务。
操作系统级虚拟化,也称为容器化,是指内核允许多个隔离的用户空间实例存在的操作系统特性。
微服务是面向服务的架构(SOA)结构风格的一种变体,是一种将应用程序组织为松散耦合的服务集合的技术。在微服务架构中,服务是细粒度的,协议是轻量级的。
容器调用模块会将容器的相关信息(如可访问卷、映射端口和处理参数)注册到内部数据库中。用户只需使用少量程序即可调用容器资源,而无需进行与容器相关的额外处理。
调用程序使用网络端口向容器发送命令和处理数据(如果所使用的容器和代理位于同一主机,则仅发送命令),而不管容器的当前状态如何。容器管理模块将负责容器的调度,以避免频繁启动或关闭容器,从而影响系统性能。图2中的IPFS集群是一个支持容器在不同节点之间迁移的模块,本文的相关实验不涉及此部分。
对于该设计,我们将Go语言的CDC功能打包在容器中,并扩展了结构化数据处理模块。结构化数据是一种符合表格格式的数据类型,其不同行与列之间存在关系。结构化数据的常见示例包括Excel(微软公司)文件和SQL数据库。
根据相关工作,列导向函数在许多情况下优于列导向(结构化数据的CDC可被视为一种列导向函数)。列导向函数适用于并行计算。Go语言可以极大地简化并行程序开发。因此,扩展模块也使用Go语言开发。
| CPU | Intel™ Xeon™ CPU E5‐2603 v3 @1.6 GHz |
|---|---|
| 内存 | 32 GB |
| OS | Windows 10 专业版 64位 |
| Java | Oracle JDK 13 64位 |
| Go语言 | Go 11 Windows 64位 |
| Dash | 版本 1.9.7 |
| Docker | Docker Desktop Community 2.1.0.5 |
| Redis | Docker 官方镜像:最新版 |
| ## IV. 实验 | |
| 如文中所述,我们进行了两个实验,以比较Go语言CDC功能容器与原始原生Java CDC功能的性能,并验证结构化数据处理模块的正确性。 |
表1显示了实验环境:Docker CPU使用率最高;内存使用量为12 GB;Java和Go语言程序使用相同的算法和默认编译参数。
容器允许访问主机卷,并允许访问互联网以传输数据,同时还映射到一些主机端口。
第一次实验中处理的文件是一个124 MB的Docker镜像文件。输入文件和输出文件位于同一主机上。分割文件的哈希值保存在Redis数据库中,而Redis也在一个容器中运行。Java原生程序的处理时间为625,436毫秒;Go语言容器的处理时间为85,170毫秒。
如果容器化进程的功能与原生进程相当,它仍将损失一些性能。然而,程序本身提供的优势仍会带来更优的性能。
另一个实验采用了相同的环境。原始系统中不存在结构化数据处理模块。我们仅检查该模块的正确性。处理后的数据构成一个MySQL示例表,包含1000行和6列,其大小为62 KB。
扩展模块将表拆分为五个子表,每个子表包含一个主键和另一个数据列。
拆分时间为9.3477毫秒,重建时间为4.8355毫秒。子表数据正确。本实验程序未进行并行化。我们将在未来的研究中对大规模数据应用并行处理。
分割结果使得子表更易于处理。针对位图和函数化等不同子表数据结构,可以采用不同的去重方法。
五、结论
在本研究中,我们引入了一个容器调用模块到先前的系统中,以提升其性能并扩展功能。结果强调了早期实验中所采用设计的有效性。未来的研究将通过使用更多数据进行实验来检验集成系统。多重压缩将与结构化数据处理模块相结合。
更多推荐



所有评论(0)