2017-04-10 61 views
1

我有問題Cassandra ReadTimeOuts。 場景:加載到卡桑德拉Cassandra ReadTimeOuts

  • 3 GB數據,
  • 9個1個數據中心內Cassandra的節點,
  • 複製等於3,
  • 一致性水平等於1,
  • 卡桑德拉版本2.2.9

鏈接cassandra.yaml https://pastebin.com/x0bF7nLf

測試: 對於測試我使用Cassandra的jmeter插件。 請求是在提供的ID列表中提供行ID的條件選擇。列表總是包含100個ID。每個請求應始終返回100行(所有ID都在數據庫中)。 ID是隨機的,所以緩存角色會減少。

樣品選擇:

 
select * from price.item_vat_posting_group where no in ('B7B7A6','B2DD05','A34751','B4BC7D','C0BB53','D07DCB','C03716','BB99DF','A975C2','C2AE27','AF621C','242448','B30CDA','508336','B44D6B','D07422','AC44EA','C6F34D','9B25AC','C4CF12','AC25BD','C3D9C7','AE7DB2','C5E03E','BF7AC1','B499B5','A7787E','645180','A9BEFE','AFFEA4','A88955','D95B50','B0F9FC','C09174','253953','9ED9CA','CAF896','536951','214502','427776','DA14CB','422282','A4B10A','C56BF5','B373E0','D171EF','C70607','B350AB','9D809B','586563','BF6308','A4BF5A','C42716','C3261C','C45B79','C6FE55','D1F0D4','C483B5','A67D59','DC5898','9BACAD','D9C6B0','D17DAE','D8D4F3','A05946','BBEBA8','A87B37','A13E97','BB7099','A3FC26','C461DF','309810','BF6306','D07603','C59F70','C5906C','A515ED','B50056','A8390E','A0CCC7','BF2713','C6EC7D','D7EB9D','A5D5EB','984076','D88F44','257058','D61635','D40CDE','B0A347','B7617F','D6277E','B4286F','C41F99','D84232','DC1636','BFF15D','DD0972','9B3138'); 

方案1. 而在時間10分鐘卡桑德拉具有用於處理的請求的總數的5個%ReadTimeOuts發送請求由100個線程。 平均請求時間爲100毫秒。 每個Cassandra節點上的處理器使用率在40% - 50%之間。

場景2. 在24小時內由4個線程發送請求時,每10萬次請求發生大約10次ReadTimeOut。 每個Cassandra節點上的處理器使用率爲5%。

在這兩種情況下垃圾收集器的工作時間少於300毫秒。

錯誤消息:

 
Cassandra time-out during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded) 
com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded) 
at com.datastax.driver.core.exceptions.ReadTimeoutException.copy(ReadTimeoutException.java:69) 
at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:258) 

一些統計數據:

問題:

那是典型的卡桑德拉還是我做錯了什麼?

回答

3

您正在查詢中使用,查詢中在協調節點中放置了很多壓腳。當你在查詢中執行時,這意味着你在等待這個單一的協調器節點給你一個響應,它將所有這些查詢和他們的響應保存在堆中,如果其中一個查詢失敗或協調器失敗,你必須重試整個事情。

而不是在查詢中使用executeAsync與每個no單獨查詢。現在,如果一個查詢失敗,重試只需要一個小的快速查詢。

或者

更改您的數據模型,這樣就可以在查詢中使用時指定分區鍵。

注意:一次執行多個executeAsync同樣可以將壓腳放在您的羣集上。檢查此鏈接https://stackoverflow.com/a/30526719/2320144

更多:因爲你掃描大量分區的https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/

+0

感謝您的重播。但即使我已經消除「在查詢中」,仍然有ReadTimeOuts。在12小時內通過6000線程發送請求時,我獲得了0,01%的超時。這是正常的嗎? – pawski

+0

看起來好,但如果它不適合你,你可以改變你的數據模型,以便你可以指定分區鍵並執行範圍查詢。 –

+0

我的數據模型非常簡單。只有一個表中的幾個屬性。最後:ONE REQUEST等於ONE表中的一個查詢。 – pawski