Cassandra读取性能
什么原因导致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
是什么原因导致卡桑德拉集群是在读操作慢20%,比单节点集群?
物理学。
对于单节点集群,有几件事情总是会更好。特别是像这样的令人难以置信的小数据集。只要负载小于单个节点可以处理的负载,那就是理论上可以从节点获得的最佳性能。当你添加节点时,你会增加工作量,直到你增加节点的数量,你对集群将会做什么不太现实的看法,所以单节点基准测试并没有多大意义。它不会做所有使Cassandra成为分布式数据库的东西。运行单个节点群集非常危险。
在单节点群集上,不需要与其他节点进行任何通信,无论连接速度有多快,都会比本地工作慢一个数量级。即使大部分工作是异步完成的,它仍然需要执行诸如副本的排序,挑选摘要节点,存储和跟踪提示,基于异步读取修复比较和修复数据(btw设置dclocal_read_repair_chance = 0可能有助于一点)。
如果不使用令牌感知的负载均衡策略,它可能会更糟糕,因为协调器将不得不阻止发送响应,直到它可以首先从另一个节点查询它。
此外,在添加节点之前,不要指望线性增加吞吐量,直到完全实现分布式开销(〜5)之后。
如果您确实需要,请将读取修复机会设置为0并增加RF = N,您可能会看到更符合您的期望的内容。
您还可以添加正在测试的表的模式吗? –
嗨,我编辑了我的帖子并添加了密钥空间描述。密钥空间由Cassandra压力测试工具自动创建。 – alex07