2012-08-08 62 views
2

我們使用Cassandra進行日誌收集。 每小時約150,000 - 250,000條新紀錄。 我們的列家族有幾個列,比如'host','errorlevel','message'等,以及特殊索引列'indexTimestamp'。 此列包含四捨五入至幾小時的時間。Cassandra slow get_indexed_slices速度

所以,當我們希望得到一些記錄,我們使用的是第一IndexExpression get_indexed_slices()由indexTimestamp(含EQ運營商),然後其他一些IndexExpressions - 由主機,錯誤級別等

獲得當記錄只通過indexTimestamp一切工作正常。 但是,當通過indexTimestamp獲取記錄時,例如host - cassandra長時間工作(超過15-20秒)並引發超時異常。

據我所知,當通過索引列和非索引列獲取記錄時,Cassandra首先通過索引列獲取所有記錄,然後通過非索引列對其進行過濾。

那麼,爲什麼卡桑德拉這麼慢呢?通過indexTimestamp,不超過250,000條記錄。不可能在10秒時過濾它們嗎?

我們的Cassandra集羣運行在具有4個CPU和4 GB內存的一臺計算機(Windows 7)上。

回答

1

你必須記住卡桑德拉對於這種查詢非常不好。索引列查詢不適用於大型表格。如果你想圍繞這種類型的查詢搜索你的數據,你必須定製你的數據模型。

實際上Cassandra不是您可以查詢的數據庫。這是一個關鍵值存儲系統。要了解該信息,請轉到此處並快速瀏覽:http://howfuckedismydatabase.com/

幫助您的最基本模式是桶行和範圍分段查詢。

比方說,你有對象

user : { 
    name : "XXXXX" 
    country : "UK" 
    city : "London" 
    postal_code :"N1 2AC" 
    age : "24" 
} 

,當然你要查詢by city OR by ageand & or是另一個數據模型還)。

然後,你就必須保存你的數據是這樣,假設名稱是一個唯一的ID:

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

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

請注意,我用國家的城市搜索,並通過分時段年齡搜索的年齡段。

年齡EQ範圍查詢24將

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

作注"minus" == "under_score" - 1"equals" == "under_score" + 1,讓您有效地所有以「24_」

開始這還允許您查詢的列例如,年齡在21到24歲之間。

希望它有用