2012-02-22 3 views
2

Google 애플리케이션에 적합한 GeoIP 데이터베이스를 찾으려고 노력했으며 MaxMind City가 아마도 최고라고 말할 수 있습니다. (틀 렸지만 알고있다!). 현재 영국에서는 정확하지 않은 무료 버전을 시험 중이지만 테스트 목적으로 사용됩니다.캐싱 MaxMind RAM + 서버 성능의 도시 바인더 리 데이터베이스

우리의 응용 프로그램은 PHP로 작성 결국 우리는 들어오는 트래픽을 많이 낳게 될 것이다 :

그래서 다시 주제에 점점. GeoIP 데이터베이스를 사용하는 이유는 모든 페이지로드시 도시, 지역, 국가를 표시하고 특정 방문자의 데이터를 mysql 데이터베이스에 저장해야하기 때문입니다. 그래서 모든 페이지 요청에 바이너리 데이터를 로딩하면 서버가 많은 RAM을 소비하게되어 처리 속도가 빨라질 것이라고 생각하기 시작했습니다. 그래서 RAM 안에 캐시 할 수 있는지 궁금합니다. PHP가인데, 26Mb이기 때문에 (많은 경우는 그렇지 않을 수도 있습니다.), 여전히 수천 페이지의 요청을 처리하기 시작했기 때문에 궁금합니다. 두 번째로는 성능 저하를 피할 수 있습니다.

서버 :

프로세서 : 16 헤르쯔 (8 × 2 헤르쯔)

RAM : 16,384메가바이트

HDD : 4백기가바이트

아파치 + Nginx에 + 니스 PHP5 .3, MySQL5.1

우리는 대규모 앱 개발에 새로운 경험이 있으므로 개선 방법에 대한 제안이 있으면 일반적으로 성능을 향상 시키거나 성능 향상과 관련된 다른 팁을 알려주십시오.

감사합니다.

답변

3

우리는 광고 서버 응용 프로그램을 위해 MaxMinds GeoIP City를 사용하고 있습니다 (따라서 트래픽이 많습니다). 데이터베이스를 메모리에 저장하는 MaxMind의 테스트 스크립트를 기반으로 한 일부 테스트는 우리에게 충분하지 않았습니다. 모든 단일 PHP 프로세스에 대해 데이터가 캐시 되었기 때문입니다. 그래서 우리는 두 테이블 (ip2location과 city)을 MySQL에 저장하기로 결정했습니다 (CSV 파일을 다운로드해야합니다). 실제로 테이블 크기가 작기 때문에 테이블을 메모리에 캐시합니다. ip2location 테이블의 클러스터 된 인덱스를 사용하면 loc_id에 대해 약 10ms의 IP를 쿼리 할 수 ​​있으므로이 loc_id을 기반으로 도시 데이터를 가져와야합니다.하지만이 작업 또한 매우 빨라야합니다.

+0

니스! 우리는 몇 가지 테스트를 해보 겠지만, mysql이 캐시하도록하는 것은 좋은 생각이다. 감사! 왜 우리가 전에 그것을 시도하는 것을 몰랐는지 모르겠다. – Ignas

+1

성능 향상을 위해 우리는'ip2location' 테이블에 대한 조작을했다. "문제"는 하나의 클래스 -A 그물보다 큰 일부 IP 블록이 있다는 것입니다. 그래서 우리는이 블록들을이 블록 (아마도이 ​​테이블에서 5 또는 6 개의 엔트리들)을 여러 블록으로 나눈 다음이 테이블에 IP의 첫 번째 옥텟을 포함하는 새로운 열을 추가했습니다. (따라서이 'unsigned tinyint' 열의 값은 0에서 255). 이 추가 열에 대한 색인이 있으며이 열은'WHERE' 절에서 참조됩니다. 그것은 매우 효율적입니다. – rabudde