【问题标题】:How to store (and query) the MaxMind GeoIP2 database in Azure?如何在 Azure 中存储(和查询)MaxMind GeoIP2 数据库?
【发布时间】:2016-05-27 10:39:18
【问题描述】:

Azure Web App 中,我需要有效地查询MaxMind GeoIP2 City Database(由于查询量和延迟要求,我们无法使用 MaxMind 的 rest API)。

我想知道存储数据库(二进制 MMDB 格式,通过 official .NET api 访问)的最佳方法是什么,以便以最少的停机时间轻松更新(我们将订阅每月更新)并且仍然具有成本效益关于 Azure 存储和事务。

显然块 blob 是要走的路,但我不确定每月更新以及 GeoIP2 api 将整个数据库加载到内存中的事实(我不知道这是否会成为 Web 应用程序的问题,如果我需要一个网络工作者来保持它或者我需要其他东西),但实际上我还不知道文件有多大。

在大容量下保持低延迟的最具成本效益的解决方案是什么?

【问题讨论】:

  • 具有成本效益的解决方案将是 azure 表存储。如果您可以获得 partitionkey rowkey 组合,那么正确的延迟应该不是问题。我不确定您获得数据库的格式。如果是 csv ,我遇到了这个库,它可以轻松地将 csv 数据存储到 azure 表存储中。 blogs.msdn.microsoft.com/jmstall/2012/08/03/…
  • @Aravind - 我看不到表存储如何解决存储二进制数据库文件的问题。我认为问题不在于将内容从一种格式转换为另一种格式。即使使用 csv 版本,您仍然需要将数据从表存储复制回本地磁盘,以便通过 api 使用其内容。另外:表存储和 blob 存储的每 GB 成本完全相同。
  • @David 对。在任何情况下,当源向您提供更新时,您仍然必须使数据库保持最新。如果它是二进制的,那么块 blob 是选项。也不认为将整个数据库加载到内存中是一个不错的选择。
  • @Aravind - 没有选择将整个数据库加载到内存中:根据文档,这就是 SDK 的工作方式。除非 OP 分叉/修改 SDK,否则这是一个有争议的问题。
  • FWIW,API 的默认设置不是将整个数据库存储在内存中,而是使用内存映射文件。

标签: azure maxmind


【解决方案1】:

根据API docs,您必须在文件系统中拥有可用的数据库(API 不知道有关 Azure 存储和相关 REST API 的任何信息)。因此,无论您将其永久存储在何处,都需要将其保存在某个磁盘上。

我不知道数据库占用空间有多大,但是 Web 应用程序、云服务(Web/工作者角色)和虚拟机(无论是 Linux 还是 Windows)都有本地磁盘。并且您对这些磁盘具有读/写访问权限。因此,您需要将数据库二进制文件(或 csv)从某处复制到本地磁盘。此时,当您初始化 SDK 时,您将创建一个 DatabaseReader 并将其指向您在本地下载的数据库文件副本。

您提到将数据库存储在 blob 存储中。没有什么能阻止您这样做,只需将副本下载到本地磁盘即可。没有什么能阻止您将多个版本存储在多个 blob 中。注意:您还可以利用 Azure 文件存储(SMB 共享)。你选择哪一个取决于你。

就最具成本效益的解决方案而言:您需要自己进行定价检查,看看什么是最有效的。您还需要评估您选择的给定大小的 VM/角色实例/Web 应用程序有多少 RAM 可用。您在问题中提到了 Web 应用:Web 应用实例从 0.5GB 扩展到 14GB,具体取决于您选择的层(同样,您需要对此进行评估)。

【讨论】:

  • 在这种情况下,Azure 文件存储是否有帮助?不过我还没有检查它的定价。
  • 文件存储也很好,但可能无法提供与本地磁盘文件相同的性能,用于初始读取目的(我不知道这是否重要)。
  • 这不是一个好主意,数据库读取器只接受一个流并且没有给你一个在内存数据库中使用的选项,只有内存映射到 blob 存储......不是一个好主意
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
相关资源
最近更新 更多