1

我们正在使用Cassandra database in production environment. 我们有一个single cross colo cluster of 24 nodes意义12 nodes in PHX12 nodes in SLC colo。我们有一个replication factor of 4which 的意思2 copies will be there in each datacenter

以下是我们keyspace的.column familiesProduction DBA's

使用 placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy' 和 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.Murmur3Partitionerwith和enabled 。Cassandra 节点部署在SSD 上。KeyCachingSizeTieredCompactionStrategyVirtual NodesHDD instead of

我正在使用从usingAstyanax client读取数据。我在生产集群中插入(在 24 个节点上总共大约 285GB 的数据),在压缩完成后,我开始做.Cassandra databaseconsistency level as ONE50 Millions recordsAstyanax clientread against the Cassandra production database

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

/**
 * 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());
}

大多数时候我都在95th percentile read performance四处走动8/9/10 ms

我想看看有什么方法可以让我变得更好read performanceCassandra database我的印象是我将获得第 95 个百分位,1 or 2 ms但是在对生产集群进行了一些测试之后,我的所有假设都出错了。我正在运行我的客户端程序的 Cassandra 生产节点的 Ping 时间是0.3ms average.

下面是我得到的结果。

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。任何帮助将不胜感激。

谢谢您的帮助。

4

1 回答 1

0

我会尝试以下方法:

阿斯蒂亚纳克斯

将 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

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

请参阅: 延迟和令牌感知配置

卡桑德拉

你可以做几件事来优化读取。注意:我没有尝试过这些,但它们在我的调查清单上(所以我想我会分享)。

缓存

启用键缓存和行缓存。

密钥缓存

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 请参阅数据一致性(这是 DataStax 文档,但仍然相关)

考虑降低读取修复的机会。

update column family MyColumnFam with read_repair_chance=.5

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

create keyspace cache with replication_factor=XX;

磁盘

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

于 2013-05-11T23:56:53.720 回答