Performance Cassandra宽行与细行用于大型列

Performance Cassandra宽行与细行用于大型列,performance,cassandra,schema,Performance,Cassandra,Schema,我每天需要在cassandra中插入60GB的数据 这可分解为 100套钥匙 每套150000把钥匙 每个密钥有4KB的数据 就写性能而言,使用 每套1行,每行150000键 每套10行,每行15000键 每套100行,每行1500键 每套1000行,每行150个键 另一个要考虑的变量,我的数据在24小时后过期,所以我使用TTL=86400来自动过期< /P> 有关我的配置的更多详细信息: CREATE TABLE stuff ( stuff_id text, stuff_column

我每天需要在cassandra中插入60GB的数据

这可分解为
100套钥匙
每套150000把钥匙
每个密钥有4KB的数据

就写性能而言,使用
每套1行,每行150000键
每套10行,每行15000键
每套100行,每行1500键
每套1000行,每行150个键

另一个要考虑的变量,我的数据在24小时后过期,所以我使用TTL=86400来自动过期< /P> 有关我的配置的更多详细信息:

CREATE TABLE stuff (
  stuff_id text,
  stuff_column text,
  value blob,
  PRIMARY KEY (stuff_id, stuff_column)
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.100000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=39600 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'tombstone_compaction_interval': '43200', 'class': 'LeveledCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};
访问模式详细信息:
4KB值是一组1000个4字节浮点值,打包成字符串

一个典型的请求需要随机选择20-60个浮点数

最初,这些浮点数都存储在同一逻辑行和逻辑列中。这里的逻辑行表示给定时间的一组数据,如果这些数据全部写入一行150000列

随着时间的推移,一些数据被更新,在一组列中的逻辑行中,压缩字符串中的一组随机级别将被更新。新级别不会就地更新,而是与其他新数据一起写入新的逻辑行,以避免重写所有仍然有效的数据。这导致了碎片化,因为现在需要访问多行来检索这组20-60的值。现在,请求通常会从同一列中跨1-5行读取

试验方法 我为每个配置编写了5个随机数据样本,并对结果进行平均。速率计算为(写入字节/(时间*10^6))。时间以秒为单位,精度为毫秒。Pycassa被用作Cassandra接口。使用了Pycassa批插入运算符。每次插入将多列插入到一行中,插入大小限制为12 MB。队列以12MB或更低的速度刷新。大小不考虑行和列的开销,只考虑数据。数据源和数据接收器位于不同系统上的同一网络上

写入结果 请记住,由于卡桑德拉配置的复杂性,还有许多其他变量在起作用。
1行每行150000个键:14 MBps
10行每行15000个键:15 MBps
100行每行1500个键:18 MBps

1000行每行150个键:11Mbps

您最好使用每组1行,每行150000列。使用TTL进行自动清洗是个好主意

答案取决于数据检索模式是什么,以及数据的逻辑分组方式。大体上,我是这样想的:

  • 宽行(每组1行):这可能是最好的解决方案,因为它可以防止请求同时命中多个节点,并且使用辅助索引或复合列名,您可以根据需要快速筛选数据。如果每个请求需要访问一组数据,这是最好的。但是,在宽行上执行过多的multiget可能会增加节点上的内存压力,并降低性能
  • 瘦行(每组1000行):另一方面,宽行会在集群中产生读取热点。如果您需要对完全存在于一个宽行中的数据子集发出大量请求,则尤其如此。在这种情况下,一个小的行将在集群中更均匀地分布您的请求,并避免热点。此外,根据我的经验,“更瘦”的行在使用MultiGet时表现更好

我建议,分析您的数据访问模式,并在此基础上最终确定您的数据模型,而不是相反。

+1对于一个经过充分解释并投入大量精力的问题,我认为是另一种方式:如果主键只包含分区键,那么表中的行很小。如果主键包含除分区键以外的列,则表具有宽行