我有一個三個Cassandra節點的集羣,具有或多或少的默認配置。最重要的是,我有一個由兩個節點組成的web層負載均衡,這兩個web節點都一直在查詢Cassandra。一段時間後,隨着Cassandra中存儲的數據變得不平凡,一個且僅有的一個Web節點開始在特定查詢中獲得ReadTimeoutException
。網絡節點在各個方面都是相同的。奇怪的Cassadra ReadTimeoutExceptions,取決於哪個客戶端正在查詢
的查詢非常簡單(?
是日期佔位符,當前時刻之前,通常在幾分鐘):
SELECT * FROM table WHERE time > ? LIMIT 1 ALLOW FILTERING;
表與此查詢創建:
CREATE TABLE table (
user_id varchar,
article_id varchar,
time timestamp,
PRIMARY KEY (user_id, time));
CREATE INDEX articles_idx ON table(article_id);
當超時,客戶端會等待10秒以上,這並不奇怪,對於大多數連接和讀取,在cassandra.yaml
中配置了超時。
有一對夫婦的事情,是我莫名其妙:
- 查詢只有當網絡節點中的一個執行它超時 - 節點中的一個總是失敗,其中一個節點總是成功。
- 查詢將返回瞬間,當我從
cqlsh
運行(儘管它似乎只命中,當我從那裏運行它的一個節點) - 有發出其他查詢這需要2-3分鐘(有很多比10秒長超時)根本沒有超時
我無法在Java中跟蹤查詢,因爲它超時。追蹤cqlsh
中的查詢並沒有提供太多的見解。我寧願不更改Cassandra超時,因爲這是生產系統,我想先耗盡非侵入性選項。 Cassandra節點都有很多堆,堆很遠,GC時間看起來很正常。
任何想法/方向將不勝感激,我完全沒有想法。 Cassandra版本是2.0.2,使用com.datastax.cassandra:cassandra-driver-core:2.0.2
Java客戶端。
此表中有多少行? – Aaron
在cqlsh中設置不同的一致性級別,然後再試一次 –
@ BryceAtNetwork23:<100 million – sbk