某对象存储元数据集群改造流水账

2024-03-27 04:04

本文主要是介绍某对象存储元数据集群改造流水账,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

软件产品:某厂商提供的不便具名的对象存储产品,核心底层技术源自HDFS和Amazon S3,元数据集群采用了基于MongoDB的NOSQL数据库产品和MySQL数据库产品相结合。

该产品的元数据逻辑示意图如下:

业务集群现状:当前第3期建设的元数据集群中存在约50亿条对象文件记录。当前共3期建成规模,元数据记录总量约400亿条。当前集群中对象文件的读写存在明显时延,读写性能已不满足业务应用方使用需求。

业务集群现状分析:

甲:当前业务集群主要是在跑大规模语言模型训练,产生的对象文件会冷档到对象存储集群,单个文件命名而成的元数据块未超过20B;

乙:当前对象存储系统所构成软件版本已不再维护,MySQL版本较低,数据库中单表过于庞大、且无法拆分;

丙:造成当前集群中对象文件读写延时的瓶颈在于MySQL数据库中单表过于庞大,此外NOSQL数据库的数据磁盘已利用了70%、NOSQL数据库消耗了其Host-OS内存的65%。

现场勘验结论:

简单地对当前集群进行元数据集群扩容无法缓解对象文件读写延时问题,需要对对象文件列表操作相关的MySQL数据库表做改造才能从根本上解决业务应用方反映的痛点。

对象存储软件存储系统组件分析:

NOSQL数据库主要以热存储的方式存储对象文件的名称、创建时间、存储桶位置、全局存储索引等索引信息,并以 K/V 的形式对外提供查询服务;

MySQL数据库主要记录存储桶内的对象文件索引信息,供文件列表类的操作使用。

换而言之,NOSQL存储了全局元数据信息、MySQL记录存储桶内的对象文件元数据信息。这种情况下,可以认为是NOSQL向MySQL同步了一部分元数据、对MySQL列表操作后的结果会来到NOSQL查找对象文件的具体存放位置。

有了这个认识,那么元数据集群的改造也就定向了:提升MySQL数据库表的链接查询速度和效率,增加NOSQL集群规模。因为提升MySQL数据库表的链接查询速率可以在前端页面快速返回被列表操作的对象文件集合;增加NOSQL集群规模可以缩小各节点上的 K/V记录的规模、进而缩短对象文件被查询的时间。

至此这个问题就变成了如何优化MySQL的数据库表结构、如何优化MySQL的数据库表链接查询速率的问题了。

在这个方向上大体有两种解决办法:

一是重新设计MySQL集群中的库表结构、并将对象文件的读写转移到新的MySQL集群上。这个操作需要分两个大的步骤来完成:第一步先完成新的兼容性库表的设计并搭建好新的MySQL集群,保证新写入的数据指向新建的MySQL集群、已有的数据继续从原来的MySQL集群上读写;第二步是构建一个新的中转数据池,把原有的MySQL集群中的数据同步到中转池中、并从中转池中清洗后写入到新建的MySQL集群,等到原有的数据和元数据同步完毕,再选择一个合适的操作窗口停止业务应用的读写、把尾数数据写入到新建的MySQL集群中、并更改数据访问路由到新建的MySQL集群上。

这个办法保守,能最大限度地保全原有数据的完整性,场内有过低版本MySQL向高版本MySQL迁移的案例,上线排期会比较短;但是操作周期长、操作过程频繁且复杂,既考验DBA对业务数据结构的规划设计能力、又考虑业务应用方对业务中断的容忍程度,很可能会遭遇业务应用方的否决。

二是采用路由网关的方式直接指向NOSQL数据库中的存储桶数据表。具体操作为新构建一个数据仓储池,把NOSQL中的数据记录持续被分到仓储池,在NOSQL节点上部署一个针对表的搜索引擎实例(如Elasticsearch、Lucene、Solr、ClickHouse等),在数据文件统一入口后添加一个路由网关(如Netflix Zuul),通过配置路由网关让文件列表操作直达存储桶所在的NOSQL节点,由搜索引擎对表文件进行查询并返回对象文件所在的物理位置。

这个办法比较激进,场内没有类似或相关的案例研究,理论上不会产生已有数据的丢失。优点是彻底解放了文件列表操作的数量限制(MySQL低版本上的表容纳量约为10亿条),只要路由网关和搜索引擎规模足够大,对象文件的列表操作几乎不会出现较大的延时。在做好路由流量切分的情况下,可以实现业务应用方的无感知操作。缺点是对原有集群改动幅度比较大,需要产品研发配合做针对性的代码修改,上线排期比较长。

当前这两种方案都做过了小规模的POC验证,但出于谨慎和客户方催期考虑,决定优先使用第一种方案对现有业务集群进行改造。

(等到该项目脱密或者我本人离岗脱密后,再行讨论这两种改造方案的细节内容。)

这篇关于某对象存储元数据集群改造流水账的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI