我们最近开始在生产中使用cassandra数据库。我们有一个 single cross colo cluster of 24 nodes
意义 12 nodes in PHX
以及 12 nodes in SLC colo
. 我们有一个 replication factor of 4
这意味着 2 copies will be there in each datacenter
.
下面是 keyspace
以及 column families
是由我们的 Production DBA's
.
使用placement\u strategy='org.apache.cassandra.locator.networktopologystrategy'和strategy\u 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.Murmur3Partitioner
,与 KeyCaching
, SizeTieredCompactionStrategy
以及 Virtual Nodes
也已启用。
Cassandra生产节点机器规范-
16 cores, 32 threads
128GB RAM
4 x 600GB SAS in Raid 10, 1.1TB usable
2 x 10GbaseT NIC, one usable
下面是我得到的结果。
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
9 milliseconds 10 30 1977 3558701 65815867
我不知道还有什么事情我应该尝试与Cassandra得到更好的 read performance
. 在我的情况下,我假设它击中了磁盘。我是否应该尝试将复制因子增加到更高的数值?还有其他建议吗?
我相信从硬盘读取数据的时间大约是6-12毫秒,而不是ssd?在我的例子中,每次我猜它都会击中磁盘,而启用密钥缓存在这里不是很好。我无法启用rowcache,因为使用操作系统页面缓存更有效。在jvm中维护行缓存是非常昂贵的,因此建议将行缓存仅用于较小数量的行,例如<100k行。
有没有什么方法可以验证keycaching在我的情况下是否正常工作?
这就是我在显示列族的模式时得到的结果-
create column PROFILE
with column_type = 'Standard'
and comparator = 'UTF8Type'
and default_validation_class = 'UTF8Type'
and key_validation_class = 'UTF8Type'
and read_repair_chance = 0.1
and dclocal_read_repair_chance = 0.0
and populate_io_cache_on_flush = false
and gc_grace = 86400
and min_compaction_threshold = 4
and max_compaction_threshold = 32
and replicate_on_write = true
and compaction_strategy = 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'
and caching = 'KEYS_ONLY'
and compression_options = {'sstable_compression' : 'org.apache.cassandra.io.compress.SnappyCompressor'};
有什么我应该做的改变,以获得良好的阅读性能?
2条答案
按热度按时间ruarlubt1#
但万一有人从这来。
不要使用射频。您的rf为4需要3个节点的仲裁,这与rf为5没有区别。
您的密钥缓存可能工作正常,这只告诉Cassandra它在磁盘上的位置。这只会减少寻道时间。
在3.0之前,您有相当多的ram,很可能您没有充分利用所有这些。在较新的cassandra节点上尝试g1gc。
行键缓存,请确保分区的顺序与您要访问它们的顺序相同。例:如果你只收集最近的数据,一定要按订单
timestamp ASC
而不是timestamp DESC
因为它将从分区开始缓存。并行化和bucket查询。使用
nodetool cfhistograms
评估分区的大小。然后,如果分区超过100mb,则尝试将其分成更小的块。从这里您可以将查询更改为SELECT x FROM table WHERE id = X and bucket in (1,2,3)
如果你需要扫描。删除“in bucket”并将其移动到3个单独的查询中,可以获得显著的性能。防爆运行:Select... WHERE id = X and bucket = 1
,Select ... WHERE id = X and bucket = 2
在应用层进行聚合。gg0vcinb2#
在我的情况下,我假设它击中了磁盘。我是否应该尝试将复制因子增加到更高的数值?还有其他建议吗?
如果您的数据比内存大得多,并且您的访问几乎是随机的,那么您将访问磁盘。这与~10ms的延迟一致。
增加复制因子可能会有所帮助,但它会降低缓存的效率,因为每个节点将存储更多的数据。只有当您的读取模式主要是随机的、数据非常大、一致性要求较低且访问量很大时,才可能值得这么做。
如果要减少读取延迟,可以使用较低的一致性级别。在一致性级别cl.one读取通常以一致性为代价提供最低的读取延迟。如果写入在cl.all,则只能在cl.one处获得一致的读取。但如果不需要一致性,这是一个很好的权衡。
如果你想增加读吞吐量,你可以减少读修复的机会。此数字指定cassandra在每次读取时执行读取修复的概率。读修复包括从可用的复制副本中读取并更新任何具有旧值的复制副本。
如果以低一致性级别进行读取,则读取修复会导致额外的读取i/o,从而降低吞吐量。它不影响延迟(对于低一致性级别),因为读取修复是异步完成的。同样,如果一致性对应用程序不重要,请将read\u repair\u几率降低到0.01以提高吞吐量。
有没有什么方法可以验证keycaching在我的情况下是否正常工作?
查看“nodetool info”的输出,它将输出一行,如:
密钥缓存:大小96468768(字节),容量96468992(字节),命中959293次,请求31637294次,最近命中率0.051,以秒为单位的14400个保存周期
这将为您提供密钥缓存命中率,这在上面的示例中非常低。