gpt4 book ai didi

java - Astyanax 客户端的 Cassandra 读取性能

转载 作者:行者123 更新时间:2023-12-01 04:41:11 25 4
gpt4 key购买 nike

我们在生产环境中使用Cassandra 数据库。我们有一个包含 24 个节点的单一跨托管集群,这意味着 PHX 中有 12 个节点,SLC 托管有 12 个节点。我们的复制因子为 4,这意味着每个数据中心将有 2 个副本。

下面是我们的生产 DBA 创建键空间列族的方式。

create keyspace profile with placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy' and strategy_options = {slc:2,phx:2};

create column family PROFILE_USER
with key_validation_class = 'UTF8Type'
and comparator = 'UTF8Type'
and default_validation_class = 'UTF8Type'
and gc_grace = 86400;

我们正在运行 Cassandra 1.2.2,它具有 org.apache.cassandra.dht.Murmur3PartitionerKeyCaching SizeTieredCompactionStrategy虚拟节点 也已启用。 Cassandra 节点部署在 HDD 而不是SSD 上。

我正在使用 Astyanax 客户端Cassandra 数据库 读取数据,使用一致性级别为 ONE。我使用 Astyanax 客户端 在生产集群中插入了 5000 万条记录(跨 24 个节点总共约 285GB 的数据),压缩完成后,我开始执行 读取 Cassandra 生产数据库

下面是我使用 Astyanax 客户端创建连接配置的代码-

/**
* Creating Cassandra connection using Astyanax client
*
*/
private CassandraAstyanaxConnection() {

context = new AstyanaxContext.Builder()
.forCluster(ModelConstants.CLUSTER)
.forKeyspace(ModelConstants.KEYSPACE)
.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
.setPort(9160)
.setMaxConnsPerHost(100)
.setSeeds("cdb03.vip.phx.host.com:9160,cdb04.vip.phx.host.com:9160")
.setLocalDatacenter("phx") //filtering out the nodes basis on data center
)
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
.setCqlVersion("3.0.0")
.setTargetCassandraVersion("1.2")
.setConnectionPoolType(ConnectionPoolType.ROUND_ROBIN)
.setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE))
.withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
.buildKeyspace(ThriftFamilyFactory.getInstance());

context.start();
keyspace = context.getEntity();

emp_cf = ColumnFamily.newColumnFamily(
ModelConstants.COLUMN_FAMILY,
StringSerializer.get(),
StringSerializer.get());
}

大多数时候,我在 8/9/10 毫秒 左右获得95% 的读取性能

我想看看是否有任何方法可以通过 Cassandra 数据库获得更好的读取性能我的印象是我将在 1 或 2 毫秒 时获得第 95 个百分位数,但在对生产集群进行一些测试后,我的所有假设都错了。从我运行客户端程序的位置到 Cassandra 生产节点的 Ping 时间平均为 0.3 毫秒。

下面是我得到的结果。

Read Latency(95th Percentile)      Number of Threads    Duration the program was running(in minutes)    Throughput(requests/seconds)    Total number of id's requested    Total number of columns requested
8 milliseconds 10 30 1584 2851481 52764072

任何人都可以阐明我还可以尝试哪些其他方法来实现良好的读取延迟性能吗?我知道可能有类似的人与我处于相同的情况,并且在生产中使用 Cassandra。任何帮助将不胜感激。

感谢您的帮助。

最佳答案

我会尝试以下操作:

阿斯提亚纳克斯

将 ConnectionPoolType 设置为 TOKEN_AWARE 而不是 ROUND_ROBIN。

此外,我会使用一些 Astyanax 延迟感知连接池功能。例如:

.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
.setPort(9160)
.setMaxConnsPerHost(100)
.setSeeds("cdb03.vip.phx.host.com:9160,cdb04.vip.phx.host.com:9160")
.setLocalDatacenter("phx") //filtering out the nodes basis on data center
.setLatencyScoreStrategy(new SmaLatencyScoreStrategyImpl(10000,10000,100,0.50))
)

延迟设置是通过 ScoreStrategy 的构造函数提供的。例如SmaLatencyScoreStrategyImpl .

我也在解决这个问题,所以如果我学到任何其他东西,我会在这里发帖。

参见:Latency and Token Aware configuration

Cassandra

您可以采取一些措施来优化读取。注意:我还没有尝试过这些,但它们在我要调查的事情 list 上(所以我想我会分享)。

缓存

启用键缓存和行缓存。

key 缓存

bin/nodetool --host 127.0.0.1 --port 8080 setcachecapacity MyKeyspace MyColumnFam 200001 0

行缓存

bin/nodetool --host 127.0.0.1 --port 8080 setcachecapacity MyKeyspace MyColumnFam 0 200005

然后在您的应用场景中检查该节点一段时间后的命中率:

bin/nodetool --host 127.0.0.1  --port 8080 cfstats

一致性

考虑读取一致性为 ONE请参阅this on Data Consistency (这是 DataStax 文档,但仍然相关)

考虑降低读取修复机会。

update column family MyColumnFam with read_repair_chance=.5

降低 read_repair_chance 后,请考虑调整复制因子以帮助提高读取性能(但这会杀死写入,因为我们将写入更多节点)。

create keyspace cache with replication_factor=XX;

磁盘

不确定这里是否需要做任何事情,但我认为我应该将其包括在内。确保最佳文件系统(例如 ext4)。如果您的复制因子很高,我们可以围绕它优化磁盘(知道我们将从 Cassandra 获得耐用性)。即哪种 RAID 级别最适合我们的设置。

关于java - Astyanax 客户端的 Cassandra 读取性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16501902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com