2012-08-08 2 views
2

로그 수집을 위해 카산드라를 사용하고 있습니다. 시간당 약 150,000 - 250,000 개의 새 레코드. 열 패밀리에는 'host', 'errorlevel', 'message'등의 여러 열과 특수 색인 열 'indexTimestamp'가 있습니다. 이 열은 시간을 반올림 한 시간을 포함합니다.카산드라 느린 get_indexed_slices 속도

그래서, 우리는 몇 가지 기록을 얻고 싶은 경우에, 우리는 (EQ 연산자) indexTimestamp에 의해 처음 IndexExpression와 get_indexed_slices() 다음 다른 IndexExpressions를 사용 - 등 호스트, 오류 수준에 의해

점점 기록 단지 indexTimestamp에 의해 모든 것이 잘 작동합니다. 그러나 indexTimestamp로 레코드를 가져 오는 경우 host - cassandra는 15-20 초 이상 작동하고 시간 초과 예외를 발생시킵니다.

인덱스 된 열과 인덱스되지 않은 열로 레코드를 가져올 때 Cassandra는 먼저 모든 레코드를 인덱싱 된 열로 가져오고 인덱싱되지 않은 열로 필터링합니다.

카산드라가 왜 그렇게 느린가요? indexTimestamp에는 250,000 개가 넘는 레코드가 없습니다. 10 초 후에 필터 할 수 있습니까?

우리의 Cassandra 클러스터는 CPU 4 개와 메모리 4 개가있는 하나의 컴퓨터 (Windows 7)에서 실행됩니다.

답변

1

카산드라가 이러한 종류의 쿼리에 매우 좋지 않다는 것을 명심해야합니다. 인덱싱 된 열 쿼리는 큰 테이블을위한 것이 아닙니다. 이 유형의 쿼리를 중심으로 데이터를 검색하려면 데이터 모델을 수정해야합니다.

실제로 카산드라는 쿼리 할 수있는 DB가 아닙니다. 키 - 값 스토리지 시스템입니다. 그 점을 이해하고 잠시 살펴보십시오. http://howfuckedismydatabase.com/

가장 기본적인 패턴은 버킷 행 및 원거리 범위 슬라이스 쿼리입니다.

은의 당신이 객체에게
user : { 
    name : "XXXXX" 
    country : "UK" 
    city : "London" 
    postal_code :"N1 2AC" 
    age : "24" 
} 

이 물론 당신이 by city 또는 by age ( and & or가 또 다른 데이터 모델) 조회 할 가정 해 봅시다. 나는 도시 검색에 의해 국가 bucketed

write(row = "UK", column_name = "city_XXXX", value = {...}) 

write(row = "bucket_20_to_25", column_name = "24_XXXX", value = {...}) 

참고 :

그럼 당신은 이름을 가정하는 것은 고유 한 ID입니다,이 같은 데이터를 저장해야 연령 검색을위한 연령대.

연령 EQ에 대한 범위 쿼리 (24)는 당신이 또한 당신이 조회 할 수 있도록 "24_"

로 시작 효과적으로 모든 열을주는 메모 "minus" == "under_score" - 1"equals" == "under_score" + 1

get_range_slice(row= "bucket_20_to_25", from = "24-", to = "24=") 

것 연령대는 21 ~ 24 세입니다.

유용했으면 좋겠다.