2012-02-22 71 views
2

我一直在试图为我们的应用程序找到一个合适的GeoIP数据库,并且据我所知,MaxMind City可能是最好的(尽管如果我错了,请让我知道!)。 我目前正在尝试免费版本,这在英国并不是很准确,但它会用于测试目的。在RAM +服务器性能中缓存MaxMind City绑定数据库

于是又回到正题:

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

服务器:

处理器:16千兆赫(8×2千兆赫)

RAM:16384 MB

HDD:400 GB

阿帕奇+ Nginx的+光油,PHP5 .3,MySQL5.1

我们对于大规模应用程序开发相当新颖,所以如果您有任何建议如何改进一般性能,或有任何其他提示与我们的案例提高性能相关让我知道。

谢谢!

回答

3

我们使用MaxMinds GeoIP City作为Adserver应用程序(所以确实有很多流量)。基于MaxMind测试脚本的一些测试将数据库放入内存对我们来说效率不够。因为每个PHP进程都缓存数据。所以我们决定把这两个表(ip2location和city)放到MySQL中(你必须下载CSV文件),它们也会将表格缓存在内存中,因为它们非常小。随着ip2location表的聚集索引,我们能够查询一个IP一个loc_id圆形10ms左右,所以你只需要获得在此基础上loc_id城市的数据,但这应该也很快。

+0

不错!我们会做一些测试,但是让mysql缓存它是一个好主意。谢谢!不知道为什么我们没有意识到之前尝试过:) – Ignas 2012-02-22 13:38:38

+1

为了提高性能,我们对'ip2location'表进行了一些处理。 “问题”是,有一些IP块,比一个A类网络大。所以我们将这些块(可能是这个表中的5或6个条目)分成多个块,然后我们在这个表中添加一个新的列,其中包含IP的第一个字节(因此,这个'unsigned tinyint'列的值可以从0到255 )。在这个额外的列上有一个索引,这个列在'WHERE'子句中被引用。这使得它非常有效。 – rabudde 2012-02-22 13:57:24