Cassandra作为重载下的会话商店

Mac*_*las 6 cassandra

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

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

卡桑德拉设置:

  • 非复制密钥空间
  • 单列族,其中键是会话ID,行中的每列存储单键/值 - (Map<String,Set<String,String>>)
  • 列TTL = 10分钟
  • 写CL = ONE
  • 读CL = ONE
  • 2.000写/秒
  • 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},
}
Run Code Online (Sandbox Code Playgroud)

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

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

我有一些问题:

  1. 如果列在Memtable中过期,然后将其刷新到SSTable,那么Cassandra是否会将此列存储在SSTable中(将其刷新到HDD)?
  2. 我的Key Space禁用了复制,在这种情况下,不需要在SSTable中存储这样的过期列,对吧?
  3. 每个CF帽最多10列.在这种情况下,我将启用行缓存并禁用密钥缓存.但是我希望我的数据在Memtable中仍然可用,在这种情况下我可以禁用整个缓存,对吧?
  4. 对于这样的会话存储用例的任何Cassandra配置提示都会非常感激:)

谢谢,Maciej

Mac*_*las 3

这就是我所做的 - 而且效果很好:

  1. 将replication_factor 设置为1 - 表示禁用复制
  2. 设置gc_grace to 0- 意味着在第一次压缩时删除列。这很好,因为数据没有被复制。
  3. 增加内存表大小并减少缓存大小。我们想要从 memtable 读取数据并忽略缓存 - 将数据刷新到 HDD 并再次从 HDD 读取到缓存中。
  4. 另外,可以禁用提交日志 - Durable_writes=false

在此设置中,将从内存表中读取数据,并且不会使用缓存。Memtable 可以分配足够的堆来保存我的数据,直到它过期甚至更长时间。

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

  • 我看不出这样做有什么意义。如果您不进行复制,您将获得 memcached 已有的内容。如果您的数据所在的节点出现故障,您的数据就会丢失。当然它在提交日志中,但是在 10 分钟内重建一个节点?我错过了什么吗? (4认同)