Memcache 服务已关闭-如何处理?

Memcache 服务已关闭-如何处理?

我在 ASP.NET 应用程序中使用 Memcache。它连接到 3 个 memcache 服务器。如果所有服务器都宕机,则加载页面会明显延迟。当所有服务器都宕机时,我不想使用 memcache。

当我逐步执行代码时,我注意到当服务器关闭时,memcache 代码不会引发异常(我认为我可以在我的应用程序中“捕获”它并采取必要的步骤)。

我该如何处理这种情况?

编辑:更多详细信息。我的配置文件如下所示:

我们已将 deadTimeOut 的默认设置从 2 分钟更改为 10 秒,以便尽快恢复死机服务器(最佳设置是什么?)。我想到了实现此方法的方法,并希望与大家一起运行。基本上,要求如下:

  1. 如果服务器瘫痪——提醒管理员
  2. 关闭每 10 秒检查一次服务器是否启动的计时器 (isAliveTimer)
  3. 如果任何服务器宕机,请勿使用 memcache。我的理解是,如果 2 个服务器中有 1 个宕机,我们仍然会遇到计时器检查宕机服务器是否正常运行的问题,这会导致响应时间变长。

我目前在我的应用程序中使用以下代码:

private class Singleton
{
  private static MemcachedClient instance;

  protected Singleton()
  {
  }

  public static MemcachedClient Instance()
  {
    if (instance == null)
    {
      instance = new MemcachedClient();
    }

    return instance;
  }
}

要创建实例,我执行以下操作:

MemcachedClient mc = Singleton.Instance();

我可以查看 mc.pool.WorkingServers.Items[0].IsAlive 来检查第一个服务器是否处于活动状态。如果为 false,我可以发送警报(满足要求 1)。但是,如果在获取 MemcachedClient 实例后服务器发生故障怎么办?由于我使用单例对象,我认为我无法处理在创建实例后服务器发生故障的用例。

我不确定该如何处理 2 和 3。

我觉得我们的需求比较简单,因为memcache是​​负载较大的公司使用的,不知道他们如何处理发送管理警报和防止TCP超时的情况。

任何帮助都非常感谢!谢谢

答案1

基本上是要推荐 Chris Kinsman 刚刚发布的内容。我想补充一点,您还可以使用单独的线程来维护到您的 memcache 服务器的活动连接池,这样您就不会因为不断创建和销毁连接而耗尽资源。这在重负载下往往具有优势,而且通常更优雅一些。

答案2

由于您正在处理 tcp 超时,因此 memcache 中没有任何东西可以查看连接问题。最好的办法是让机器能够相互窃取 IP,以防单个设备发生故障。

答案3

由于您不想等待 TCP 超时,您可以在应用程序启动时启动一个单独的线程来检查 memcached 实例的运行状况吗?如果实例没有响应,它会在实例中设置一个全局标志,您的代码可以在尝试调用 memcached 之前检查该标志?

这使得您可以以异步方式进行检查,并根据实例可用性进行调节。

相关内容