Cassandra 卡桑德拉缺乏可伸缩性

Cassandra 卡桑德拉缺乏可伸缩性,cassandra,scalability,Cassandra,Scalability,我对Cassandra数据库的可伸缩性有问题。尽管将节点数从2个增加到8个,但数据库的性能并没有增长 Cassandra Version: 3.7 Cassandra Hardware x8: 1vCPU 2.5 Ghz, 900 MB RAM, SSD DISK 20GB, 10 Gbps LAN Benchmark Hardware x1: 16vCPU 2.5 GHz, 8 GB RAM, SSD DISK 5GB, 10 Gbps LAN 在cassandra.yaml中更改了默认设置

我对Cassandra数据库的可伸缩性有问题。尽管将节点数从2个增加到8个,但数据库的性能并没有增长

Cassandra Version: 3.7
Cassandra Hardware x8: 1vCPU 2.5 Ghz, 900 MB RAM, SSD DISK 20GB, 10 Gbps LAN
Benchmark Hardware x1: 16vCPU 2.5 GHz, 8 GB RAM, SSD DISK 5GB, 10 Gbps LAN
在cassandra.yaml中更改了默认设置:

cluster_name: 'tst'
seeds: "192.168.0.101,192.168.0.102,...108"
listen_address: 192.168.0.xxx
endpoint_snitch: GossipingPropertyFileSnitch
rpc_address: 192.168.0.xxx
concurrent_reads: 8
concurrent_writes: 8
concurrent_counter_writes: 8
键空间:

create keyspace tst WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '2' }; 
示例表:

CREATE TABLE shares (
    c1 int PRIMARY KEY,
    c2 varchar,
    c3 int,
    c4 int,
    c5 int,
    c6 varchar,
    c7 int
);
测试中使用的示例查询:

INSERT INTO shares (c1, c1, c3, c4, c5, c6, c7) VALUES (%s, '%s', %s, %s, %s, '%s', %s)
对于与基地的连接,我将使用。在多线程中,我根据说明使用一个集群对象和一个会话对象。连接:

PoolingOptions poolingOptions = new PoolingOptions();
poolingOptions.setConnectionsPerHost(HostDistance.LOCAL, 5, 300);
poolingOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, 10);
poolingOptions.setPoolTimeoutMillis(5000);
QueryOptions queryOptions = new QueryOptions();
queryOptions.setConsistencyLevel(ConsistencyLevel.QUORUM);

Builder builder = Cluster.builder();
builder.withPoolingOptions(poolingOptions);
builder.withQueryOptions(queryOptions);
builder.withLoadBalancingPolicy(new RoundRobinPolicy());
this.setPoints(builder); // here all of the nodes are added
Cluster cluster = builder.build()
查询代码:

public ResultSet execute(String query) {
ResultSet result = this.session.execute(query);
return result;
}
public ResultSet execute(String query) {
ResultSet result = this.session.execute(query);
return result;
}
在测试工作期间,所有节点上的内存使用率为80%,CPU使用率为100%。我对在监视器中使用连接感到惊讶(太低):

监视器的代码:


我试图测试几个NoSQL数据库的可伸缩性。在Redis base的例子中,它是线性可伸缩性的,在这里她根本不是,我不知道为什么。谢谢你的帮助

每台机器上的1GB内存是一个非常低的目标。这可能导致GC压力过大。检查您的日志以查看GC活动,并尝试了解这100%的CPU上限是否是由于JVM一直在执行GC

另一个怪癖:每台机器上运行多少线程?如果您试图使用此代码(您的代码)进行缩放:

查询代码:

public ResultSet execute(String query) {
ResultSet result = this.session.execute(query);
return result;
}
public ResultSet execute(String query) {
ResultSet result = this.session.execute(query);
return result;
}

那你就走不了多远了。同步查询的速度慢得令人绝望。即使您尝试使用更多的线程,1GB的RAM也可能太低(我已经知道了…)。。。为了资源消耗和可伸缩性,您可能应该编写异步查询。

每台机器上1GB的RAM是一个非常低的目标。这可能导致GC压力过大。检查您的日志以查看GC活动,并尝试了解这100%的CPU上限是否是由于JVM一直在执行GC

另一个怪癖:每台机器上运行多少线程?如果您试图使用此代码(您的代码)进行缩放:

查询代码:

public ResultSet execute(String query) {
ResultSet result = this.session.execute(query);
return result;
}
public ResultSet execute(String query) {
ResultSet result = this.session.execute(query);
return result;
}

那你就走不了多远了。同步查询的速度慢得令人绝望。即使您尝试使用更多的线程,1GB的RAM也可能太低(我已经知道了…)。。。您可能应该编写异步查询,以兼顾资源消耗和可伸缩性。

谢谢!我在基准测试中使用了1000个线程。如果我使用异步连接,我将如何在一段时间内检查query的值?1000个线程可能太多了…坚持使用2x vCPU线程(在您的情况下是32个线程)然后走异步路线。稍后您将增加它们。通常您会收集一个
ResultSetFuture
futures对象列表。当您收集最大数量的机上查询时(最初为1000个)你要等待它们全部完成,这样你就可以施加一些反压力,而不会给你的集群带来压力。如果你喜欢这种风格,你也可以注册对futures的回调。请参见示例。谢谢!我在基准测试中使用了1000个线程。如果我使用异步连接,我将如何在一段时间内检查query的值?1000个线程可能太多了…坚持使用2x vCPU线程(在您的情况下是32个线程)然后走异步路线。稍后您将增加它们。通常您会收集一个
ResultSetFuture
futures对象列表。当您收集最大数量的机上查询时(最初为1000个)您等待它们全部完成,这样您就可以施加一些反压力,而不会给集群带来压力。如果您喜欢这种样式,您还可以向futures注册回调。例如,请参阅。您的分区键有哪些类型的值?数据的分布情况如何?Cassandra通过计算主键上的散列来分发数据。如果您所有的数据都有少量的PK值,那么无论您使用多少服务器,分区键都有哪些类型的值?数据的分布情况如何?Cassandra通过计算主键上的散列来分发数据。如果您所有的数据都有少量的PK值,那么使用多少服务器无关紧要。