Cassandra 文档

版本

您正在查看预发布版本的文档。

配置 SAI 索引

为存储附加索引 (SAI) 配置 Apache Cassandra 环境需要对 cassandra.yaml 文件进行一些重要的自定义。

将文件缓存增加到默认值以上

默认情况下,文件缓存的 file_cache_size 值计算为 MaxDirectMemorySize 设置的 50%。file_cache_size 的此默认值可能会导致性能不佳,因为 Cassandra 无法充分利用可用内存。

文件缓存也称为块缓存。

可以在 cassandra.yaml 中显式定义 file_cache_size 值。建议

  1. 增加 --XX:MaxDirectMemorySize,为操作系统和其他内存中结构保留大约 15-20% 的内存。

  2. cassandra.yaml 中,将 file_cache_size 显式设置为该值的 75%。

在测试中,此配置在读取、写入和混合读取/写入场景中提高了索引性能。

压缩策略

使用生成较少 SSTable 的压缩策略可以提高读取查询的性能。

对于大多数包含 SAI 索引的环境,建议使用默认的 SizeTieredCompactionStrategy (STCS)。此策略在磁盘上存在多个大小相似的 SSTable 时触发次要压缩,如表子属性 min_threshold 所配置。次要压缩不涉及键空间中的所有表。有关详细信息,请参阅 配置压缩

对于时间序列数据,另一种选择是 TimeWindowCompactionStrategy (TWCS)。TWCS 使用一系列时间窗口压缩 SSTable。在时间窗口内,TWCS 使用 STCS 将从内存中刷新到磁盘的所有 SSTable 压缩成更大的 SSTable。在时间窗口结束时,所有这些 SSTable 都将压缩成单个 SSTable。然后下一个时间窗口开始,该过程重复。时间窗口的持续时间是唯一需要的设置。请参阅 TimeWindowCompactionStrategy。有关 TWCS 的更多信息,请参阅 时间窗口压缩策略

一般情况下,除非您的索引查询直接或通过对分区键进行限制来限制令牌范围,否则不要使用 LeveledCompactionStrategy (LCS)。但是,如果您决定使用 LCS,请使用以下指南

  • CREATE TABLE 命令的 sstable_size_in_mb 选项的默认值为 160 MB,如本 主题 中所述,这可能会导致对未限制令牌范围或分区键的索引查询的性能不佳。

  • 虽然根据您的硬件,甚至更高的值可能更合适,但 DataStax 建议至少将 sstable_size_in_mb 的默认值翻倍。

示例

CREATE TABLE IF NOT EXISTS my_keyspace.my_table
.
.
.
   WITH compaction = {
     'class' : 'LeveledCompactionStrategy',
     'sstable_size_in_mb' : '320' };

在增加 MB 值后,观察具有 SAI 索引的表的查询性能是否有所提高。要观察任何性能差异,请按查询查看 Cassandra 查询指标中的 QueryLatencySSTableIndexesHit 数据。

使用更大的值会保留更多磁盘空间,因为 SSTable 更大,并且那些注定要被替换的 SSTable 在被压缩时会占用更多空间。但是,更大的值会导致更少的 SSTable,从而降低查询延迟。由于具有更大的索引,每个 SAI 索引最终会在磁盘上占用更少的空间,因为长期压缩效果更好。

如果在工作负载不被读取主导但正在经历写入放大增加的情况下,大型 (sstable_max_size ~2GB) SAI 索引的 SSTable 上的查询性能下降,请考虑使用统一压缩策略 (UCS)。

关于 SAI 加密

对于 SAI 索引,其磁盘上的组件只是额外的 SSTable 数据。为了保护敏感的用户数据,包括表的分区键值中存在的任何数据,SAI 将需要加密包含用户数据的索引的所有部分,即字符串的 trie 索引数据和数字的 kd 树数据。根据设计,SAI 不会加密非用户数据,例如发帖元数据或 SSTable 级别的偏移量和令牌。