2017-10-09 125 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,您可能会看到更符合您的期望的内容。