文章内容
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
磁盘名:例如
d1或sdb1。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-OriginValue (值):
*(或者你设置的域名https://www.example.com)
3. 数据读取流程(为什么会丢失?)
理解了这个存储位置,你就能彻底明白为什么你重启后会出现 CORS 丢失的问题了:
Nginx 请求:用户浏览器发起请求。
Proxy Server:Swift 代理服务器接收请求。
Memcached (缓存层):Proxy 先去内存缓存(Memcached)里找:“这个桶有 CORS 设置吗?”
如果有:直接返回(速度快)。
如果无:进入第 4 步。
Container Server (应用层):Proxy 问容器服务:“去硬盘里帮我查查这个桶的元数据”。
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 版本表结构略有不同
具体操作截图:

其它相关推荐:
评论列表