2017-08-13 35 views
0

在cassandra yaml文件中有一個mem表堆大小配置..lets說它是2gb ...現在如果清理閾值是33%..那麼在675 mb的mem表空間被佔用之後.. cassandra會將最大的mem表刷新到磁盤..我的問題是cassandra對剩餘的mem表空間是1373 mb(2048-675)。Cassandra Mem表內容

根據我的理解,在任何時間點memtable空間中的數據不會超過675 Mb,當mem表數據增長超過675 mb時,最大memtable被刷新到磁盤並且mem表空間中的數據大小再次變爲小於675 mb ...並且這個過程繼續......那麼爲什麼我們需要分配2GB的mem表空間......它背後的原因是什麼...... mem表dpace包含mem表以外的任何其他東西。 ..

回答

1

刷新不是即時的,它不會阻止其他寫入進來。它本質上爲寫入創建一個新的「活動」memtable,並將前一個寫入隊列以刷新到磁盤(它仍然可以被用於讀取直到被刷新)。所以堆上使用的空間肯定會超過你的threshold * space

這種行爲在較早版本的Cassandra中會有所不同,它會實際上阻止寫入,直到刷新完成(tpstats將此顯示爲在FlushWriter下被阻止,這已不再可行)。

因爲在發生刷新時memtables的大小可以繼續增長,所以會出現一箇中斷限制(memtable_heap_space_in_mb設置),實際上它會停止寫入操作以防止它失控並導致OutOfMemory異常。這個設置更多的是一個限制,它可以擴展到比立即分配的一塊內存和爲memtables保留的內存。

還要注意memtable_cleanup_threshold被棄用:

默認計算是唯一合理的選擇。

+0

有使用情況下,您可能希望更頻繁地刷新,在磁盤延遲的臉放棄吞吐量耐久性(特別是環境中的磁盤暫停發生,像EBS支持AWS實例) –

+0

克里斯..感謝了很多澄清..什麼是現在的合理選擇... cassandra 3x使用什麼邏輯來刷新memtable –

+0

我會建議堅持使用默認值,除非有其他原因。即像使用EBS時提到的傑夫一樣。即使在那裏,我會開始使用默認設置,並在嘗試調整之前先在自己的負載下進行一些測試。在調整之前,這些調整應該在memtables之前審查。確保使用推薦的內核設置(http://docs.datastax.com/en/landing_page/doc/landing_page/recommendedSettings.html)並首先查看JVM堆設置。 –