2017-05-25 64 views
1

我正在Cassandra運行一個非常小的數據集,以便數據只能存在於memtable中。下面是我的配置:Cassandra - 如何禁用memtable刷新

在jvm.options:

-Xms4G 
-Xmx4G 

在cassandra.yaml,

memtable_cleanup_threshold: 0.50 
memtable_allocation_type: heap_buffers 

按在cassandra.yaml的文檔中,memtable_heap_space_in_mbmemtable_heap_space_in_mb將會設置堆大小的1/4,即1000MB

根據此處的文檔(http://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/configCassandra_yaml.html#configCassandra_yaml__memtable_cleanup_threshold),如果memtabl的總大小超出(1000 + 1000)* 0.50 = 1000MB,memtable刷新將觸發。

現在,如果我執行幾個寫入請求導致大約300MB的數據,memtable仍會刷新,因爲我看到sstables是在文件系統(Data.db等)上創建的,我不明白爲什麼。

任何人都可以解釋這種行爲,並指出如果我在這裏失去了一些東西?

+0

你爲什麼不使用Redis? Redis是一個開源(BSD許可),內存數據結構存儲,用作數據庫,緩存和消息代理。 https://redis.io/ –

回答

0

下面是我從卡桑德拉用戶組得到的迴應,如果別人在這裏複製它正在尋找類似信息。

考慮你的情況後,我相信你的小SSTable大小可能是由於數據壓縮。默認情況下,所有表都啓用SSTable壓縮。

讓我們通過你的場景。假設您已將4GB分配給您的Cassandra節點。您的memtable_heap_space_in_mb和 memtable_offheap_space_in_mb將大致達到1GB左右。由於您的memtable_cleanup_threshold爲.50,當分配的總表空間超過1/2GB時,將會觸發表清理。請注意,清除閾值爲1GB的.50,而不是堆和非堆空間的組合。該memtable分配大小是節點上所有表可用的總量。這包括所有系統相關的密鑰空間。清理過程會將最大的memtable寫入磁盤。

對於你的情況,我假設你在一個節點上只有一個插入活動的表。在這種情況下,我認爲提交日誌不會觸發刷新,因爲默認情況下提交日誌有8192 MB的空間,除非提交日誌放置在非常小的磁盤上。

我假設磁盤上的表是不是因爲壓縮的500MB小。您可以禁用桌面上的壓縮並查看這是否有助於獲得所需的大小。

我已經寫了一篇博客文章,解釋的memTable沖洗(http://abiasforaction.net/apache-cassandra-memtable-flush/

讓我知道,如果您有任何其他問題。

我希望這會有所幫助。

1

memtable刷新的另一個觸發器是使用的commitlog空間(默認32mb)。

http://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsMemtableThruput.html

http://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/configCassandra_yaml.html#configCassandra_yaml__commitlog_total_space_in_mb

自卡桑德拉應該是持久的,它應該做的寫入到磁盤拿出節點失敗後的數據。如果你不需要這個的耐用性,你可以使用任何其他基於內存的數據庫 - Redis的,內存緩存等

+0

我實際上通過在創建密鑰空間時添加了durable_writes = false來禁用了提交日誌。所以它不應該基於提交日誌觸發flush,但它仍然將其轉儲到sstable。 – pree