Cassandra作为重载下的会话商店

时间:2011-10-10 08:43:01

标签: cassandra

我想使用Cassandra来存储与会话相关的信息。我没有真正的HTTP会话 - 它是不同的协议,但是相同的概念。

Memcached会很好,但我想另外保留数据。

Cassandra设置:

  • 非复制密钥空间
  • 单列系列,其中键是会话ID,行中的每列都存储单键/值 - (Map<String,Set<String,String>>
  • 列TTL = 10分钟
  • 写CL = ONE
  • 阅读CL = ONE
  • 2.000写/ s
  • 5.000读/秒

数据示例:

session1:{ // CF row key
   {prop1:val1, TTL:10 min},
   {prop2:val2, TTL:10 min},
.....
   {propXXX:val3, TTL:10 min}
},
session2:{ // CF row key
   {prop1:val1, TTL:10 min},
   {prop2:val2, TTL:10 min},
},
......
sessionXXXX:{ // CF row key
   {prop1:val1, TTL:10 min},
   {prop2:val2, TTL:10 min},
}

在这种情况下,一致性不是问题,但性能可能是,尤其是磁盘IO。

由于我的会话中的数据时间很短,我想避免将其存储在硬盘上 - 除了提交日志。

我有一些问题:

  1. 如果列在Memtable中过期,然后将其刷新为SSTable,则会 无论如何,Cassandra在SSTable中存储这样的列(将其刷新到HDD)?
  2. 我的密钥空间禁用了复制,在这种情况下,不需要在SSTable中存储这样的过期列,对吗?
  3. 每个CF帽最多10列。在这种情况下,我将启用行缓存并禁用密钥缓存。但我期待我的数据仍然存在 在Memtable中可用,在这种情况下我可以禁用整个缓存,对吗?
  4. 非常感谢任何关于此类会话存储用例的Cassandra配置提示:)
  5. 谢谢你, 马切伊

2 个答案:

答案 0 :(得分:4)

这就是我所做的 - 它运作良好:

  1. 将replication_factor设置为1 - 表示禁用复制
  2. 设置gc_grace to 0 - 表示在第一次压缩时删除列。这很好,因为没有复制数据。
  3. 增加可记忆大小并减少缓存大小。我们想要从memtable中读取数据并省略缓存 - 将数据刷新到HDD并再次从HDD读取到缓存中。
  4. 此外,可以禁用提交日志 - durable_writes = false
  5. 在此设置中,将从memtable中读取数据,并且不会使用缓存。 Memtable可以分配足够的堆来保存我的数据,直到它过期甚至更长。

    将数据刷新到SSTable后,压缩将立即删除过期的行,因为gc_grace=0

答案 1 :(得分:1)

考虑到你的用例如果我没有错,你希望你的所有键值[sessionID =&gt; sessionData]在内存中配对,这些值将每10分钟到期[意味着你不想要持久性]。

那么为什么你不能尝试像redis这样的内存商店。

来自Doc:

Redis是一个开源的高级键值存储。它通常被称为数据     结构服务器,因为键可以包含字符串,散列,列表,集和排序集。

由于你不需要复制redis主从架构甚至可能不会影响你

Redis也支持TTL

AFAIK cassandra适用于宽胖行[更多列少行]而不是瘦行[以前的转置]。你的用例似乎并非如此。

此致 泰米尔语