0

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

  1. 当请求特定数据时,在 Membase 中查找相关键
  2. 如果返回数据,请使用它。
  3. 如果没有返回数据,则从数据库中获取数据
  4. 将新返回的数据存储在 Membase 中

我希望在我的默认集群中添加一个额外的服务器,并重新平衡密钥。(我还为另一台服务器启用了复制)。

在这种情况下,我很好奇如何使用当前模式(或修改它)来确保当我的两台服务器之一在自动故障转移或手动故障转移中出现故障时我不会让数据不同步设想。

据我了解,如果一台服务器宕机(称为Server A),在它宕机但仍连接到集群期间,会出现缓存键未命中(如果活动密钥关联到Server A,而不是Server乙)。在这种情况下,在上面的数据获取模式中,我不会返回任何数据并直接从 SQL Server 获取。但是,当我尝试将数据存储回我的 Membase 集群时,它是否会将数据存储在服务器 B 中并在下一次获取时将该密钥重新映射到服务器 B?

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

任何帮助是极大的赞赏!

4

1 回答 1

1

那是一个相当旧的版本。但有几点需要澄清。

  1. 如果您正在执行缓存,您可能正在使用 memcached 存储桶,在这种情况下没有副本。
  2. 节点始终被视为已连接到集群,直到它们被管理操作显式删除(如果确定节点已关闭n时间,自动故障转移会尝试从集群中删除节点,从而为您自动执行此管理操作)。
  3. 如果服务器关闭(但没有故障转移),您本身不会收到“Cache Miss”,而是来自客户端的其他类型的连接错误。许多较旧的 memcached 客户端没有进行这种区分,而只是为任何类型的故障返回一个 、 或类似的值NULLFalse我建议您为您的应用程序使用适当的 Couchbase 客户端,这应该有助于区分两者。
  4. 就 Couchbase 而言,任何类型的操作的数据路由都保持不变。因此,如果您无法访问服务器 A 上的项目,因为它不可用,您将在尝试再次将其存储回来时遇到同样的问题。换句话说,如果您尝试从服务器 A获取数据并且它已关闭,那么尝试将数据存储到服务器 A将以完全相同的方式失败,除非服务器在上次获取和当前存储尝试之间发生故障转移——在这种情况下,客户端将确定这一点并将请求路由到适当的服务器。

在 Couchbase (> 2.x) 的“较新”版本中,有一个特殊的 get-from-replica 命令可用于 couchbase(或 membase)样式的存储桶,它允许您从副本节点显式读取信息。请注意,您仍然无法写入这样的节点。

对于缓存,您的整体策略似乎非常明智;除了您需要了解,如果某个节点不可用,那么在该节点再次恢复或故障转移之前,您的一定比例的数据将不可用(对于读取和写入)。没有

于 2015-03-10T14:37:22.810 回答