2009-12-08 4 views
7

초당 20k mysql 인서 션을 수행하려면 어떻게해야합니까? (느린 시간에는 최대 시간 1k/초 동안)? 나는 약간의 연구를 해왔고 "INSERT DELAYED"제안을 보았고 플랫 파일에 "fopen (file, 'a')"라고 쓰고 chron 작업을 실행하여 "필요한"데이터를 mysql, 등등. 나는 또한 당신이 들어 본 적이없는 여러 서버와 "로드 밸런서"가 필요하다고 들었습니다. 나는 또한이 "클라우드 서버"와 같은 것들을 보았고, 자동 확장 성을 보였지만 실제로 확장성에 대해서는 확신하지 못했습니다.베스트 프랙티스, 일일 노출 수를 수백만 회 추적하는 PHP

응용 프로그램은 추적 스크립트 일 뿐이므로 하루에 300 만 페이지로드가 발생하는 웹 사이트가 100 개있는 경우 하루에 약 3 억 회의 삽입이 발생하게됩니다. 데이터는 매 15-30 분마다 실행되는 스크립트를 통해 실행되어 데이터를 정상화하고 다른 mysql 테이블에 삽입합니다.

큰 개는 어떻게합니까? 작은 개들은 어떻게합니까? 나는 거대한 서버를 더 이상 가질 여유가 없기 때문에 어떤 직관적 인 방법이라도 여러 가지 방법이 있다면 똑똑한 사람들은 나를 생각해 볼 수 있습니다. :)

+0

저는 n00b입니다.하지만 왜 20k ins/초가 필요한지 알 수 없습니까? PHP 내의 배열에 많은 수의 데이터를 저장 한 다음 looooooooooong mysql 쿼리 문자열을 한 번에 한 행씩 (n) 개씩 삽입 할 수는 없습니까? 그럴 경우 원시 삽입 수가 줄어 듭니다. 나는 처리 시간이 여전히 문제라고 생각한다. :/ – Drew

+0

내가 읽은 것으로부터, 하나의 스크립트에서 20K/초가 아닙니다. 하지만, 20K/초는 여러 요청에서 왔습니다. – ariefbayu

+0

사이트를 실제로 개발하지 않았고 현재 예상 트래픽의 일부만받는 경우에는 필요에 따라 확장 및 확장을 시작할 때까지 최적화에 대한 자세한 내용을 염려하지 마십시오. 개발의 가장 큰 함정 중 하나는 실제로 필요하기 전에 최적화를 과도하게 지나치는 것입니다. 큰 물고기의 대부분은 작은 연못에서 시작되었습니다. 그냥 내 추천. –

답변

2

그게 인상적입니다. 대부분의 데이터는 방대한 삽입물에서 한 번에 발생했습니다. 한 가지 발견 한 것은 대량 삽입물이 개별 삽입물보다 훨씬 뛰어나다는 것입니다. 또한 테이블, 인덱스 등의 디자인은 삽입 속도와 관련이 있습니다. cron과 벌크 삽입을 사용할 때의 문제점은 가장자리 경우입니다. (삽입을 할 때).

플랫 파일과 함께. 삽입을 파일에 기록하면 동시성 문제가 쉽게 발생할 수 있습니다. 1k + 삽입을 쓰는 경우 파일 쓰기에 문제가있을 때 많은 충돌과 손실이 발생합니다.

+0

그런데 나는 어떤 매체로 그들을 별도로해야한다. 가져가. 그런 다음 데이터를 가져 와서 정상화하고 매우 작고 깔끔한 mysql 테이블에 넣어야합니다. – Mickey

5

큰 개는 어떻게합니까?

여러 서버. 로드 균형 조정.

작은 강아지는 어떻게합니까?

여러 서버. 로드 균형 조정.

정말로 삽입물을 저장하고 대량으로 데이터베이스에 밀어 넣기를 원합니다. 20k 개별 인서트는 초당 오버 헤드를 없애고 매 초마다 하나의 커다란 인서트로 단순화함으로써 그 대부분을 제거합니다.

+1

질문은 "어떻게 저장합니까?"입니다. – Mickey

1

이것은 PHP에서만 처리 할 수있는 문제는 아닙니다.

당신은 서버 (나는 당신의 질문의 저음에 의해 이해되는) 대부분이 PHP 프로세서에 도달하기 전에 다음이 한계에 도달 할 것입니다, 당신의 "저예산"타격 초 (20 개 000 요청이있는 경우 , 결국 MySQL).

트래픽 추적 스크립트가있는 경우 추적하는 모든 사이트에 문제가 발생할 가능성이 큽니다.

+0

그때는 또 다른 질문입니다. 서버가 초당 20,000 번 캐시를 생성하는 PHP로드를 처리 할 수 ​​있습니까? ( – Mickey

+1

캐시, 캐시, 캐시 그리고 가능한 경우 데이터베이스를 한 서버에, PHP를 다른 서버에 배치하십시오. –

5

방법 중 몇 :

첫째로, 당신은 당신이 분할 또는 여러 서버를 분할하여 데이터를 샤딩해야하는 지점에 도달합니다. 이것은 server1의 A-C, server2의 D-F 등과 같이 간단 할 수 있습니다.

둘째, 데이터베이스에 쓰기를 연기하십시오. 대신 beanstalkd 나 memcached를 사용하여 빠른 메모리 저장소에 직접 쓰십시오.다른 프로세스가 해당 상태를 수집하고 집계 된 데이터를 데이터베이스에 기록하도록하십시오. 이러한 레코드를 요약 데이터로 정기적으로 병합합니다.

+1

초당 20k 인서트는 임시 데이터 일 뿐이며 일단 수집되면 스크립트를 실행할 것입니다. 모든 데이터를 취하는 15-30 분 간격으로 정규화 (예 : 동일한 IP가 동일한 웹 페이지를 100 번 반복하는 경우) 임시 테이블에 100 개의 데이터 행이 생기고 정규화 된 테이블에서 한 행만 업데이트됩니다 – Mickey

1

PHP는 대용량 웹 트래픽 IMHO에 적합하지 않습니다. 그러나 데이터베이스는 PHP 성능이 떨어지기 전에 문제를 일으킬 수 있습니다. 특히 PHP의 연결 모델 (모든 requst에 대해 새로운 연결을 연다)의 경우.

나는 당신을 위해 두 개의 제안이 : http://sqlrelay.sourceforge.net/

  • 체크 아웃 일부 PHP 가속기 :

    1. 는 SQL 릴레이를 봐주세요 http://en.wikipedia.org/wiki/List_of_PHP_accelerators

    SQL 릴레이 효과적으로 할 수 있습니다 연결 TKE의 장점 PHP 풀링을 사용하면 대용량 데이터베이스 응용 프로그램의 성능이 훨씬 향상됩니다.

    PHP 가속기 (일반적으로 말하자면)는 모든 요청과 함께 PHP 코드를 해석하는 오버 헤드를 줄이는 PHP 연산 코드를 캐시합니다.

    행운을 빌어 요!

  • +0

    사람이 적어도 이것이 왜 나쁜 생각이라고 생각했는지에 대한 의견을 말할 수 있었을 것입니다. 감사합니다. – Mickey

    +1

    아마 "PHP가 높은 음성에 잘 맞지 않습니다. lume 웹 트래픽 ", 페이스 북과 같은 사이트는 반증한다. – ceejayoz

    +0

    공평하게 말하면, 제 의견이었습니다. 그래도 좀 더 구체적이어야 했어. PHP는 다른 언어와 마찬가지로 효율적이지 않으므로 대용량 웹 트래픽에 적합하지 않습니다 (내 의견으로는 가장 적합한 도구가 아닙니다.). http://slashdot.org/story/09/12/20/1433257/The-Environmental-Impact-of-PHP-Compared-To-C-On-Facebook – jckdnk111

    0

    파일에 쓰기는 훌륭하지만 여전히 파일 쓰기를 동기화해야합니다. 그러면 다시 정사각형으로 돌아갑니다.

    제안 : 때때로 DB가 빠를 수 있지만

    • MQ 시스템의 MQ 아이디어에
    • : 메모리 큐. 나는 당신이 PHP를 말한 것을 알고 있지만, 자바/서블릿에서이 작업이 매우 잘된 것을 보았다.
    • 무엇을 추적하고 있는가에 따라 정적 파일을 CDN (당신이 이야기 한 구름) 액세스 로그를 일괄 적으로 집계 할 수 있습니다.
    • INSERT DELAYED 좋은 생각이지만 MySQL에서 백 로그/대기열 크기가 얼마인지 알 수 없습니까? (누구든지)
    +0

    의견을 주셔서 감사합니다. 나는 이것을 조사 할 것이다. – Mickey

    1

    memcaching도 좋습니다.

    memcache에 데이터를 쓰고 주기적으로 실행되는 작업에서 집계하고 삽입합니다.

    파일 시스템 액세스가 훨씬 효율적으로 쓰기 액세스를 처리 할 수있는 데이터베이스와 이야기하는 것보다 느리기 때문에 실제 파일에 쓰기는 아마도 성능을 떨어 뜨릴 것입니다.

    0

    노출을 추적하기 때문에 매 5 초마다 하나만 저장하면 어떻게됩니까? 그럼에도 여전히 "임의의"샘플이 있으며 더 큰 데이터 세트에 비율을 적용하면됩니다.

    관련 문제