【发布时间】:2013-10-25 20:13:56
【问题描述】:
我们在会话中在许多单独的线程/节点之间共享数据时遇到了问题。
场景如下所示: 有一些全局值池类型字符串,例如 123ABC-1299AA。 用户在向应用程序发送命令时需要采用该值之一。不能有两个会话以相同的值连接。
在环境中,我们有 4 个服务器,有 50 个线程等待请求。
目前情况: 我们存储在 Oracle 数据库中的映射值——会话。具有唯一值约束。当我们收到请求时,我们查询表中的所有值,并遍历池,省略使用的值,以找到一个空闲的值。如果另一个线程在我们迭代时输入了新值,我们会得到唯一约束,并尝试另一个。另外DataBase是为一些持久化数据设计的,这个映射之王不是持久化数据。
问题: Oracle 不处理具有大量读/写操作的小表。行锁争用、重做日志问题等。此外,当我们在数据库中进行一些维护时,我们会观察到超时,因为数据库的性能正在下降。
要求:
- 一个会话值,没有重复。
- 响应时间短,不到 100 毫秒。
- 所有应用程序节点上的数据一致性。
- 在某种故障期间不会丢失映射。
- 解决方案应处理高达 100 TPS 的流量。
你建议在这种情况下使用什么?
目前我们正在评估 CouchBase 的会话管理,但它有很多错误,并且故障转移很差(可能需要长达 10 分钟)。
【问题讨论】:
-
我不能凭经验说话,但我在 Riak 上看到了一些演示,它超级稳定,性能非常好:docs.basho.com/riak/1.4.0/cookbooks/use-cases/session-storage
-
Couchbase 经常用于这种用例。你能给我更多关于你看到的错误和故障转移的信息吗? (故障转移是即时的,根据您的配置可能需要一些时间,是系统发现节点关闭的事实)
-
我们对CouchBase的问题是,当一个节点宕机时,不能保证切换后数据是一致的。目前我们有 2 个集群,每个集群有两个节点。在集群中切换很快,但在集群之间切换可能需要几分钟。而且还会丢失数据。关于我们写给 Couchbase 的错误,他们修复了它们。或者如果它很重要,我们会自行修复它并将补丁发送给 CB。主要是我们可以看到java-client的bug。
标签: java session backend couchbase enterprise