集群中的一个服务器不可访问时的Membase缓存模式

时间:2015-03-09 13:32:44

标签: replication couchbase failover membase

我有一个运行单个Membase服务器(1.7.1.1)的应用程序,我用它来缓存数据,否则我将从我们的中央SQL Server数据库中获取数据。我有一个与Membase服务器关联的默认存储桶,并遵循传统的数据获取模式:

  1. 请求特定数据时,查找Membase中的相​​关密钥
  2. 如果返回数据,请使用它。
  3. 如果未返回任何数据,则从数据库中获取数据
  4. 将新返回的数据存储在Membase
  5. 我希望在我的默认群集中添加一个额外的服务器,并重新平衡密钥。 (我还为一个额外的服务器启用了复制)。

    在这种情况下,我很好奇我如何使用当前模式(或修改它)以确保当我的两个服务器之一在自动故障转移中发生故障时,我不会使数据不同步或手动故障转移方案。

    根据我的理解,如果一台服务器发生故障(称之为服务器A),在它关闭但仍然连接到集群期间,将会有一个缓存密钥未命中(如果活动密钥与服务器A相关联,而不是服务器B)。在这种情况下,在上面的数据获取模式中,我将不会返回任何数据并直接从SQL Server获取。但是,当我尝试将数据存储回我的Membase群集时,会将数据存储在服务器B中,并在下次提取时将该密钥重新映射到服务器B吗?

    据我所知,一旦我将服务器A标记为"故障转移",服务器B的副本密钥将成为活动密钥,但我不清楚如何处理服务器A的间歇情况无法访问,但尚未标记为故障转移。

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

这是一个非常古老的版本。但有几点要澄清。

  1. 如果您正在执行缓存,则可能正在使用memcached存储桶,在这种情况下, 没有副本。
  2. 节点始终被视为附加到群集,直到通过管理操作明确删除它们(autofailover尝试通过尝试从群集中删除节点来自动执行此管理操作,如果它已确定为< em> n 时间量。)
  3. 如果服务器已关闭(但未进行故障转移),您将无法获得&#34; Cache Miss&#34;本身,但客户端的一些其他类型的连接错误。许多较旧的memcached客户端没有做出这种区分,只是为任何类型的故障返回NULLFalse或类似值。我建议您为您的应用程序使用适当的Couchbase客户端,这有助于区分这两者。
  4. 就Couchbase而言,任何类型操作的数据路由都保持不变。因此,如果您无法访问服务器A上的项目,因为它不可用,您在尝试再次存储时会遇到同样的问题。换句话说,如果您尝试从服务器A 获取数据并且数据已关闭,则尝试将数据存储到服务器A 将以完全相同的方式失败,除非服务器在最后一次获取和当前存储尝试之间进行了故障转移 - 在这种情况下,客户端将确定这一点并将请求路由到适当的服务器。
  5. In&#34;更新&#34; Couchbase(&gt; 2.x)的版本有一个特殊的get-from-replica命令可用于couchbase(或membase)样式的桶,它允许您显式读取副本节点的信息。但请注意,您仍然无法写入此类节点。

    您的整体策略似乎对缓存非常理解;除了您需要了解如果节点不可用,那么您的数据的某个百分比将不可用(对于读取和写入),直到节点再次重新启动或故障转移为止。没有