Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Cassandra与Astyanax客户端的读取性能_Java_Nosql_Cassandra_Astyanax_Netflix - Fatal编程技术网

Java Cassandra与Astyanax客户端的读取性能

Java Cassandra与Astyanax客户端的读取性能,java,nosql,cassandra,astyanax,netflix,Java,Nosql,Cassandra,Astyanax,Netflix,我们正在生产环境中使用Cassandra数据库。我们有一个由24个节点组成的单交叉colo集群,这意味着在PHX中12个节点,在SLC colo中12个节点。我们的复制系数为4,这意味着每个数据中心将有2个副本 下面是我们的生产DBA创建键空间和列系列的方法 使用placement_策略创建键空间配置文件= “org.apache.cassandra.locator.NetworkTopologyStrategy”和 策略_选项={slc:2,phx:2} create column famil

我们正在生产环境中使用
Cassandra数据库
。我们有一个由24个节点组成的
单交叉colo集群
,这意味着在PHX中
12个节点
,在SLC colo中
12个节点
。我们的
复制系数为4
,这意味着
每个数据中心将有2个副本

下面是我们的
生产DBA创建
键空间
列系列
的方法

使用placement_策略创建键空间配置文件= “org.apache.cassandra.locator.NetworkTopologyStrategy”和 策略_选项={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.multirre3partitioner
,并启用了
KeyCaching
SizeTieredCompactionStrategy
虚拟节点Cassandra节点部署在
HDD而不是
SSD`.

我正在使用
Astyanax客户端
Cassandra数据库
读取数据,使用
一致性级别作为一个
。我使用
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());
}
大多数情况下,我获得的
第95百分位读取性能约为
8/9/10 ms

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

下面是我得到的结果

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
有没有人能告诉我,我还可以尝试哪些方法来获得良好的读取延迟性能?我知道在我同样的情况下,可能也有类似的人在生产中使用卡桑德拉。任何帮助都将不胜感激

谢谢你的帮助。

我想试试以下方法:

阿斯蒂亚纳克斯 将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的构造函数提供。e、 g

我也在弄明白这一点,所以如果我学到了其他的东西,我会在这里发帖

见:

卡桑德拉 您可以做一些事情来优化读取。注意:我没有尝试过这些,但它们在我要调查的事情列表中(所以我想我会与大家分享)

缓存

启用键缓存和行缓存

密钥缓存

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
一致性

将读取一致性考虑为1 请参阅(这是税务文件,但仍然相关)

考虑降低读取修复机会

update column family MyColumnFam with read_repair_chance=.5

在降低Read Rebug的机会之后,考虑调整复制因子以帮助读取性能(但是这将杀死写,因为我们将写入更多的节点)。 磁盘

我不确定这里是否有什么需要做的,但我认为应该包括在内。
确保最佳的文件系统(例如ext4)。如果您的复制系数很高,我们可以围绕这一点优化磁盘(知道我们将从Cassandra获得持久性)。i、 e.什么RAID级别最适合我们的设置。

谢谢您的建议。我还尝试将连接池类型设置为TOKEN_AWARE,如果与循环连接池类型相比,我的性能会非常差。所以我又回到了循环连接池,并将其描述为NodeDiscovery。我尝试了连接池类型和节点发现的各种组合。关于你的第二个建议。您确定
GetLatencyWarewindowSize()
正在任何地方使用吗?我试着设置断点,但它没有命中代码。所以我不确定它在设置这些额外属性时是否有任何重要性。我假设它是基于偶然的观察。也就是说,如果它不被使用,我也不会感到惊讶,因为我看到Astyanax中类似的配置设置(例如NodeDiscoveryType)在我预期的情况下会被忽略。我包含的代码不适用于最新的Astyanax(正如您在latencyWindowSize中发现的那样)。您已经直接在SMA或EMA LatencyScoreStrategy构造函数中设置了延迟值。e、 g.poolConfig.SetLatencyScoreStrategyImpl(新的SmaLatencyScoreStrategyImpl(1000010000100,0.50));修正了我的示例代码。谢谢你的建议。我只是想知道您在生产中使用的是什么版本的Cassandra,您的集群规范是什么?也许通过这一点,我可以找到一些优化读取性能的方法。还有,您在生产中对Astyanax使用的哪些设置对我也有很大帮助?谢谢
create keyspace cache with replication_factor=XX;