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;