在 RAM + 服务器性能中缓存 MaxMind City 绑定数据库

Posted

技术标签:

【中文标题】在 RAM + 服务器性能中缓存 MaxMind City 绑定数据库【英文标题】:Caching MaxMind City bindary database in RAM + Server performance 【发布时间】:2012-02-22 12:54:57 【问题描述】:

我一直在尝试为我们的应用程序找到合适的 GeoIP 数据库,据我所知 MaxMind City 可能是最好的(如果我错了,请告诉我!)。 我目前正在试用在英国并不准确的免费版本,但它可以用于测试目的。

回到主题:

我们的应用程序是用 php 编写的,最终我们将获得大量传入流量。我们将使用 GeoIP 数据库的原因是因为我们需要在每次页面加载时显示城市、地区、国家,并将特定访问者的数据保存到 mysql 数据库中。所以我开始认为在每个页面请求上加载二进制数据会导致服务器消耗大量 RAM 并会提高处理速度。这就是为什么我想知道是否可以将它缓存在 RAM 中并使用 PHP 进行验证,因为它是 26Mb(我知道它可能看起来不是很多),但是当我们开始得到每秒数千个页面请求,这将导致性能下降,这是我们显然希望避免的。

服务器:

处理器:16 GHz (8 x 2 GHz)

内存:16384 MB

硬盘:400 GB

Apache + nginx + Varnish、PHP5.3、MySQL5.1

我们是大规模应用开发的新手,所以如果您对如何提高总体性能有任何建议,或者有任何其他与提高我们案例的性能相关的提示,请告诉我。

谢谢!

【问题讨论】:

【参考方案1】:

我们正在将 MaxMinds GeoIP City 用于 Adserver 应用程序(因此流量确实很大)。一些基于 MaxMind 将数据库放入内存的测试脚本的测试对我们来说效率不够。因为每个 PHP 进程都缓存了数据。所以我们决定将这两个表(ip2location 和 city)放入 MySQL(你必须下载 CSV 文件),这会将表也缓存在内存中,因为它们非常小。使用ip2location 表上的聚集索引,我们可以在大约 10 毫秒内查询loc_id 的 IP,因此您只需根据此loc_id 获取城市数据,但这应该非常快也。

【讨论】:

不错!我们会做一些测试,但最好让 mysql 缓存它。谢谢!不知道为什么我们之前没有意识到要尝试一下 :) 为了提高性能,我们对ip2location 表进行了一些操作。 “问题”是,有一些 IP 块大于一个 A 类网络。因此,我们将这些块(该表中可能有 5 或 6 个条目)拆分为多个块,然后我们在该表中添加一个新列,其中包含 IP 的第一个八位字节(因此此 unsigned tinyint 列的值可以从 0 到 255) .此附加列上有一个索引,此列在WHERE 子句中引用。这使得它非常高效。 感谢您建议改用 MySQL。我也在构建一个广告服务器应用程序,我需要国家代码和时区的数据。如果您已经更新了您的应用程序以使用 MaxMind 的 GeoIP2 数据库,如果您能分享您的使用经验,我将不胜感激。 对不起,我不再在这家公司工作了。我已经很久没有和 MaxMind 合作了,所以我帮不上忙。 当时我并没有使用像memcached这样的真正的缓存,这本来是一个不错的选择。但即使你把它存储在 memcached 或 MySQL 中,你也必须为每个页面请求以任何方式查询数据。恕我直言 MySQL 在连接处理方面有更多开销,但由于表很小,MySQL 也会将其缓存在 RAM 中(即,如果使用 InnoDB 和适当的innodb_buffer_pool_size

以上是关于在 RAM + 服务器性能中缓存 MaxMind City 绑定数据库的主要内容,如果未能解决你的问题,请参考以下文章

Linux 平板分配器和缓存性能

Xcode 服务器集成缓存位置、Ram 磁盘和 _xcsbuildd

单片机内存不够的问题!

多线程之缓存一致性协议

Ram 或 DB 表中的表,以获得最佳性能

分布式缓存的基本原理