这是一个新手问题。我曾尝试过做家庭作业,但我一直在努力学习cassandra如何像广告一样线性扩展。当我针对单个cassandra节点运行时,我得到合理的插入率。以下是一些相关的信息:
我的键空间定义是:
create keyspace nms WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };
use nms;
CREATE TABLE RN(tableId int, sampleTime timestamp, sampleValue bigint, sampleStdev bigint, sampleRate bigint, tz_offset int,
PRIMARY KEY (tableId, sampleTime));
我的相关java代码看起来像这样(粗略地):
cluster = Cluster.builder().addContactPoint("138.42.229.240")
.withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.ANY))
.withRetryPolicy(DefaultRetryPolicy.INSTANCE)
.withLoadBalancingPolicy(new TokenAwarePolicy(new RoundRobinPolicy()))
.build();
session = cluster.connect("nms");
batch = new BatchStatement();
statement = session.prepare("INSERT INTO RN" +
"(tableId, sampleTime, sampleValue, sampleStdev, sampleRate, tz_offset)" +
"VALUES (?, ?, ?, ?, ?, ?);");
我插入32个tableIds(分区键),每个“拥有”一个线程,以及唯一的sampleTimes。其他数据是填充垃圾。
我发现最佳点是每批10个插件和10个executeAsync()调用组。
到目前为止一切顺利。现在,在SSD SAN上添加了4个节点,scrounging硬件和3个VM(我不知道)。我使用了与上面描述的每个节点类似的配置,然后运行我的简单测试,期待一些改进。插入率没有变化。我无法解释。我本以期待一些改进。此外,2,3,4和5节点的速率基本保持不变。我意识到奇数可能毫无意义,但我绝望了。
然后我尝试设置复制因子为零的密钥空间。我的数据速率降至1K插入/秒。我无法解释这一点。我必须遗漏一些非常明显的东西,但我看不到它。
答案 0 :(得分:7)
也许插入客户端应用程序是最大的,而不是群集?可以尝试使用另一台机器并在该机器上运行java代码,看看两个客户端的吞吐量是否减半或相同。
答案 1 :(得分:4)
1)正如克里斯建议的那样,你可能正在最大化插入客户端。
2)您在SAN上运行VM,它在所有VM之间共享IO带宽。实际上,您不会像在共享相同资源的更多虚拟副本之间分配负载那样增加容量。
3)批量通常不是为了将多个语句组合成单个逻辑操作的速度。您在协调员身上投入了大量工作,这最终会影响扩展:http://docs.datastax.com/en/cql/3.1/cql/cql_using/useBatch.html
答案 2 :(得分:3)
批处理中的插入是否不共享相同的分区键(tableId)?如果它们不是每个插入批处理中的唯一分区键都被视为处理您的请求的cassandra节点上的单独变异,它需要将这些突变发送到负责的副本。随着群集大小的增长,这可能会降低性能,因为需要联系更多副本来完成批处理。
如果您将批次保留在每个批次的单个分区中,或者根本不使用批次,则应该使用更多节点来提高性能。请参阅'Batch Loading without the Batch'关键字,作为优化此优化的一个很好的参考。
关于以较低的复制因子丢失性能,这是因为当您减少复制因子时,副本在群集中的数据表示较少,因此如果它分散,则无法为您的请求提供尽可能多的服务在分区键之间。