Casa是 "内容可寻址存储档案 "的意思,在浪漫主义语言中也有 "家 "的意思,它是我们正在宣布的一项在线服务,以内容可寻址的方式存储软件包。
它是我们朝着可重复构建和不可改变的基础设施的大方向迈出的自然的下一步。它的第一个应用是在最流行的Haskell构建工具Stack中使用。这个工具的master 分支现在正从这个服务中下载其包的索引、元数据和内容。
虽然它的主要用例是针对Haskell的,但它可以很容易地适用于其他语言,如Rust的Cargo包管理器。这篇文章将重点介绍Casa的总体情况。下周,我们将深入探讨它对Haskell构建工具的影响。
内容可寻址存储简述
CAS主要是一个寻址系统。
- 当你在存储系统中存储内容时,你通过对内容的散列生成一个密钥,例如SHA256。
- 当你想检索内容时,你使用这个SHA256密钥。
因为SHA256只指这一块内容,你可以验证你得到的内容就是你最初放进去的内容。这个逻辑是这样的。
- 将 "你好,世界!"放入系统。
- 钥匙是。
dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f - 后来,从系统中请求
dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f。 - 收回
content,检查 sha256sum(content) =dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f。 - 如果是,很好!如果不是,拒绝这个内容并引发一个错误。
这就是Casa的工作方式。其他使用这种寻址方式的流行系统有 IPFS,当然还有 Git。
Casa端点
有一个简单的下载服务的入口点。
- GET
https://casa.fpcomplete.com/<your key>-- 用curl轻松抓取一个密钥的内容。这没有一个与之相关的API版本,因为它只接受一个密钥并返回一个blob。
这两个是有版本的,因为它们接受并返回JSON/二进制格式,这些格式在未来可能会改变。
- GET
https://casa.fpcomplete.com/v1/metadata/<your key>-- 显示一个值的元数据。 - POST
https://casa.fpcomplete.com/v1/pull-- 我们以二进制格式(32字节为密钥,8字节为长度)最多发送1000个密钥-长度对,服务器将以密钥-内容对的形式将所有内容流回客户端。
超过1000个密钥,客户端必须为下一个1000个密钥单独提出请求,等等。这是由于请求的长度限制,有意应用于服务器的保护。
受保护的上传
上传是在端点/v1/push 。这类似于pull格式,但发送的是长度-内容对。服务器以流式方式将这些内容插入到数据库中。
目前的工作流程是,档案馆的运营者设置了一个常规的推送系统,在一个不公开的独立端口上访问casa。在Haskell案例中,我们每15分钟从Stackage和Hackage(两个Haskell软件包库)中提取,并将内容推送到Casa。
此外,我们不以tarballs的形式上传软件包,而是上传单个文件。通过这种方法,我们消除了服务器上大量的重复工作。大多数新上传的软件包只改变了几个文件,而一个升级的用户却不得不重新下载整个软件包。
服务特点
以下是使用CAS处理软件包数据的一些优势。
- 它是可重复的。你总是能得到你想要的包。
- 它在线路上是安全的;中间人攻击在没有改变SHA256的情况下无法改变软件包,这可以被微不足道地拒绝。然而,我们通过一个TLS加密的HTTP连接来保护隐私。
- 你不需要相信服务器。它可能被黑客攻击,如果它给你的内容有正确的SHA256摘要,你仍然可以信任它的内容。
- 客户端受到保护,不会受到中间人的DoS攻击,中间人可能会发送一个无限大的blob作为回报;客户端已经知道blob的长度,所以它可以流式地只消费这个长度,并根据SHA256进行检查。
- 它本身就是可镜像的。因为我们不需要信任服务器,任何人都可以成为一个镜像。
回顾一下,每个独特的blob都是一个包、一个cabal文件、一个快照或一个树渲染成的二进制blob中的文件,这就消除了很多冗余。Casa的存储需求是微不足道的。目前有大约1,000,000个独特的blob(最大的文件为46MB)。我们不是与上传的软件包版本数量呈线性增长,而是与独特的文件呈线性增长。
公司内部案例
公司经常在他们自己的网络(或IP限制的公共服务器)上运行他们自己的软件包存档,并将他们的自定义软件包上传到它,供公司的每个人使用。
这里有一些你可能想这样做的原因。
- 一些组织出于安全和保留IP的考虑,阻止外部的互联网访问。
- 即使下载有完整性保证,组织可能不想透露正在下载的内容以保护隐私。
- 一个组织可能只是出于速度的原因,希望下载的包在同一网络内,而不是到达世界各地,这可能有很大的延迟。
你可以用Casa做同样的事情。
Casa资源库在这里,包括服务器和用于上传和查询blob的二进制文件。
在未来,我们将在Casa服务器中包括一个支持镜像的简单方法,通过从其他Casa服务器(包括由我们运行的主要服务器)按需查询密钥。
总结
以下是我们用Casa带来的东西。
- 可靠的、可重复的引用软件包和它们的文件。
- 减少包文件的重复性;在你的开发机器或CI上下载的东西更少。
- 一个易于使用和依赖的服务器。
- 一种运行你自己的归档文件的方法,运行起来很简单。
我们相信这种CAS架构在其他语言生态系统中也有应用,不仅仅是Haskell。如果你是一家对运行自己的Casa服务器感兴趣的公司,和/或更新你的工具,如Cargo,以使用这项服务,请联系我们。