是什么原因导致Cassandra集群在读取操作中比单节点集群慢<20%?
我已经设置了一个带有 3个节点的Cassandra集群,并测试了读取性能。我使用了Cassandra的集成压力测试工具。为了进行比较,同一台服务器上有一个单独的节点(单节点集群)。
配置如下: 1个具有Cassandra集群的Hyper-v2服务器(3个节点,v.3.11)+ 1个单节点集群,其自身虚拟机(CentOS 7)上的每个节点及其自己的物理SSD驱动器(4个驱动器)。
每个虚拟机都有16GB的RAM,可以访问服务器CPU的所有16个逻辑核心。节点之间的网络速度约为500MB / s。 我用1M行运行了READ测试几次并启用了预热。使用所有默认设置(包括一致性= 1)。
单个节点Cassandra始终实现更好的读取性能(大约2400 op / s),而不是群集(2000 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
答案 0 :(得分:4)
是什么原因导致Cassandra集群在读取操作中比单节点集群慢20%?
物理。
对于单个节点群集,有一些事情会变得更好。特别是像这样令人难以置信的小数据集。只要负载小于单个节点可以处理的负载,理论上就可以从节点获得最佳性能。当你添加节点时,你增加了工作,buuut,直到你增加了节点的数量,你对集群将要做的事情有一个不切合实际的观点,所以单节点基准并不重要。它不会做所有使Cassandra成为分布式数据库的事情。运行单个节点集群非常危险。
在单节点群集上,无需与其他节点进行任何通信,无论连接速度有多快,都会比本地工作慢一个数量级。尽管大多数工作都是异步完成的,但它仍然必须执行诸如复制副本,选择摘要节点,存储和跟踪提示,基于读取修复异步比较和修复数据(btw设置dclocal_read_repair_chance = 0可能有帮助)一点点。
如果不使用令牌识别负载均衡策略,则可能会更糟糕,因为协调器必须阻止发送响应,直到它可以先从另一个节点查询它。
此外,在添加节点之前,不要指望吞吐量的线性改进,直到您完全实现分配开销(~5)之后。
如果您真的想要,请将读取修复几率设置为0并增加RF = N,您可能会看到更符合您的预期。
答案 1 :(得分:1)
一个猜测---
您可能在与单节点群集相同的节点上运行cassandra-stress。因此,不会有网络跃点。
对于您的三个节点,如果您在这些节点之一上运行cassandra-stress,则1/3的数据将是本地的。 2/3将需要网络跳。