为什么我的 cassandra 吞吐量在我添加节点时没有提高?
Why is my cassandra throughput not improving when I add nodes?
这是一个新手问题。我试图做我的家庭作业,但我一直在努力学习 cassandra 如何像广告那样线性扩展。当我 运行 针对单个 cassandra 节点时,我得到了合理的插入率。以下是一些相关信息:
- CentOS 6.5
- java1.7.0_71
- cassandra 2.1.4 二进制文件下载
- 不同驱动器上的数据和提交日志
- compaction_throughput_mb_per_sec: 0
- 10,000,000 次插入
- 插入率:~110K inserts/s
- 还没有实现 these settings,因为我对让事情变得像观察线性缩放一样快不感兴趣。
我的键空间定义是这样的:
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 个 tableId(分区键),每个 "owned" 由一个线程和唯一的 sampleTimes。其他数据是填充垃圾。
我发现最佳点是每批约 10 个插入和 10 个 executeAsync() 调用组。
到目前为止一切顺利。现在,在 SSD SAN 上添加了 4 个节点、搜索硬件和 3 个虚拟机 运行ning(我知道这并不理想)。我为每个节点使用了与我上面描述的类似的配置,运行 我的简单测试期待一些改进。插入率没有变化。我无法解释。我会期待一些改进。此外,2、3、4 和 5 个节点的速率基本保持不变。我意识到奇数可能没有意义,但我很绝望。
然后我尝试设置复制因子为零的键空间。我的数据速率下降到 1K inserts/s。我无法解释这一点。我一定是遗漏了一些非常明显的东西,但我看不到它。
您批次中的插入是否不共享相同的分区键 (tableId)?如果他们不使用唯一分区键在批处理中插入,则在处理您的请求的 cassandra 节点上将被视为单独的突变,它需要将这些突变发送到负责的副本。随着集群规模的增长,这实际上可能会降低性能,因为需要联系更多副本才能完成批处理。
如果您将批次保持在每个批次的单个分区中,或者根本不使用批次,则应该可以通过更多节点提高性能。请参阅 'Batch Loading without the Batch' 关键字作为优化此关键字的良好参考。
关于复制因子较低导致性能下降的问题,这是因为当您降低复制因子时,副本在集群中的数据表示较少,因此如果它无法满足您的请求分布在分区键之间。
也许插入客户端应用程序已达到极限,而不是集群?可以尝试使用另一台机器和 运行 那台机器上的 java 代码,看看两个客户端的吞吐量是否减半或相同。
1) 正如 Chris 所建议的那样,您可能正在最大化插入客户端。
2) 您是 SAN 上的 运行 个虚拟机,它在所有虚拟机之间共享 IO 带宽。实际上,您并没有像在共享相同资源的更多虚拟副本之间分配负载那样增加容量。
3) 批处理通常不是为了提高速度,而是将多个语句组合成单个逻辑操作。你在你的协调器上做了很多工作,这最终会影响缩放:http://docs.datastax.com/en/cql/3.1/cql/cql_using/useBatch.html
这是一个新手问题。我试图做我的家庭作业,但我一直在努力学习 cassandra 如何像广告那样线性扩展。当我 运行 针对单个 cassandra 节点时,我得到了合理的插入率。以下是一些相关信息:
- CentOS 6.5
- java1.7.0_71
- cassandra 2.1.4 二进制文件下载
- 不同驱动器上的数据和提交日志
- compaction_throughput_mb_per_sec: 0
- 10,000,000 次插入
- 插入率:~110K inserts/s
- 还没有实现 these settings,因为我对让事情变得像观察线性缩放一样快不感兴趣。
我的键空间定义是这样的:
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 个 tableId(分区键),每个 "owned" 由一个线程和唯一的 sampleTimes。其他数据是填充垃圾。
我发现最佳点是每批约 10 个插入和 10 个 executeAsync() 调用组。
到目前为止一切顺利。现在,在 SSD SAN 上添加了 4 个节点、搜索硬件和 3 个虚拟机 运行ning(我知道这并不理想)。我为每个节点使用了与我上面描述的类似的配置,运行 我的简单测试期待一些改进。插入率没有变化。我无法解释。我会期待一些改进。此外,2、3、4 和 5 个节点的速率基本保持不变。我意识到奇数可能没有意义,但我很绝望。
然后我尝试设置复制因子为零的键空间。我的数据速率下降到 1K inserts/s。我无法解释这一点。我一定是遗漏了一些非常明显的东西,但我看不到它。
您批次中的插入是否不共享相同的分区键 (tableId)?如果他们不使用唯一分区键在批处理中插入,则在处理您的请求的 cassandra 节点上将被视为单独的突变,它需要将这些突变发送到负责的副本。随着集群规模的增长,这实际上可能会降低性能,因为需要联系更多副本才能完成批处理。
如果您将批次保持在每个批次的单个分区中,或者根本不使用批次,则应该可以通过更多节点提高性能。请参阅 'Batch Loading without the Batch' 关键字作为优化此关键字的良好参考。
关于复制因子较低导致性能下降的问题,这是因为当您降低复制因子时,副本在集群中的数据表示较少,因此如果它无法满足您的请求分布在分区键之间。
也许插入客户端应用程序已达到极限,而不是集群?可以尝试使用另一台机器和 运行 那台机器上的 java 代码,看看两个客户端的吞吐量是否减半或相同。
1) 正如 Chris 所建议的那样,您可能正在最大化插入客户端。
2) 您是 SAN 上的 运行 个虚拟机,它在所有虚拟机之间共享 IO 带宽。实际上,您并没有像在共享相同资源的更多虚拟副本之间分配负载那样增加容量。
3) 批处理通常不是为了提高速度,而是将多个语句组合成单个逻辑操作。你在你的协调器上做了很多工作,这最终会影响缩放:http://docs.datastax.com/en/cql/3.1/cql/cql_using/useBatch.html