¿Cómo hago la geolocalización local rápida de una dirección IP?

Recomendaría envolver una base de datos en memoria con una memoria caché para la mejor velocidad, escalabilidad y flexibilidad operativa.

En iLike.com nosotros (Ray Fortna escribió el código que él y yo “diseñamos” en una pizarra) envolvimos el C-API en la base de datos de MaxMind City en una memoria caché personalizada a la que habíamos agregado un verbo GEOIP (un pequeño número de líneas de código), por lo que podríamos hacer:

telnet geoip-server 25010

Conectado a geoip-server.ilike.com (XX.XXXX).

El carácter de escape es ‘^]’.

GEOIP 67.183.65.7

US WA Washington Bonney Lake 98391 América / Los_Angeles -122.185204 47.193699

El cual fue un resultado geo-jerárquico delimitado por tabulaciones para esa IP. Esto nos dio una tienda simple con una respuesta inferior a 1 ms en la red local que podríamos colocar localmente (mismo nodo), de forma remota, usar desde Ruby, Perl, PHP, etc., todos los cuales tienen clientes memcached. Ponerlo en memcached aseguró que estaba en un motor de servidor estable de alto rendimiento / bajo costo que sabíamos que podía manejar miles de conexiones persistentes concurrentes y cientos de miles de solicitudes por minuto. La centralización de este servicio en unos pocos servidores con un equilibrador de carga intermedio hizo que las actualizaciones de administración de la base de datos GeoIP y otros mantenimientos a los servidores fueran sencillos y sin tiempo de inactividad. Tener uno de estos por servidor front-end parecía un desperdicio de 20-30 MB de RAM.

Tenga en cuenta que puede comenzar con http://www.maxmind.com/app/geoli… de forma gratuita y luego actualizar a la http://www.maxmind.com/app/city más precisa de pago si cree que la necesita.

La mayoría de las funciones de orientación de conciertos de usuarios en iLike y todas las funciones en las que mostramos enlaces por espectador “(en gira)” junto a canciones y álbumes hicieron una resolución geográfica mediante este servicio. Muchas funciones analíticas de procesamiento de registros fuera de línea, donde desglosaríamos millones de reproducciones diarias, vistas, etc. en cientos de GB de registros del servidor, utilizaron este servicio simple para la resolución Geo-IP de alto volumen de los registros del servidor web.

Pruebe GeoIP: http://www.maxmind.com/app/bench …, http://www.maxmind.com/app/geoli …, http://www.maxmind.com/app/c también consulte http : //www.ip2location.com/c.aspx

Creo que una buena opción sería descargar datos de geolocalización sin procesar y luego importarlos a un almacén rápido de valores-clave en memoria, como Redis ( http://code.google.com/p/redis/w …) para acceso sub msec y alto rendimiento (40-140K GETs / seg dependiendo de su hardware, número de clientes y el tamaño de datos / tamaño del valor en bytes)

Teniendo en cuenta los datos sin procesar de aproximadamente 43 millones de rangos de IP que cubren alrededor de 3.5 mil millones de IP, en un archivo csv.gz de ~ 700 MB, necesitaba mantener todos los datos en la RAM y buscar una IP individual rápidamente. Escribí una especie de tabla hash para hacer esto en C. La tabla hash de solo lectura toma alrededor de 1 GB de RAM en tiempo de ejecución, un poco más que los datos sin procesar, y se distribuye en 3 archivos. Puede buscar alrededor de 23,000 IP por segundo por núcleo. Esto debería darle una idea de lo que es posible en términos de compensación de tamaño y velocidad. HTH.