2010-02-04 10 views
7

현재 사용 모니터링 응용 프로그램의 경우 Postgres에서 CouchDB 로의 변경을 고려 중입니다. 일부 숫자 :CouchDB 용 권장 문서 구조

5 분마다 폴링 된 약 2,000 건의 연결로 하루에 약 600,000 개의 새 행이 있습니다.

t_usage {SERVICE_ID, 타임 스탬프에 Data_IN, DATA_OUT}
t_usage_20100101이 t_usage을 상속 : 포스트 그레스, 우리는 하루 파티션이 데이터를 저장합니다.
t_usage_20100102는 t_usage를 상속합니다.

우리는 파티션이 존재한다고 가정하는 낙관적 인 저장 프로 시저를 사용하여 데이터를 작성하고 필요한 경우이를 작성합니다. 우리는 매우 빨리 삽입 할 수 있습니다. 중요성과 현재의 성능을 위해 데이터, 유스 케이스의 읽기

은 다음과 같습니다
* 단일 서비스, 매일 사용 : 좋은 성능
* 여러 서비스를, 월 사용법 : 성능 저하
* 싱글 서비스, ​​월 사용법 : 성능 저하
* 다중 서비스, 다중 달 : 아주 성능 저하
* 여러 서비스, 단일의 날 : 좋은 성능

파티션이 지금까지 어떤 일에 최적화되어 있기 때문에이 말이 우리 대부분의 imp 오르 팅 유스 케이스. 그러나 우리는 2 차 요구 사항을 향상시키는 방법을 찾고 있습니다.

예를 들어, 오전 8 시부 터 오후 6 시까 지 결과를 제공하는 경우와 같이 쿼리를 매개 변수화해야하는 경우가 종종 있으므로 요약 표가 제한적으로 사용됩니다. (이 매개 변수는 충분한 빈도로 변경되어 여러 개의 요약 테이블을 만드는 것이 금지됩니다).

그 배경에서 첫 번째 질문은 다음과 같습니다. CouchDB가이 데이터에 적합한가? 위의 사용 사례를 감안할 때 CouchDB 문서에서 데이터를 가장 잘 모델링하는 방법은 무엇입니까? 우리가 벤치마킹의 과정에서 지금까지 조립 한 일부 옵션 (_id, _rev 제외)입니다 : 1 일 기준, 연결

{ 
    service_id:555 
    day:20100101 
    usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}} 
} 

약 60,000 새 문서 달 당

한 문서. 대부분의 새 데이터는 새 문서가 아닌 기존 문서의 업데이트입니다.

(여기에서 사용중인 객체는 폴링의 타임 스탬프에 키를 입력하고 바이트 인과 바이트 값을 출력합니다). 한달에 연결

{ 
    service_id:555 
    month:201001 
    usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}} 
} 

약 2,000 새 문서 달 당

한 문서. 필요한 기존 문서에 대한 보통 업데이트. 데이터의 행 당

한 문서는 한 달에

{ 
    service_id:555 
    timestamp:1265248762 
    in:584 
    out:11342 
} 
{ 
    service_id:555 
    timestamp:1265249062 
    in:94 
    out:1242 
} 

약 15,000,000 새 문서를 수집. 모든 데이터는 새 문서에 삽입됩니다. 더 빨리 삽입 할 수 있지만, 1 억년 또는 2 년 후에 수억 개의 문서가 얼마나 효율적으로 될 것인지 궁금합니다. 파일 I/O는 금지 된 것처럼 보일 것입니다. (비록 내가 처음으로 그것을 잘 이해하지 못한다고 인정하는 사람입니다.)

저는 RDMS 습관을 깨는 것이 어렵지만 문서 지향적 인 방식으로이 접근법을 시도하고 있습니다.보기에는 매개 변수화를 최소화 할 수 있다는 사실이 염려 스럽습니다. 그렇다면 위 중 어느 것이 가장 적절할까요? 내가 더 잘 수행 할 것으로 생각하지 않은 다른 형식이 있습니까?

미리 감사드립니다.

제이미.

답변

10

나는 그것이 끔찍한 생각이라고 생각하지 않습니다.

연결/월 시나리오를 생각해 봅시다.

항목의 길이가 ~ 40 (관대하기 때문에)이며, 한 달에 ~ 8,200 개의 항목이있는 경우 최종 문서 크기는 한 달 말 ~ 350K입니다.

즉, 풀 보어가되면 5 분마다 2000 350K 문서를 읽고 쓰는 것입니다.

I/O는 읽기와 쓰기를 고려하여 6MB/s 미만이며 5m 시간의 평균을 나타냅니다. 오늘날 로우 엔드 하드웨어에서도 그렇습니다.

그러나 다른 문제가 있습니다. 이 문서를 저장할 때, Couch는 내용을 평가하여보기를 작성하므로 Couch는 350,000 개의 문서를 구문 분석합니다. 내 두려움은 (마지막으로 확인했는데 얼마 동안이었습니다.) 나는 Couch가 CPU 코어를 통해 잘 확장되었다고 믿지 않아 Couch가 사용할 단일 CPU 코어를 쉽게 고정시킬 수 있다고 생각합니다. 소파가 2 MB/s를 읽고, 구문 분석하고 처리 할 수 ​​있기를 희망하지만, 솔직히 알지 못합니다. 모든 이점으로, erlang은 직선 컴퓨터 언어에서 최고의 엉덩이가 아닙니다.

마지막으로 염려하는 점은 데이터베이스 유지에 있습니다. 월말에 5 분마다 700MB를 씁니다. Couch 아키텍처 (추가 만)를 사용하면 5 분마다 700MB의 데이터를 작성하게되며, 시간당 8.1GB, 24 시간 후에 201GB가됩니다.

DB 압축 후 700MB로 축소되며 (한 달 동안), 그 과정에서 그 파일은 커지고 아주 빠르게됩니다.

검색 측면에서이 큰 문서는 나를 놀라게하지 않습니다. 350K JSON 문서를로드하는 중입니다. 그렇지만 크기는 크지 않습니다. 최신 하드웨어가 아닙니다. 그보다 더 큰 게시판에는 아바타가 있습니다. 그래서, 한 달 동안 연결의 활동에 관해서 당신이하고 싶은 것은 꽤 빠를 것이라고 생각합니다. 연결을 가로 지르면 분명히 더 많이 잡을수록 더 많은 비용이 들게 될 것입니다 (2000 년의 모든 연결에서 700MB). 700MB는 실질적인 영향을 미치는 실수입니다. 또한 처리 과정에서 700MB의 힙 (heap)을로드하지 않으려는 경우 프로세스가 걱정하지 않는 데이터를 제거하는 데 적극적이어야합니다.

이러한 숫자가 주어지면 세분화를 조금 더 잘 제어 할 수 있으므로 Connection/Day가 더 나은 방법 일 수 있습니다. 그러나 솔직히 말해서 내가 할 수있는 가장 조잡한 문서는 데이터베이스에서 최상의 가치를 제공한다고 생각하기 때문에 오늘날 모든 헤드 탐색과 플래터 로테이션은 많은 I/O 성능을 죽이거나 많은 디스크 데이터를 매우 잘 스트림합니다. 더 큰 문서 (잘 위치 된 데이터를 가정하면, 소파는 지속적으로 압축되므로 문제가되지 않습니다.) 탐색보다 더 많은 스트리밍. 메모리를 찾는 것은 디스크에 비해 "무료"입니다.

하드웨어에서 직접 테스트를 실행하십시오.하지만 이러한 모든 고려 사항을 염두에 두시기 바랍니다.

편집 : 더 실험 후

... 흥미로운 관찰의

커플.

큰 문서를 가져 오는 동안 CPU는 I/O 속도와 똑같이 중요합니다. 이는 뷰에서 사용하기 위해 JSON을 내부 모델로 변환하여 마샬링 및 CPU 사용량을 소비하기 때문입니다. 대형 (350k) 문서를 사용하면 CPU 사용률이 350 % 나 떨어졌습니다. 대조적으로, 작은 문서에서는 200 %로 허밍을하고 있었지만 전반적으로 동일한 정보 였지만 다르게 덩어리졌습니다.

I/O의 경우 350K 문서에서 11MB/초의 차트를 작성했지만 작은 문서의 경우 8MB/초 밖에되지 않았습니다.

압축은 거의 I/O 바인딩 된 것으로 보입니다. I/O 잠재력에 대해 좋은 숫자를 얻는 것이 어렵습니다. 캐시 된 파일의 사본은 40MB/초를 푸시합니다. 압축은 약 8MB/sec로 실행되었습니다. 그러나 그것은 원시 하중과 일치합니다 (소파가 메시지로 물건 메시지를 움직이고 있다고 가정). CPU는 처리량이 적어 (JSON 페이로드를 해석하지 않거나 뷰를 다시 작성하지 않기 때문에), 작업을 수행하는 단일 CPU였습니다.

마지막으로, 읽기 위해 전체 데이터베이스를 덤프하려고했습니다. 단일 CPU가이를 위해 고정되어 있고 I/O가 꽤 낮습니다. CouchDB 파일이 실제로 캐시되지 않았 음을 확인하기 위해 지점을 만들었고, 내 컴퓨터에는 많은 메모리가 있으므로 많은 것들이 캐시됩니다. _all_docs를 통한 원시 덤프는 약 1MB/초에 불과했습니다. 그것은 거의 모든 탐색 및 회전 지연입니다. 대형 문서를 사용하여 I/O를 수행했을 때 3MB/초의 속도를 보였으 나 큰 문서의 경우 스트리밍 효과가 나타났습니다.

그리고 내가 따라 가지 않은 성능 향상에 대한 기술 웹 사이트가 있습니다. 특히 무작위 ID를 사용하고있었습니다. 마지막으로, 이것은 결국 Couch의 성능이 무엇인지에 대한 척도로서 수행되지 않았습니다. 내가 생각한 큰 문서 대 작은 문서의 차이점은 흥미 롭다.

마지막으로 궁극적 인 성능은 단순히 하드웨어로 응용 프로그램을 수행하는 것만 큼 중요하지 않습니다. 언급했듯이, 당신은 당신 자신의 테스트를하고 있으며, 그것이 정말로 중요합니다.

+0

CouchDB는 뷰 서버가보기를 처리하기 위해 여러 시스템 프로세스를 실행하므로 여러 코어에서 확장이 잘됩니다. 나머지 CouchDB는 Erlang에 있으며 여러 개의 코어를 사용하는 데에도 뛰어납니다. – mikeal

+0

네 말이 맞아. 나는 테스트를 실시했고, 나는이 큰 문서 2000 개 (v0.9 Couch 인스턴스에 동시에 100 개를 삽입하는 20 개의 프로세스)를 삽입했다. 4 코어 2.66G Mac Pro에서는 기본적으로 3m30에 삽입되었습니다. 소파는 CPU의 350 %를 차지했습니다. 결국 디스크 파일은 ~ 2G였습니다. 압축 후에도 전혀 변하지 않았습니다. 대조적으로, 2000 "일일"문서를 삽입하는 데 18 초가 걸렸습니다. 물론 더 빨라요. 3m30s가 5m 창에 너무 가깝습니다. 18 대가 훨씬 낫습니다. 압축은 거의 3m가 걸렸습니다. –

+0

대단히 감사합니다. 시작하기 좋은 곳입니다. 우리는 몇 가지 벤치 마크를 실행했고 당신과 거의 같은 것을 발견했습니다. 우리가해야 할 주요 쟁점은 데이터에 대한 지속적인 업데이트입니다. "전체 월"문서가 너무 느려지는 것처럼 보입니다. 우리가 정기적으로 압축 할 수있는 한 잘하면 우리는 괜찮을거야. 데이터 포인트 당 하나의 문서로 갈 수는 없지만 파일 IO가 금지 된 것으로 의심되는 것은 수치스러운 일입니다. 불행히도 다른 종류의 문서를 업데이 트하려면, 우리는 _rev를 얻기 위해, 우리가 쓸 수 전에 읽을 필요가 ... – majelbstoat