文章内容

2026/1/14 18:09:46,作 者: 黄兵

OpenStack Swift 存储桶的 CORS 设置保存在那里的?

CORS 设置保存在 Container Server(容器服务器)的 SQLite 数据库文件中。

不是保存在配置文件里,也不是保存在某个全局的注册表中,而是以 Metadata(元数据) 的形式,存储在具体的磁盘文件里。

以下是详细的存储路径和结构剖析:

1. 物理位置:在磁盘的哪里?

在你的存储节点(Storage Node)上,CORS 数据位于 /srv/node 挂载点下的 .db 文件中。

具体路径通常长这样: /srv/node/[磁盘名]/containers/[分区号]/[哈希后缀]/[哈希]/[哈希].db

  • 磁盘名:例如 d1sdb1

  • containers:表示这是容器服务的数据。

  • 后缀/哈希:Swift 使用一致性哈希算法计算出容器属于哪个分区,最终映射到一个具体的目录。

举个例子: 如果你的存储桶叫 cloud-1,它的数据库文件可能藏在这里: /srv/node/d1/containers/245/a8f/981...a8f/981...a8f.db

2. 逻辑位置:在数据库的哪里?

这个 .db 文件是一个标准的 SQLite 数据库。CORS 设置存储在其中的 container_info 或类似的元数据表中。

它是以 Key-Value(键值对) 的形式存在的:

  • Key (键): X-Container-Meta-Access-Control-Allow-Origin

  • Value (值): * (或者你设置的域名 https://www.example.com)

3. 数据读取流程(为什么会丢失?)

理解了这个存储位置,你就能彻底明白为什么你重启后会出现 CORS 丢失的问题了:

  1. Nginx 请求:用户浏览器发起请求。

  2. Proxy Server:Swift 代理服务器接收请求。

  3. Memcached (缓存层):Proxy 先去内存缓存(Memcached)里找:“这个桶有 CORS 设置吗?”

    • 如果有:直接返回(速度快)。

    • 如果无:进入第 4 步。

  4. Container Server (应用层):Proxy 问容器服务:“去硬盘里帮我查查这个桶的元数据”。

  5. SQLite DB (硬盘层):容器服务去 /srv/node/d1/containers/.../xxx.db 读取数据。

💥 事故回放: 当你重启后,Memcached 空了(第 3 步失效)。Proxy 被迫去执行第 4、5 步。 但是,你的硬盘 /srv/node/d1 还没挂载好! Container Server 看到的 /srv/node/d1 是一个空的文件夹(属于根分区),里面当然没有那个 .db 文件。

于是,Container Server 告诉 Proxy:“没找到这个桶的元数据(或者是个新桶)”。 Proxy 就把这个“空结果”又写回了 Memcached。

哪怕过了一分钟,你的硬盘挂载好了,因为 Memcached 里已经存了“无 CORS”的缓存,Proxy 依然会返回错误,直到缓存过期或你手动重置。

4. 如何验证?(硬核调试方法)

如果你想亲眼看到这个设置,可以在服务器上使用 sqlite3 命令查看(仅供学习,生产环境请勿乱改):

    找到数据库文件(假设你知道桶的哈希,或者直接搜索):

    find /srv/node/d1/containers -name "*.db"

    打开数据库

    sqlite3 /path/to/your/container.db

    查询元数据

    SELECT * FROM container_stat;
    -- 或者查看特定元数据表,不同 Swift 版本表结构略有不同

    具体操作截图:



    其它相关推荐:

    1、OpenStack Swift 202 代码

    2、OpenStack Swift 使用 logrotate 自动分割日志

    3、OpenStack Swift 单节点构造文件添加磁盘

    4、OpenStack Swift 单节点部署

    5、Ubuntu 24.04 上安装 OpenStack Swift

    分享到:

    发表评论

    评论列表