2012-08-24 73 views
1

我使用卡桑德拉0.8與對於喜歡「的DeviceID」和「DAYOFYEAR」列2個二級索引。我有這兩個索引爲了檢索日期範圍內的設備的數據。每當我得到一個日期過濾器,我將它轉換爲DayOfYear並使用.net Thrift API使用索引片進行搜索。目前我無法升級數據庫。卡桑德拉二級索引get_indexed_slices超時

我的問題是我平時沒有使用get_indexed_slices查詢當前日期(用一年的當日)檢索行的任何問題。但是,每當我查詢一年中的哪一天(這是索引列之一),我第一次查詢時就會超時。而且大多數情況下,我在第二次查詢時會返回,在第三次時爲100%。

這兩列創建爲列家庭雙數據類型,並且一般來說,我每分鐘1分的紀錄。我在集羣中有3個節點,nodetool報告表明節點已啓動並正在運行,儘管nodetool的負載分佈報告如下所示。

Starting NodeTool Address DC Rack Status State Load Owns
xxx.xx.xxx.xx datacenter1 rack1 Up Normal 7.59 GB 51.39%
xxx.xx.xxx.xx datacenter1 rack1 Up Normal 394.24 MB 3.81%
xxx.xx.xxx.xx datacenter1 rack1 Up Normal 4.42 GB 44.80%
和我在YAML中的配置如下。

hinted_handoff_enabled: true
max_hint_window_in_ms: 3600000 # one hour
hinted_handoff_throttle_delay_in_ms: 50
partitioner: org.apache.cassandra.dht.RandomPartitioner
commitlog_sync: periodic
commitlog_sync_period_in_ms: 120000
flush_largest_memtables_at: 0.75
reduce_cache_sizes_at: 0.85
reduce_cache_capacity_to: 0.6
concurrent_reads: 32
concurrent_writes: 24
sliced_buffer_size_in_kb: 64
rpc_keepalive: true
rpc_server_type: sync
thrift_framed_transport_size_in_mb: 15
thrift_max_message_length_in_mb: 16
incremental_backups: true
snapshot_before_compaction: false
column_index_size_in_kb: 64
in_memory_compaction_limit_in_mb: 64
multithreaded_compaction: false
compaction_throughput_mb_per_sec: 16
compaction_preheat_key_cache: true
rpc_timeout_in_ms: 50000
index_interval: 128

有什麼我可能會丟失?配置中有沒有問題?

+0

我提到的版本出錯了。安裝的版本是1.0.5而不是.8。抱歉,添麻煩了。 – Muthu

回答

-1

我終於以不同的方式解決了我的問題。事實上,我意識到問題出在我的數據模型上。

問題出現是因爲我們來自RDBMS背景。我稍微調整了數據模型,現在我得到的反應更快。

2

將您的數據複製到另一個列族中,其中鍵是您的搜索數據。排片都mutch更快

我個人從來沒有在生產環境中使用輔助指標。或者我有超時問題,或者二級索引檢索數據的速度比插入的數據量要低。我認爲這與不連續讀取數據和HD尋道時間有關。

+0

我發現另一個鏈接https://issues.apache.org/jira/browse/CASSANDRA-3545通過http://stackoverflow.com/questions/9741522/cassandra-performance-for-long-rows這可能是相關的。我正在檢查最新版本是否會提供解決方案。如果這是cassandra版本的問題,那麼我可能沒有別的選擇,只能遷移到較新的版本。 – Muthu

1

如果你來自一個關係模型,playOrm是一樣快,你可以在一個NoSQL的商店關係,但你只需要你的分區非常大的表。如果你這樣做,你可以使用「可擴展的JQL」來做你的東西

@NoSqlQuery(name =「findJoinOnNullPartition」,query =「PARTITIONS t(:partId)select t FROM TABLE as t INNER JOIN t.security作爲s where s.securityType =:type和t.numShares =:shares「)

IT對於基本的ORM也有@ManyToOne,@OneToMany等等註釋,雖然有些東西在noSQL中的工作方式不同,但是很多是類似的。

+0

謝謝你一定會看看。 – Muthu