데이터베이스 상호작용이 없는 고성능 웹 서버

데이터베이스 상호작용이 없는 고성능 웹 서버

대용량 트래픽 소스의 통계 데이터 추적을 담당할 서버를 설정할 준비를 하고 있습니다. 평균 시간당 약 6~700만 개의 요청을 처리하며, 모두 작은 GET입니다. 나에게 필요한 것은 get 요청의 매개변수를 처리하고 이를 CSV 파일에 쓸 수 있는 간단한 서버 설정뿐입니다.

내 첫 번째 생각은 lighttpd+fastcgi+php를 사용하는 것이었습니다. 이는 이미 익숙한 구성이기 때문입니다. 그러나 매일 이런 종류의 성능 결정을 내릴 수는 없으므로 다른 옵션을 탐색하고 이 목적을 위해 더 나은 것이 있는지 확인하고 싶습니다.

답변1

CSV 파일당 6~7백만 개의 쓰기 작업을 수행하려고 합니다.시간?

진지하게, 데이터베이스가 더 나은 아이디어입니다. 데이터베이스는 동시 쓰기를 처리하도록 설계되었으며 수직(더 큰 시스템, 더 빠른 디스크) 또는 수평(여러 서버에 로드 분산)으로 확장될 수 있습니다. 단일 CSV 파일에 쓰기(또는어느파일)은 동시성 문제를 처리하기 위해 어떤 형태의 잠금이 필요하며 IO 로드 및 동시성이 증가함에 따라 확장성이 떨어집니다.

이 문제를 해결하려면 자체 캐싱 및 버퍼링 계층을 구현한 다음 여러 파일 등 간에 로드를 분할하기 시작해야 합니다. 처음부터 일부 유형의 데이터베이스를 사용하면 많은 골치 아픈 일을 덜 수 있습니다.

답변2

약 2000개의 요청/초 또는 500μs/요청을 수행할 것이라고 가정하면평균(피크가 훨씬 더 높다는 의미) 파일의 원자성 쓰기를 보장하는 것은 없기 때문에 동시 쓰기에 대한 항목이 막혀서 CSV는 아마도 사용이 불가능할 것입니다.

한 가지 아이디어는 나중에 수집되는 프로세스별/작성자별 파일이고, 또 다른 아이디어는 대량의 쓰기에 맞게 조정된 데이터베이스를 사용하는 것입니다. 메시지 대기열이나 그룹 통신 프로토콜(예:확산), 하지만 그들이 그 정도의 양을 감당할 수 있는지는 모르겠습니다.

무엇을 하든, 몇 가지 빠른 아이디어를 제시하고 벤치마킹하세요. 현재 하드웨어는 놀라운 성능을 발휘할 수 있으며 필요할 때만 최적화할 수 있습니다. PHP의 경우 - Opcode Cache가 설치되어 있는지 확인하십시오(예:APC), 그렇지 않으면 스크립트를 불필요하게 재컴파일하는 데 많은 사이클이 소모됩니다.

또한 서비스의 성장이 어떤 모습인지 염두에 두십시오. 몇 달 안에 압도될 솔루션을 목표로 하는 것은 거의 의미가 없습니다.

답변3

GET 요청을 통해 어떤 종류의 매개변수가 전달됩니까? CSV/데이터베이스 실시간이어야 합니까? 아니면 더미 HTML 파일(또는 PHP)을 만들고 웹 로그를 사용하여 나중에 일괄 작업으로 구문 분석하고 CSV로 덤프할 수 있다고 생각하십니까? (알겠습니다 .. 복잡해 보이지만 .. 다루기 쉽습니다) ..

답변4

저는 Server 2008 웹 에디션을 살펴보고 ADO.net을 사용하여 CSV 파일에 씁니다. ado.net이 쓰기를 버퍼링하므로 처리량 문제가 없어야 합니다.

관련 정보