我们有一个用例,用于缓存 3 亿多条这样的数据,每条数据都有一个唯一的键。
我知道这是非传统的,但是,我的公司有人建议可以使用 DNS 作为小块数据(<512 字节)的快速分布式缓存。
DNS 条目将是 {Key}.{散列密钥的模数}.mycompany.local。
即 U5333145311.1.mycompany.local
我们将以每秒 5000 到 7500 个的速度向 10 到 15 台服务器发出请求。
我们将通过区域文件更新每个 DNS 服务器。
作为一名程序员,这对我来说都是新鲜事
- 这可行吗?
- 有哪些陷阱?
- 如何调整 DNS 服务器的大小。
谢谢
更新:数据是一个由 1 到 30 个整数组成的数组(抱歉不是 512K),所以它非常小。我的 CTO 来自网络运营部门,他喜欢这个解决方案,因为它是一个众所周知的成熟系统,并且具有内置容错功能,他可以使用网络运营部门来管理它。我非常谨慎,但思想开放。
答案1
DNS 在某些情况下是有意义的:
广泛分布的数据
例如,DNS 黑名单之所以有效,是因为缓存基础设施已经存在于用户附近(即他们的 ISP),或者对于大用户来说,他们可以轻松运行自定义软件(如 rbldnsd)。然而,重点是它利用了现有的广泛部署的协议。
小型响应(最多约 500 字节)
人们通过 DNS 分发的大多数有趣的东西都很小,而且通常甚至仅仅记录的存在与否就足够了(例如,DNSBL 表示 IP 地址不好,或者表示该文件的校验和“不好”)。
我写了这个:https://dgl.cx/wikipedia-dns,这几乎突破了 DNS 中可以安全执行的响应大小限制。并非所有人都实施或支持 EDNS0,正如其他人所说,一旦您回到 TCP,无状态的好处就会消失。
正如其他人所说,我觉得你最好使用 memcached 之类的东西。当 DNS 供内部使用时,试图将自己限制在 DNS 上似乎很愚蠢。如果你可以控制客户端,那么你可以轻松地在故障转移和负载平衡方面做得比 DNS 本身更好。
答案2
由于我是怀疑论者的首席技术官,因此我想为讨论提供一些参考。
正如 Gary 所提到的,应用程序需要能够发布非常大的清单。清单将被分成几个 (30-100) 组。每个密钥平均约 55 个字节,但可能会大得多。
无论我们选择哪种产品,都需要支持以下内容:
1)完全冗余和负载平衡 2)高交易量(15k-20k 读取/秒),响应时间<500ms。
优点有:1)层次结构 2)记录过期 3)自描述拓扑
只有在考虑使用 UDP 而不是 TCP 从内存分布式缓存中检索数据时,我才会想到 DNS。当然,DNS 是最古老和最大的 DNS 应用程序之一。
众所周知,DNS 支持包含大量记录的区域文件。例如,.com. 毕竟是一个区域文件(尽管分布在全球许多服务器上)。它还支持非常高的流量水平。
我们已经对 DNS 进行了一些初步测试。我们加载了一个包含 10M TXT 记录的单个区域文件,其中包含代表性数据量。然后,我们从同一 LAN 上的另一台服务器以多线程方式运行了 300,000 个查询的测试,每秒获得约 5,000 个请求。服务器和客户端在测试过程中几乎没有退缩。我们要么在测试应用程序本身遇到瓶颈,要么在客户端的网络堆栈中遇到瓶颈。
DNS 让我很感兴趣,因为它本身就支持我想要的一切,而且多年来一直如此。我喜欢的功能有:
Zone Delegation - we can define which server(s) handle particular partitions. For example 1.mycompany.local is handled by servers 10.1.1.1 and 10.1.1.2.
Redundancy - DNS was built with resiliency and redundancy in mind. It can also be easily load balanced.
Performance - Proven to support high request volumes
综上所述,DNS 确实听起来像是一种奇怪的缓存工具。如果它最终通过了选择阶段,我们绝对会只在内部 LAN 上使用它,并且它不会与我们的任何其他内部或外部 DNS 系统位于同一个 DNS 上。附带说明一下,我们可能希望与第三方合作伙伴共享我们存储的数据。DNS 是一个众所周知的实体,任何人都可以轻松查询以接收来自的区域传输。
感谢您持续的反馈。
答案3
1- 有可能,但不推荐
2- 奇怪的缓存行为,不安全,没有任何支持
3- 不知道
在 memcached 中基本上有一个现成的解决方案: http://www.danga.com/memcached/
答案4
如果您的 DNS 条目是 key.modulus,那么数据是什么?IP 地址?我遗漏了什么吗?