很多人一提到对象存储,脑子里蹦出来的第一个词就是“上传下载”,好像这玩意儿就是个网盘一样。但真正做过后端架构、搞过日志归档、搭过静态资源服务的人都知道,对象存储早就不只是存文件那么简单了。它是云原生时代的基础设施,是二进制数据的终点站,也是降本增效最容易出成果的地方。
这篇就聊聊国内几款主流的对象存储类产品。我尽量不讲官网上那些复制粘贴就能看到的废话,更多是结合我自己实际部署、迁移、对接 Loki 日志系统、做 Grafana 可视化的真实经验,把选型逻辑、配置要点、踩坑经历一次说透。不管你是刚入门的新手,还是已经踩过几个坑的运维,都应该能从里面拿到点能直接用的东西。
1. 核心思路与产品矩阵拆解
1.1 对象存储解决的到底是什么问题
先花点时间把底层逻辑理清楚。很多人把对象存储和传统的文件存储(比如 NFS、SMB)搞混,觉得都是存文件,凭什么对象存储这几年火成这样。
区别在于数据组织方式。文件存储是树状目录结构,你得先建目录、再建子目录,然后才能在某个路径下放文件。对象存储没有目录的概念,它只有一个“桶”(Bucket)和一个“键”(Key),你把一个二进制对象丢进桶里,用唯一的 Key 去标识它。这个设计看起来简单,但带来了三个巨大的优势。
第一是无限扩展。文件存储的扩展性受限于挂载点、文件系统上限,但对象存储底层是分布式架构,数据分散在成百上千台服务器上,你几乎不用担心容量上限。第二是持久性。主流云厂商的对象存储产品,持久性设计目标基本都是 99.999999999%(11 个 9)或 99.9999999999%(12 个 9),这背后是多重副本和纠删码机制在兜底。第三是访问方式。对象存储基于 HTTP 协议,天然适合互联网访问,可以配合 CDN 做加速,可以生成临时签名 URL,可以设置读写权限,这些都是传统文件系统很难做到的。
所以对象存储最适合什么场景?静态资源托管(图片、视频、前端打包产物)、大数据备份归档、日志集中存储、云原生应用的持久化存储。尤其是日志场景,像 Grafana Loki 这类日志系统,天生就是为对象存储设计的。
1.2 国内主流对象存储产品全景与选型逻辑
国内做对象存储的厂商不少,但真正经历过大规模生产环境检验的,主要就是几家头部的。我按自己的使用频率和熟悉程度梳理一下。
阿里云 OSS(Object Storage Service)是市场占有率最高的一款,文档最全、生态最丰富、SDK 质量也最稳定。如果你公司本来就跑在阿里云上,那 OSS 基本是零思考成本的选择。它跟阿里云的 RAM 权限体系、CDN、KMS 加密、数据湖方案都能无缝打通,这是很大的加分项。
腾讯云 COS(Cloud Object Storage)是阿里云 OSS 最直接的竞争对手。我个人感觉 COS 在 API 兼容性上做得很好,很多开源工具(比如 rclone、MinIO Client)对它支持很完善。如果你用的是腾讯云的 CVM、CLB 那套体系,COS 的内网访问速度非常有优势,流量费用能省一大截。
华为云 OBS(Object Storage Service)在企业级市场和政务市场有很强的存在感。它的优势是安全合规体系做得扎实,等保、密评这些资质很全,对政企客户来说是刚需。另外 Obsidian(不是笔记软件那个 Obsidian,是华为云的对象存储客户端工具)确实好用,断点续传、大文件并发上传都很稳。
七牛云 Kodo 在移动端开发和图片处理领域有一批忠实用户。它早期的“上传即处理”理念(图片加水印、压缩、转格式)确实领先一步,很多移动 App 的 UGC 图片方案都跑在 Kodo 上。
自建 MinIO 则是另一条路线。它不是云厂商,而是一个开源的对象存储服务,可以部署在你自己的服务器上。对于数据合规要求极高、不想上公有云的公司来说,MinIO 是几乎唯一的选择。它兼容 AWS S3 API,这意味着你在 MinIO 上的代码,几乎可以无缝迁移到任何云厂商的对象存储上。
我自己的经验是,选型的时候不要只盯着单价,要算总账。存储费用只是小头,流量费、请求费、管理成本、迁移成本加起来才是大头。比如你有个日志系统每天产生 100GB 数据,存储一个月只要几百块,但如果日志被频繁查询,外网流出流量可能就是好几倍的存储费用。
1.3 为什么 Alloy → Loki → 对象存储这条链路越来越火
前面提到日志场景,这里展开讲一下为什么这条链路会成为标配。在云原生环境下,应用实例是弹性的、会漂移的,日志散落在各个 Pod 里,你不可能一台一台去翻。Grafana Loki 就是来解决这个问题的——它借鉴了 Prometheus 的设计理念,用标签来索引日志,日志内容本身不做全文索引,所以它的存储成本比 Elasticsearch 低得多。
Loki 的日志数据最终落在哪里?就落在对象存储桶里。一条完整的链路是:Grafana Alloy(新一代采集器,可以理解为 Promtail 的继任者)负责从各种来源采集日志,把日志推送到 Loki;Loki 把日志压缩、切块,写入对象存储桶;Grafana 再通过 Loki 的数据源实时查询展示。这个链路中,对象存储桶就是日志的最终归宿,承担了持久化存储的核心职责。
为什么 Loki 不把日志存在本地磁盘?因为云原生环境下,Loki 本身也应该是无状态的,数据应该交给对象存储这样的后端来持久化。这就好比你把钱存进银行,而不是压在自家床垫底下——床垫(本地磁盘)容量有限,还容易丢,银行(对象存储)容量无限,还有各种保障机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析与实操要点
2.1 存储桶与地域选择:第一个决定成本和性能的决策
不管选哪家产品,第一步都是创建存储桶。这一步有个关键决策点——地域(Region)的选择。
对象存储的地域选择原则很简单:离你的用户或你的计算资源越近越好。如果你的业务服务器部署在华东,存储桶就建在华东,这样走内网访问速度极快,还不产生流量费。如果你用阿里云 ECS 去访问华东地域的 OSS,走内网地址(oss-cn-shanghai-internal.aliyuncs.com),流量费用为零。这个细节很多人不知道,默认用了公网地址,结果月底账单出来吓一跳。
存储桶的读写权限也要分清。公开读、私有读,这是两个最基础的选项。存放网站静态资源的桶可以公开读,但存放日志、备份数据、用户隐私的桶必须私有,只能通过签名 URL 或特定身份来访问。我见过一个公司把数据库备份文件放在公开读的桶里,结果被爬虫扫到,整个备份文件被拖走,那场面……想起来都心疼。
另外还有一个在网络热词中容易被忽略的:桶的版本控制。如果你要存储的数据是日志、备份这类需要防止误删、误覆盖的数据,强烈建议开启版本控制。Loki 写入对象存储的日志块,如果被意外删除或覆盖,如果没有版本控制,数据就真的没了。开启了版本控制之后,你还能找回旧版本,多一道保险。
2.2 访问控制:AK/SK 与权限模型是安全的地基
对象存储的访问控制模型,是所有用户最容易出问题的地方。很多人开了桶之后就直接用根账号的 AccessKey(AK)和 SecretKey(SK)去调 API,这在大厂是绝对禁止的操作。
正确的做法是在云厂商的 RAM(阿里云)/ CAM(腾讯云)/ IAM(华为云)体系中创建子账号,只给这个子账号授予它需要的最小权限。比如你的日志服务组件只需要向某个桶的某个目录写入数据,那就只授权 oss:PutObject 到 logs-bucket/loki/ 这个前缀。这样即使 AK/SK 泄露了,攻击者能做的事也极其有限。
这里分享一个我自己的血泪教训:有次我在配置 Loki 对接阿里云 OSS 时,图省事直接用了一个拥有所有 OSS 权限的 RAM 子账号。后来这个子账号的密钥出现在了一次安全扫描的告警里。虽然最后排查确认没有数据泄露,但从那以后我所有项目的子账号权限都严格收敛到了最小集。
在权限模型上,还有一点要注意的是签名 URL。临时授权访问场景(比如给用户生成一个下载链接),不要直接暴露文件路径让他访问,而是用 SDK 生成一个带有效期的签名 URL。有效期设置得越短越安全,一般下载场景设置 10 到 30 分钟就足够了。
2.3 生命周期与归档:省钱的真正战场
大多数人用对象存储,只关注单价多少钱一 GB,但真正能让账单发生数量级变化的,是生命周期管理策略。
生命周期规则允许你对存储桶中的数据设置自动化管理策略。比如:日志数据 7 天内访问频繁,需要热存储;7 天到 90 天之间的数据偶尔会被查询,可以转为低频访问存储(费用约为标准存储的 40%);90 天以上的数据基本不会访问了,可以转为归档存储(费用约为标准存储的 20% 甚至更低)。
我参与过的一个项目里,日志数据从创建到最终归档到冷存储,一个月成本下降了将近 60%。这个效果不是靠换产品实现的,完全是靠生命周期规则做到的。
这里给一套我验证过的生命周期配置模板,适用于日志类数据:
| 时间段 | 存储类型 | 访问频率 | 费用级别 |
|---|---|---|---|
| 0 - 7 天 | 标准存储 | 高(实时查询) | 高 |
| 7 - 90 天 | 低频存储 | 中(月度排查) | 中 |
| 90 - 365 天 | 归档存储 | 低(合规审计) | 极低 |
| 365 天以上 | 自动删除 | 无 | 无 |
不同云厂商对“归档存储”的命名和恢复成本不一样。阿里云叫归档存储(OSS Archive),腾讯云叫归档存储(CAS/COS Archive),华为云叫归档存储(OBS Archive),但逻辑一致。恢复归档数据有等待时间,一般需要几分钟到几小时不等,所以只建议对确认不再频繁访问的数据做归档。
3. 实操过程与核心环节实现
3.1 环境准备:从零搭建 Alloy → Loki → 对象存储 → Grafana
说了这么多理论,终于到实操环节。这一节我以一套完整的日志系统链路为例——用 Grafana Alloy 采集日志,推到 Loki,Loki 把数据落到对象存储桶,最终由 Grafana 做可视化展示。
这套环境的搭建,你在国内任何一家主流云厂商的服务器上都能复现。我用的是一个标准 Linux 服务器(Ubuntu 22.04),假设你已经有了一个对象存储桶,名字叫 logs-bucket,并且准备好了有写入权限的 AK/SK。
首先安装 Grafana Alloy。Alloy 是 Grafana 实验室最新的采集器,你可以把它理解为 Promtail 的“进化版”,它同时支持日志、指标、链路追踪的采集。下载二进制、赋执行权限,然后写配置文件。
bash复制wget https://github.com/grafana/alloy/releases/download/v1.2.0/alloy-linux-amd64.zip
unzip alloy-linux-amd64.zip
sudo mv alloy /usr/local/bin/
然后写 Alloy 的配置文件,核心是把服务器上的日志文件采集出来,转发给 Loki:
hocon复制logging {
level = "info"
}
loki.write "default" {
endpoint {
url = "http://127.0.0.1:3100/loki/api/v1/push"
}
}
local.file_match "app_logs" {
path_targets = [
{__path__ = "/var/log/myapp/*.log", job = "myapp"},
]
}
loki.source.file "log_scrape" {
targets = local.file_match.app_logs.targets
forward_to = [loki.write.default.receiver]
}
3.2 Loki 配置对象存储桶作为后端
Loki 默认配置使用本地文件系统存储日志索引和日志块。但在生产环境,你要把日志块存到对象存储桶里。这里以兼容 S3 API 的对象存储为例,配置非常简单。
yaml复制# loki-config.yaml
auth_enabled: false
server:
http_listen_port: 3100
common:
compactor_address: http://loki:3100
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: s3
schema: v13
index:
prefix: index_
period: 24h
storage_config:
s3:
endpoint: oss-cn-shanghai-internal.aliyuncs.com # 内网入口
bucketnames: logs-bucket
region: cn-shanghai
access_key_id: ${OSS_ACCESS_KEY_ID}
secret_access_key: ${OSS_SECRET_ACCESS_KEY}
insecure: false
sse_encryption: false
compactor:
working_directory: /tmp/loki-compactor
把这份配置里的 endpoint、bucketnames、region、AK/SK 换成你自己的,启动 Loki 之后,日志数据就会源源不断地写入对象存储桶。我强烈建议你写个小脚本去桶里扫一眼,确认 logs-bucket/ 下确实出现了 Loki 写入的对象文件。
看到那些压缩块文件了吗?那就是你的业务日志。整个链路中最难以理解的部分,其实就是这样一句话:Loki 把所有日志变成了对象存储桶里的二进制对象。
3.3 Grafana 对接 Loki:日志秒级检索的最后一公里
Loki 的数据落到对象存储桶之后,你要怎么把它展示出来?答案是 Grafana。
Grafana 配置 Loki 作为数据源,然后添加一个日志看板。你可以用 LogQL(Loki 的查询语言)做各种筛选操作,比如查某个时间段内特定服务的所有 ERROR 日志,或者统计某个接口的请求量趋势。
hocon复制// data source config via grafana provisioning
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
url: http://127.0.0.1:3100
isDefault: true
在 Grafana 中新建一个 Dashboard,使用 Explore 模式,输入 {job="myapp"} |= "ERROR" 就能检索所有 ERROR 级别的日志。这种检索方式虽然不是全文检索,但对于绝大多数排查场景已经够用,更重要的是它省了巨大的存储和计算成本。
3.4 核心参数选型:周期、分片、保留期该怎么配
Loki 的性能和成本很大程度上取决于几个参数,理解它们才能避免踩坑。
首先是分片(shard)策略。Loki 会将日志流按小时切分,每个时间范围内的日志切成多个分片,分布到对象存储中。默认的分片大小是 512MB 左右,如果你的日志量大、查询频繁,适当调大分片数能提升并行查询能力,但也会增加对象存储的请求次数。
其次是保留期。Loki 配置中有 compactor 的保留期设置,你可以设置 7 天、30 天、90 天。配合对象存储的生命周期规则,可以实现“Loki 的索引只保留 7 天,但日志对象在对象存储中留 90 天”这种分层策略。
我建议新手先按默认参数跑,跑通之后再优化。因为参数优化依赖你实际的日志量和查询模式,没有一个万能配方。重要的是理解每个参数背后的含义,而不是盲目套别人的配置。
4. 常见问题与排查技巧实录
4.1 日志链路不工作?这几个问题请对号入座
这节整理我在实际部署 Alloy → Loki → 对象存储 → Grafana 链路时遇到的高频问题,以及对应的排查思路。
问题一:Loki 日志不写入对象存储桶
这是最常见的现象。Loki 进程起来了,Grafana 也能连上,但桶里什么都没有。这时候先看 Loki 日志,大概率是鉴权失败或者 endpoint 配置不对。测试方法很简单:手动用 s3cmd 或 aws cli 往同一个桶写一个文件,看能不能成功。
bash复制s3cmd put test.txt s3://logs-bucket/
如果能写入,说明 AK/SK 和 endpoint 没问题,问题出在 Loki 的配置上。如果写入失败,先检查 AK/SK 权限范围,是否限定了 IP、是否限制了前缀。不要一上来就怀疑代码,先验证基础设施。
问题二:日志延迟很大,Grafana 里半天看不到日志
Loki 默认的推送机制是批量攒批,攒够 1MB 或者 1 秒再推送。日志量特别小的时候,可能出现几十秒甚至几分钟的延迟。你可以调低 client 的 batchwait 和 batchsize 参数,但代价是增加请求次数和成本。对于日志量大的场景,默认配置完全够用。
问题三:Grafana 查询日志特别慢
先确认你的查询范围。LogQL 查询一定要带标签选择器和时间范围。如果你不带标签选择器,Loki 需要全量扫描对象存储桶里的全部索引,那效率必然很低。就像你在图书馆找一本书,却不知道它在哪个书架、哪个楼层,只能一层一层翻。
问题四:对象存储请求费用高得离谱
这个和查询模式强相关。频繁的、小范围的查询会产生大量 GET 请求。对生命周期配置了频繁转冷的数据,访问会触发费用更高的请求。解决办法是尽量让查询集中到最近的热时间段,并且合理设计生命周期,避免业务频繁访问冷数据。
4.2 一份实用的对象存储选型速查表
最后送上一份我自己总结的对象存储选型速查表,覆盖了几款主流产品在不同需求下的表现。
| 需求场景 | 首选产品 | 理由 |
|---|---|---|
| 阿里云生态内使用 | 阿里云 OSS | 与 ECS、RAM、CDN 集成最顺滑 |
| 腾讯云生态内使用 | 腾讯云 COS | 内网访问速率稳定,SDK 完善 |
| 政企合规、安全等级要求高 | 华为云 OBS | 安全合规体系最成熟 |
| UGC 图片视频处理 | 七牛云 Kodo | 图片处理管道成熟,移动端 SDK 体验好 |
| 数据必须留在私有环境 | 自建 MinIO | 完全私有部署,S3 兼容 |
| 开源日志数据接入 | 任意 S3 兼容产品 | Loki 等工具全支持 S3 协议 |
| 混合云容灾 | 多家同时使用 + rclone 同步 | 避免厂商锁定,提升容灾能力 |
4.3 给新手的三个过来人建议
第一,先跑通再优化。不要一上来就追求完美的配置和极致的性能,先用默认配置把 Alloy → Loki → 对象存储 → Grafana 这条链路跑通,能看到日志在 Grafana 里滚动,你就成功了一大半。然后再逐步调整参数。
第二,权限永远是第一位的。无论你在哪个云厂商,访问密钥一定要用最小权限的子账号,存储桶一定要设置保留策略,日志数据一定不能可公开访问。这不是危言耸听,日志数据里可能包含用户隐私、系统密码、内部 IP,泄露出去了就是安全事故。
第三,算账要算总账。对象存储的费用由三部分组成:存储容量费、请求费、流量费。很多人在选型时只看每 GB 的存储单价,忽略了请求次数和流量成本。日志系统每天会产生大量的 PUT 请求写入对象存储,请求费可能比存储费还高。所以选型时一定要结合你自己的流量模型来估算成本。
我在实际踩坑过程中最大的体会是:对象存储本身不复杂,复杂的是围绕它的整个生态系统——权限、生命周期、成本控制、组件集成。只要把这些环节搞明白了,你手里就多了一把能应对大量存储需求的好工具。这套日志链路搭好之后,后续你还可以把数据库备份、静态资源、数据分析结果全丢进去,一个桶管好整个公司的二进制数据资产,那种感觉确实很踏实。
