2017-10-09 124 views
2

什麼原因導致Cassandra集羣成爲讀取操作比單節點集羣要慢20%Cassandra讀取性能

我建立了一個Cassandra集羣,其中有3個節點並測試了讀取性能。我使用Cassandra的綜合壓力測試工具。爲了比較,在同一臺服務器上有一個單獨的節點(單節點羣集)。

配置如下: 1具有Cassandra羣集(3個節點,v.3.11)+ 1個單節點羣集的Hyper-v2服務器,其自身虛擬機上的每個節點(CentOS 7)及其自身的物理SSD驅動器(4個驅動器)。

每個虛擬機都有16GB的RAM,並且可以訪問服務器CPU的全部16個邏輯核心。節點之間的網絡速度約爲500MB/s。 我用1M行執行了READ測試幾次並啓用了預熱。所有默認設置都被使用(包括一致性= 1)。

單節點Cassandra總是比集羣(2000 op/s)獲得更好的讀取性能(約2400 op/s)。 爲什麼我在多節點羣集中看到性能下降?我在集羣配置中做錯了什麼?

CREATE KEYSPACE keyspace1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true; 

CREATE TABLE keyspace1.standard1 (
key blob PRIMARY KEY, 
"C0" blob, 
"C1" blob, 
"C2" blob, 
"C3" blob, 
"C4" blob 
) WITH COMPACT STORAGE 
AND bloom_filter_fp_chance = 0.01 
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} 
AND comment = '' 
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} 
AND compression = {'enabled': 'false'} 
AND crc_check_chance = 1.0 
AND dclocal_read_repair_chance = 0.1 
AND default_time_to_live = 0 
AND gc_grace_seconds = 864000 
AND max_index_interval = 2048 
AND memtable_flush_period_in_ms = 0 
AND min_index_interval = 128 
AND read_repair_chance = 0.0 
AND speculative_retry = '99PERCENTILE'; 

測試結果

cassandra-stress read n=1000000 cl=local_one -node IPADDRESS -rate threads=1 

Single-node stress test results

Multi-node stress test results

+2

您還可以添加正在測試的表的模式嗎? –

+1

嗨,我編輯了我的帖子並添加了密鑰空間描述。密鑰空間由Cassandra壓力測試工具自動創建。 – alex07

回答

1

是什麼原因導致卡桑德拉集羣是在讀操作慢20%,比單節點集羣?

物理學。

對於單節點集羣,有幾件事情總是會更好。特別是像這樣的令人難以置信的小數據集。只要負載小於單個節點可以處理的負載,那就是理論上可以從節點獲得的最佳性能。當你添加節點時,你會增加工作量,直到你增加節點的數量,你對集羣將會做什麼不太現實的看法,所以單節點基準測試並沒有多大意義。它不會做所有使Cassandra成爲分佈式數據庫的東西。運行單個節點羣集非常危險。

在單節點羣集上,不需要與其他節點進行任何通信,無論連接速度有多快,都會比本地工作慢一個數量級。即使大部分工作是異步完成的,它仍然需要執行諸如副本的排序,挑選摘要節點,存儲和跟蹤提示,基於異步讀取修復比較和修復數據(btw設置dclocal_read_repair_chance = 0可能有助於一點)。

如果不使用令牌感知的負載均衡策略,它可能會更糟糕,因爲協調器將不得不阻止發送響應,直到它可以首先從另一個節點查詢它。

此外,在添加節點之前,不要指望線性增加吞吐量,直到完全實現分佈式開銷(〜5)之後。

如果您確實需要,請將讀取修復機會設置爲0並增加RF = N,您可能會看到更符合您的期望的內容。