2009-06-24 5 views
10

http (> 10k 제작자, 하루에 10 로그, ~ 100 줄의 텍스트 각각)를 통해 다른 위치에서 로그 파일을받는 시스템이 있습니다.많은 로그 파일 저장

기타를 계산할 수 있도록 저장하고 싶습니다. 통계를 매일 밤에 걸쳐서 보내거나 (도착 날짜 또는 첫 번째 내용으로 주문) ...

내 질문은 무엇입니까? 저장하는 가장 좋은 방법은 무엇입니까? (적절한 잠금 포함)

  • 플랫 텍스트 파일, 업로드 한 파일 당 하나 개의 파일, 하루에 한 디렉토리/프로듀서
  • 플랫 텍스트 파일, 모든 생산자 하루에 한 (큰) 파일 (문제가 여기 인덱싱 될 것입니다 및 잠금) 텍스트
  • 데이터베이스 테이블 (MySQL의이 내부 이유로 선호) 매우 긴 될 수 있습니다 삭제로 DB 퍼지와 (PB!)
  • 데이터베이스 샤딩 텍스트의 한 줄에 하나의 레코드 (와
  • 데이터베이스 테이블 하루에 하나의 테이블), 간단한 데이터 삭제가 가능합니다. (이 파티션은 파티션입니다.하지만 액세스 할 수있는 내부적으로 지원되는 MySQL 버전은 지원하지 않습니다)
  • 문서 기반 DB à la couchdb 또는 mongodb (색인 생성/성숙도/처리 속도 문제 일 수 있음)

어떤 조언이 필요합니까?

+1

이것은 sys-admin 질문입니다. 즉, 자매 사이트 "Server Fault"에 속해 있음을 의미합니다. serverfault.com – tylerl

+2

실제로 요청한 내용에 대한 대답은 개발에 큰 영향을 미칩니다. – makapuf

답변

4

나는 첫 번째 해결책을 고르고 싶다.

나는 DB가 왜 필요한지 알지 못합니다. 데이터를 스캔하는 것만 큼 필요한 것 같습니다. 로그를 가장 "원시"상태로 유지 한 다음이를 처리 한 다음 매일 매일 tarball을 작성하십시오.

집계하는 유일한 이유는 파일 수를 줄이는 것입니다. 일부 파일 시스템에서는 N 개 이상의 파일을 디렉토리에 저장하면 성능이 급격히 떨어집니다. 파일 시스템을 점검하고, 그렇다면 프로듀서 ID의 처음 2 자리를 첫 번째 레벨 디렉토리 이름으로 사용하여 간단한 2 레벨 계층 구조를 구성하십시오.

2

업로드 한 번에 하나의 파일을 작성하고 처음 제안한대로 하루에 하나의 파일을 씁니다. 하루가 끝날 때 파일에 대한 처리를 실행 한 다음 디렉토리에 tar.bz2를 실행하십시오.

tarball은 여전히 ​​검색 가능하며 로그가 일반적으로 상당히 잘 압축 될 수 있으므로 매우 작을 수 있습니다.

총 데이터의 경우, 압축되지 않은 1GB [수정 된 10MB]를 말합니다. 이것은 100MB 이하로 압축 될 것입니다. bzip2를 사용하여 로그 파일에서 200x 압축을 보았습니다. 걱정없이 파일 시스템에 압축 된 데이터를 쉽게 저장할 수 있습니다. 추가 처리를 위해 압축 된 tarball을 검색하고 더 많은 통계를 생성 할 수있는 스크립트를 작성할 수 있습니다.

+0

"대화 중입니다. 약 10MB 비 압축 " 아니요, 10 M 줄 (10k 사용자 * 10 파일 * 100 줄)입니다. 예를 들어 라인이 100 바이트라면, 1GB/day가 더 많습니다. – makapuf

0

내 경험에 비추어 볼 때, 데이터베이스 솔루션에 관해 이야기하면 단일 대형 테이블이 훨씬 빠르게 수행되고 여러 개의 연결된 테이블이 수행됩니다. 특히 쓰기 및 삭제 작업. 예를 들어, 하나의 테이블을 3 개의 연결된 테이블로 분할하면 성능이 3-5 회 감소합니다. 이것은 매우 거친 것입니다. 물론 세부 사항에 따라 다르지만 일반적으로 위험합니다. 데이터 볼륨이 매우 커지면 악화됩니다. IMO가 로그 데이터를 저장하는 가장 좋은 방법은 평면 텍스트가 아니라 구조화 된 형식이므로 나중에 효율적인 쿼리와 서식을 지정할 수 있습니다. 로그 파일을 관리하는 것은 많은 어려움을 겪을 수 있습니다. 특히 많은 소스와 위치에서 많은 경우가 있습니다. solution을 확인하십시오. IMO를 사용하면 많은 개발 시간을 절약 할 수 있습니다.

+0

고마워요.하지만 아이디어는 테이블이 함께 연결되지 않고, 예를 들어 생산 일에 의해 샤딩된다는 것입니다. 따라서이 테이블에 쓰면 하나의 테이블 만 수정됩니다. 그리고 일별 삭제는 테이블을 삭제하는 것으로 구현됩니다. – makapuf

+0

해결책을 확인하겠습니다. – makapuf

1

기타를 계산할 수 있도록 저장하고 싶으므로

내가 좋을 것 : 그들에 통계는 매일 밤, 내보낼 10,000,000 라인의 총에 ... 당신은 100,000를 기대하고하는 것은, 하루 파일 (도착 또는 첫 번째 줄 내용의 날짜순)

  1. 모든 파일을 yyyymmdd/producerid/fileno 형식을 사용하여 일반 텍스트 파일로 저장하십시오.
  2. 하루가 끝나면 데이터베이스을 지우고 해당 날의 모든 텍스트 파일을로드하십시오.
  3. 파일을로드 한 후 데이터베이스에서 통계를 쉽게 가져와 필요한 형식으로 게시 할 수 있습니다. (어쩌면 또 다른 "통계"데이터베이스). 그래프를 생성 할 수도 있습니다.
  4. 공간을 절약하기 위해 일별 폴더를 압축 할 수 있습니다. 텍스트 파일이기 때문에 압축이 잘됩니다.

따라서 데이터베이스를 사용하면 데이터를 쉽게 집계 할 수 있습니다. 프로세스가 작동하지 않으면 이전 단계의 보고서를 동일한 단계를 거쳐 다시 작성할 수도 있습니다.

8

(면책 조항 :. 내가 MongoDB를 작업)은

나는 MongoDB를 로깅을위한 가장 좋은 방법이라고 생각합니다. 그것은 놀랍도록 빠르며, 아마도 당신이 보낼 수있는 것보다 더 빨리 데이터를 삽입 할 수 있습니다. 데이터 (예 : 날짜 또는 로그 수준의 범위) 및 색인 및 필드 또는 필드 조합에 대해 흥미로운 쿼리를 수행 할 수 있습니다. 로그에 필드를 무작위로 추가 할 수 있기 때문에 (또한 "일부는 스택 추적 필드가 필요합니다") 문제가 발생하지 않기 때문에 좋습니다 (일반 텍스트 파일처럼).

많은 사람들이 이미 MongoDB를 프로덕션에서 사용하고 있습니다 (http://www.mongodb.org/display/DOCS/Production+Deployments 참조). 1.0으로 가기 전에 추가 할 기능이 몇 가지 더 있습니다.