ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

存储技术重构:从对象存储到向量数据库的AI时代演进

存储技术重构:从对象存储到向量数据库的AI时代演进 数据存储领域最近很奇怪所有人都在说数据是资产但存储团队在很多公司里依然是个“背锅部门”。业务一慢先看存储预算一砍先砍存储AI 项目要上线了才想起来存储不够用。这个曾经最底层的技术栈正在被两种力量撕扯——一边是传统存储厂商在价格战里越陷越深一边是 AI 带来的非结构化数据、向量数据、日志数据把旧架构逼到墙角。所以“腾讯能不能为存储续命”这个问题我觉得可以换一种问法存储行业需要的不是“续命”而是重新定义。腾讯作为同时拥有海量业务场景和云服务能力的公司能不能把存储从“卖空间的生意”变成“智能数据底座”这比“能不能救活某个产品”更有讨论价值。这篇文章不打算写成腾讯云产品说明书而是想从技术架构、开发者实操和行业趋势三个层面把“存储续命”这件事拆开来看。1. 存储并不缺需求缺的是重新定义先说一个直觉判断存储的需求不但没有萎缩反而在爆发。视频、图片、日志、备份、训练数据、Embedding 向量、消息队列积压随便一个业务系统每天都能产生几 GB 到几 TB 的数据。但问题是需求爆发并没有让存储行业过得更好。原因在于过去很长时间里存储被当成“资源买卖”——容量、IOPS、带宽按量计费谁便宜用谁。这种模式下存储厂商只能靠规模摊薄成本利润越来越薄同质化越来越严重。真正的困境不是没有数据而是数据存放在那里之后很难被再次利用。数据变成了“死数据”存储就沦为纯粹的支出项。这种局面在 AI 时代正在被打破。大模型训练需要海量样本RAG 应用需要向量检索数据分析需要数据湖合规审计需要长期归档。存储不再只是“放数据的地方”而是“让数据能被检索、被理解、被计算”的基础设施。谁能让存储里的数据产生二次价值谁就能定义下一代存储。所以存储缺的不是需求而是一套新的价值评估方式。这也是为什么腾讯这样的公司进入存储赛道比传统存储厂商更有想象力——因为它的云产品体系里不只有存储还有数据库、向量检索、大数据和 AI 服务存储可以嵌进一个更大的数据流水线里。2. 腾讯手里的“存储牌”从 COS 到向量数据库腾讯在存储上的布局可以从几个层次来看。最基础的是云硬盘和文件存储对应传统 IT 架构里的块存储和文件存储再往上是对象存储 COSCloud Object Storage这是现代云原生应用最常用的存储服务数据库侧有 TDSQL 这类分布式数据库到了 AI 阶段又有了向量数据库、数据湖服务等更贴近智能应用的存储形态。从技术演进看腾讯做存储其实有很深的业务土壤。微信、QQ、腾讯视频、游戏等业务长期在极端规模下处理海量图片、视频、聊天记录和游戏存档。这些真实场景把对象存储的可用性、成本和性能磨过很多遍之后再包装成云服务对外输出。这种“先用大规模业务验证再上云”的模式是腾讯云存储产品比较扎实的原因之一。但产品线全只是一方面更关键的是腾讯能不能把存储和 AI 的链条打通。举一个常见的场景一个 AI 应用要处理用户上传的图片流程通常是——图片先到 COS然后触发函数计算做 OCR 或 Embedding产生的向量数据入向量数据库原始文件留在对象存储最后通过数据库里的元数据关联。这个链路里存储不是独立的而是和计算、AI、数据库协同的。腾讯在“存储AI”这个方向上有天然优势因为它的云产品矩阵足够完整。我给这个问题的判断是腾讯手里的存储牌不少但真正的胜负手不是某款产品而是它能否把“存储”定义为 AI 时代的数据基础设施而不只是一堆容量桶。3. 开发者视角存储选择已经成为 AI 应用的基本功十年前存储选型是运维和 DBA 的事业务开发只要会写 SQL 就行。今天完全变了。你做一个问答机器人要知道用户文档存在对象存储还是向量数据库你做一个异步任务系统要搞清楚 Redis 是队列存储MySQL 是结果存储你甚至要判断一个文件是放本地磁盘、NAS 还是云上的 S3 兼容存储。从 CSDN 读者日常搜的技术词就能看出这种变化ISCSI 存储服务器搭建、NAS 存储、对象存储服务、Redis 消息队列加结果存储、Milvus 向量数据库、MySQL 字符类型字段存储、VMware 扩展 VMFS 存储卷……这些关键词说明开发者已经不是只是“用存储”而是开始“设计存储”。也就是说存储已经变成应用架构的一部分。对一个 AI 工程师来说如果你不懂对象存储的读写路径就可能把大模型文档一股脑塞进关系数据库最后查询慢到没法用如果你不懂向量索引就可能在全量扫描上浪费大量算力。存储不是底层基础设施问题它是你应用的性能预算问题。你在选择存储时其实是在选择一种成本模型、一种访问模式、一种一致性保证。块存储适合数据库这类需要低延迟读写的场景文件存储适合共享文件、代码库和多节点挂载对象存储适合海量非结构化文件用 HTTP 接口访问扩展性最好。向量数据库则是一类特殊存储它保存的是“语义坐标”解决的是“相似的是什么”的问题。下面这张表先把三种最基础的存储类型说清楚存储类型典型产品适合场景访问方式优势块存储云硬盘、本地盘数据库、虚拟机系统盘低延迟读写挂载给单台服务器性能稳定延迟低文件存储NAS、CFS多服务器共享文件、代码仓库、大数据分析标准文件协议 NFS/SMB易共享协议通用对象存储COS、S3图片视频、备份归档、数据湖静态网站HTTP/HTTPS REST API海量扩展成本低理解了这些基础差异就能理解后面所有存储架构选择。否则面对“这个文件放哪”“消息结果存哪”“向量放哪”这些问题你只能凭感觉拍板。4. 对象存储实战用 COS SDK 完成上传与生命周期配置对象存储是目前最值得开发者熟练掌握的一类存储因为 AI 应用里的图片、文档、模型文件、日志几乎都推荐放对象存储。这里以腾讯云 COS 为例写一个完整的 Python 实践流程帮助你从零跑通上传、下载和生命周期配置。4.1 环境准备需要准备 Python 3.8 以上环境并安装官方 SDKpip install cos-python-sdk-v5在腾讯云控制台创建存储桶后准备好自己的SecretId、SecretKey和存储桶所在的地域Region例如ap-guangzhou。注意不要把密钥硬编码到代码仓库本地调试可以用环境变量。4.2 初始化客户端并上传文件新建一个cos_demo.py文件# 文件路径cos_demo.py import os from qcloud_cos import CosConfig from qcloud_cos import CosS3Client secret_id os.environ.get(COS_SECRET_ID) secret_key os.environ.get(COS_SECRET_KEY) region ap-guangzhou bucket examplebucket-1250000000 config CosConfig(Regionregion, SecretIdsecret_id, SecretKeysecret_key) client CosS3Client(config) # 上传一个本地文件 response client.put_object( Bucketbucket, Bodyopen(local_file.png, rb), Keyimages/local_file.png, ContentTypeimage/png, StorageClassSTANDARD, ) print(上传结果 ETag:, response[ETag])这段代码的核心是put_object。Bucket是存储桶名称Key相当于对象在桶里的“路径”Body是文件流StorageClass可以指定STANDARD标准、STANDARD_IA低频或ARCHIVE归档。4.3 配置生命周期自动转低频生产环境中日志和备份文件往往需要定期归档或删除。在 COS 中可以通过生命周期规则自动完成比如 30 天后转为低频存储90 天后删除# 文件路径cos_lifecycle_demo.py from qcloud_cos import CosConfig from qcloud_cos import CosS3Client # 初始化方式和上文相同 config CosConfig(Regionap-guangzhou, SecretIdos.environ.get(COS_SECRET_ID), SecretKeyos.environ.get(COS_SECRET_KEY)) client CosS3Client(config) lifecycle_rule { Rule: [ { ID: log_archive_rule, Filter: {Prefix: logs/}, Status: Enabled, Transition: [ {Days: 30, StorageClass: STANDARD_IA}, {Days: 90, StorageClass: ARCHIVE} ], Expiration: {Days: 365} } ] } client.put_bucket_lifecycle_configuration( Bucketexamplebucket-1250000000, LifecycleConfigurationlifecycle_rule ) print(生命周期配置已更新)这样设置之后logs/前缀下的对象会按规则自动下沉到低频、归档最后到期删除。你可以用client.get_bucket_lifecycle_configuration验证规则是否生效也可以去控制台查看存储量变化。这个示例想说明一个关键点对象存储不是只能“存”它本身具备自动化的数据管理能力。不要把生命周期管理做成定时任务去写代码扫描删除靠存储原生的规则更可靠也更省钱。4.4 运行与验证运行方式很简单export COS_SECRET_ID你的SecretId export COS_SECRET_KEY你的SecretKey python cos_demo.py验证成功可以检查三点输出里有ETag控制台对应 Bucket 的images/路径下能看到文件如果配置了生命周期等待规则生效后文件存储类型会自动变成低频或归档。如果上传失败优先检查区域是否一致、密钥是否有效、存储桶名称是否正确。最常见的问题是 Bucket 名称填错COS 的 Bucket 名称包含自定义后缀例如-1250000000漏掉后缀会直接报 404。5. 数据库存储细节MySQL 字符类型与空值处理对象存储解决的是文件存储但业务数据的大量核心逻辑仍然离不开关系数据库。MySQL 是很多团队的首选但越是基础的东西越容易踩坑。这里聊两个高频问题字符类型字段怎么选以及 NULL 和空字符串到底有什么区别。5.1 CHAR 与 VARCHARCHAR 是定长字符串VARCHAR 是变长字符串。CHAR(8) 无论存多少字符都会占满 8 个字符的空间VARCHAR(8) 存几个字符就占几个字符另外需要 1 到 2 个字节记录长度。看起来 VARCHAR 更省空间但 CHAR 在频繁更新的场景下因为长度固定不容易产生碎片老旧版本的 MySQL 里性能可能更好。实际选择建议很短且长度基本固定的字段比如状态码、手机号、身份证号可以用 CHAR长度不定的字段比如昵称、备注、文章标题用 VARCHAR。5.2 NULL 和空字符串这是反复出现的经典问题。NULL 表示“没有值”空字符串表示“值为空字符串”。从存储角度看NULL 通常需要额外标记从查询和业务逻辑看差异更致命。CREATE TABLE user_profile ( id INT PRIMARY KEY, nickname VARCHAR(32) NOT NULL, bio VARCHAR(255), remark VARCHAR(255) DEFAULT ); INSERT INTO user_profile (id, nickname, bio, remark) VALUES (1, 小张, NULL, ), (2, 小王, 热爱存储技术, 老朋友);如果业务上有“查还没填写自我介绍的用户”的需求用WHERE bio 查不到 id1 的用户因为 NULL 不等于空字符串只能用WHERE bio IS NULL或WHERE bio IS NULL OR bio 。在真实项目里这种混淆会导致统计报表数量对不上或者在导出数据时出现空值拼接异常。我建议在表设计阶段就约定规则字符串字段默认用空字符串而不是 NULL能减少很多不必要的判断。除非字段语义上确实存在“有值/无值/未知”三种状态才保留 NULL。5.3 字符集和字节占用另外要注意字符集对存储大小的影响。UTF-8MB4 编码下一个中文汉字需要 3 到 4 个字节VARCHAR(255)的最大字节占用可能超过 1020 字节。所以设计表结构时要考虑行大小限制尤其是要建索引的字段。这里真正容易踩坑的地方是你以为VARCHAR(255)够用但加上索引后超过了索引长度限制导致建索引失败。6. 消息与结果分离Redis 做 Broker存储做 Backend异步任务是后端开发的标配而“把任务放进队列执行完把结果存下来”这件事本身就是存储问题。很多团队把 Redis 当成所有问题的解药任务队列也用 Redis结果存储也用 Redis最后内存被打满消息丢失结果无法追溯。更合理的架构是“消息与结果分离”Redis 只负责做 Broker消息队列本身保存的是被执行任务的地址和参数任务执行完成后结果写入数据库或对象存储作为持久化 Backend。以 Celery 为例标准配置可以这样写# 文件路径celery_app.py from celery import Celery app Celery( tasks, brokerredis://localhost:6379/0, backendredis://localhost:6379/1, ) app.task def process_file(file_key: str): # 假设这里做一次文件处理例如压缩或转码 return {status: success, file_key: file_key, size: 1024}这里 broker 和 backend 都是 Redis适合开发环境。但生产环境更推荐 backend 换成 MySQL、PostgreSQL或者任务结果本身就是大文件时直接写入对象存储。原因有三个Redis 是内存型存储结果太多会占用大量内存成本高。Redis 默认不保证持久化到磁盘消息和结果可能因为宕机丢失。业务分析需要按时间、状态查询历史任务结果Redis 的数据结构不适合复杂查询。判断标准很简单Redis 适合存 5 分钟内的“轻状态”不适合存需要追溯、统计、审计的“重结果”。把 Redis 当作纯粹的队列缓冲层把结果沉淀到真正的持久化存储这是异步任务架构里性价比最高的方案。7. 向量存储AI 时代的“新存储层”如果要说腾讯能不能为存储“续命”我认为最关键的变量是 AI而 AI 场景里增长最快的存储需求就是向量数据。先解释什么是向量存储。在 RAG、语义搜索、推荐系统里文本、图片、音视频会通过 Embedding 模型转换成几十到几千维的浮点数组这个数组就是“向量”。两个向量的距离越近语义越相似。传统数据库擅长精确匹配和范围查询但很难高效地回答“哪个向量跟我这个向量最像”所以出现了专门的向量数据库例如 Milvus、腾讯云 VectorDB。向量存储与普通存储的区别在于它不仅要保存数据还要保存“索引结构”。常见的索引方式包括 HNSW、IVF 等目的是在海量向量里快速找到最近的邻居。索引的选择直接决定召回率和查询延迟。实际项目中往往先用向量数据库做粗召回再用关系数据库做精过滤两者是配合关系不是谁替代谁。下面是一个结合 LangChain4j 和向量存储做 RAG 的 Java 集成思路。LangChain4j 是 Java 生态里的 LLM 应用开发框架它提供了统一的 EmbeddingStore 抽象通过配置就可以切换不同的向量存储实现。// 简化示例用于说明整体接入方式 // 具体 API 以官方版本为准 EmbeddingStoreTextSegment embeddingStore; EmbeddingModel embeddingModel; // 初始化向量存储和 Embedding 模型 // 将文档切分后生成向量并入库 TextSegment segment TextSegment.from(存储技术正在被AI重新定义); Embedding embedding embeddingModel.embed(segment).content(); embeddingStore.add(embedding, segment); // 查询时把用户问题转成向量再召回最相似的片段 Embedding queryEmbedding embeddingModel.embed(AI如何影响存储).content(); ListEmbeddingMatchTextSegment matches embeddingStore.findRelevant(queryEmbedding, 5); for (EmbeddingMatchTextSegment match : matches) { System.out.println(match.embedded().text()); }这个示例的价值在于你不需要自己关心向量索引和存储细节通过框架抽象就能把 Embedding 数据和文档片段写进去然后在问答时按语义召回。如果使用腾讯云 VectorDB只需要在配置里替换连接参数调用方式基本一致。给开发者的建议是向量存储这类技术迭代很快不同版本间的 API 差异很大。动手前先确认官方最新文档尤其注意索引参数、向量维度、主键设计这几个点。维度选错会导致兼容问题索引参数乱调会导致召回很差。8. 底层存储基础颗粒、NAS、ISCSI 与存储单位前面讲了很多云上和数据库层面的存储但底层的硬件存储知识也很重要。很多读者会搜索“通俗解释存储硬盘的构成”“颗粒是什么”这些其实是理解存储可靠性和成本的基础。先解决存储单位。计算机最小单位是位bit一个二进制位8 个 bit 组成一个字节Byte。往上通常是 1024 进制1 KB 1024 B1 MB 1024 KB1 GB 1024 MB1 TB 1024 GB。之所以强调这个是因为很多云存储的计费标准、监控告警里的“存储用量”都跟单位转换有关经常有人把 MB 和 TB 搞混。再来说 SSD 的颗粒。闪存颗粒分为 SLC、MLC、TLC、QLC 等类型区别是每个存储单元保存的 bit 数量。SLC 性能最好、寿命最长但单位成本最高QLC 容量大、成本低但写入寿命和性能相对弱。普通办公电脑用 TLC 很合适企业级数据库服务器则可能要选更高规格的颗粒。在数据中心场景NAS 和 ISCSI 是两种常见的选择。NAS 是文件级存储通过 NFS 或 SMB 协议共享文件适合多服务器共享同一份数据ISCSI 是块级存储把远端的存储空间映射成一块“虚拟硬盘”适合需要数据库这种块读写的场景。做虚拟化时VMware 的 VMFS 就是典型的共享文件系统扩展 VMFS 存储卷时要先在底层存储侧扩容 LUN再到 vSphere 里扩展文件系统顺序反了很容易出问题。这些底层知识虽然不像“对象存储”“向量数据库”那样新但决定了上层所有存储方案的性能和可靠性。你可以在云上用各种高级存储服务但最终帮你在故障时冷静排查的还是这些基础判断力。9. 存储常见问题与排查思路存储相关的故障往往很难排查因为问题可能出在应用、网络、存储服务、硬件多个层面。这里整理一份高频问题排查表覆盖对象存储、数据库、消息队列、向量存储和虚拟化场景。问题现象可能原因排查方式解决方案对象存储上传很慢未使用分片上传或网络链路不稳定检查文件大小和本地上传带宽查看 COS 控制台耗时统计大文件改分片上传确认客户端和 Bucket 在同一地域上传文件后 URL 打不开Bucket 权限为私有读写没有签名 URL检查 Bucket 权限配置尝试手动拼接签名 URL公开读取改用 CDN 或设置预签名 URL并配置最小权限MySQL 查不到“空值”数据NULL 和空字符串混淆用判断 NULL使用EXPLAIN查看查询条件检查字段值是否为 NULL查询改为IS NULL或使用COALESCE统一逻辑Redis 任务消息丢失使用 Redis 做持久化队列但未开持久化或内存淘汰策略触发查看 Redis 日志和maxmemory策略检查任务执行失败记录关键任务改用专业消息队列或开启 AOF/RDB 持久化任务结果写数据库向量检索结果明显不准向量维度不一致或索引参数不适合当前数据量检查 Embedding 模型输出维度对比索引配置统一向量维度根据数据规模调整索引类型和参数以官方文档为准VMFS 扩展失败底层 LUN 未扩容或在文件系统挂载时直接扩容登录存储阵列查看 LUN 大小再查看 vSphere 存储设备先扩容底层 LUN再在存储控制器和 vSphere 中依次识别并扩展NAS 挂载后写入性能极差网络延迟高或未使用高带宽链路使用iperf测试网络检查 NFS 协议版本升级网络带宽确认使用 NFSv4 及以上客户端参数调优排查的第一原则是先分界再看日志。确定问题是出在客户端、网络还是服务端。不要一上来就改配置那样往往会把问题搞得更复杂。10. 存储工程最佳实践结合前面所有内容这里总结几条可以直接用在项目里的存储工程实践。第一数据分层和生命周期管理一定要提前设计。冷热数据混在一起既浪费成本又降低访问性能。新写入的数据用标准存储或高性能块存储超过 30 天未访问的日志转为低频或归档存储定期清理过期备份。很多云存储都支持生命周期规则把它当成存储设计的一部分而不是事后补救。第二权限设计坚持最小权限原则。对象存储的密钥不要写在代码仓库使用临时密钥或环境变量数据库账号只授予应用所需的最小权限生产环境禁止使用 root 或超级管理员连接应用。安全问题的教训往往不是加密不够强而是权限给得太宽。第三备份和容灾不能省略。存储只是“一份数据”不等于安全。数据库要定期备份对象存储要利用跨地域复制或版本控制防止误删重要数据每月至少做一次恢复演练。只有验证过能恢复的备份才是有效的备份。第四监控和告警要落在业务指标上。除了存储容量和 IOPS 这些基础设施指标更要关注“上传成功率”“查询延迟 P99”“任务失败率”这些业务指标。容量告警最好设置分级例如使用 70%、85%、95% 三层告警分别对应观察、扩容准备、紧急扩容。第五版本兼容和迁移提前验证。无论是 MySQL 升级、COS 签名版本切换还是向量数据库索引变更都要在测试环境先做一遍完整的迁移演练确认数据一致性后再动生产环境。凡是涉及删除、覆盖、重新分片的操作先备份再操作最后验证。11. 回到标题腾讯能不能为存储续命现在回到最初的问题。我的判断是腾讯有能力加速存储的价值升级但“续命”这个说法有点一厢情愿。存储并没有走到寿命终点而是正在从“资源型技术”变成“智能型技术”。腾讯这样的云厂商入局会把存储和 AI、数据库、数据湖更紧密地绑在一起让存储从成本中心变成数据资产的一部分。但存储的命运不能押在任何一家公司身上。真正让存储“续命”的是 AI 时代整个数据范式转移非结构化数据需要对象存储语义相似需要向量存储海量日志需要分区存储跨地域容灾需要复制存储。这些需求不是腾讯创造的是技术趋势带来的。腾讯能做的是提供一个更顺手的产品组合让开发者更容易把存储用对。对开发者来说最大的机会在于存储已经变成 AI 应用的基本功。你会不会选对象存储决定了图片和文档的上传体验你会不会设计消息队列和结果存储决定了异步任务的可观测性你会不会用向量数据库决定了 RAG 应用的上限。把存储的原理和实践吃透这个能力不会过时反而会在 AI 时代越来越值钱。这篇文章覆盖了从腾讯存储布局、对象存储实战、MySQL 细节、消息队列后端到向量存储和底层硬件常识的内容。建议收藏备用下次做存储选型或排查存储问题时可以回来对照着看。真正重要的不是记住某个 API 或参数而是建立一套存储决策的思维框架先分类型再定访问模式再考虑成本最后落到监控和备份。
返回列表