Cassandra Wide Vs适用于大型柱子

时间:2013-09-26 21:34:34

标签: performance cassandra schema

我需要每天向cassandra插入60GB的数据。

这分解为
100套钥匙
每套150,000个键
每个密钥4KB的数据

就写作表现而言,我最好使用
每组1排,每排150,000个键 每组10行,每行15,000个键 每组100行,每行1,500个键 每组1000行,每行150个密钥

要考虑的另一个变量,我的数据在24小时后到期,所以我使用TTL = 86400来自动过期

有关我的配置的更多具体细节:

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个浮点数。

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

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

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

撰写结果 请记住,由于Cassandra配置的复杂性,还有许多其他变量在起作用 1行每行150,000个密钥:14 MBps
每行10行15,000个键:15 MBps
每行100行1,500个键:18 MBps
每行1000行150个密钥:11 MBps

2 个答案:

答案 0 :(得分:3)

答案取决于您的数据检索模式是什么,以及您的数据在逻辑上如何分组。从广义上讲,这就是我的想法:

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

我建议,分析一下您的数据访问模式,并根据它来最终确定您的数据模型,而不是相反。

答案 1 :(得分:0)

最好每组使用 1行,每行150,000列。使用TTL最好有一个自动清洁过程。