Memcache服务已经停止 - 如何处理?

3
我正在使用Memcache在我的ASP.NET应用程序中。我有3个Memcache服务器与之连接。如果它们全部都宕机了,页面加载会出现显著的延迟。当所有服务器都宕机时,我不想使用Memcache。
当我逐步执行代码时,我注意到当服务器宕机时,Memcache代码不会抛出异常(我认为我可以在我的应用程序中“捕获”它并采取必要的措施)。
我该如何处理这种情况?

你使用的是哪个.NET客户端?Enyim?Memcachedotnet? - Mark
我正在使用Enyim。我正在尝试弄清楚如何检查所有服务器是否已宕机。我应该在什么时候和哪里进行这个操作? - Nick
3个回答

2
你在这里尝试做的事情实际上并不是你的应用程序的工作。
假设你的缓存接口是这样的。
public class CacheManager
{
    protected ICacheProvider _repository;
    public CacheManager(ICacheProvider repository)
    {
        _repository = repository;
    }

    public void Store(string key, object data)
    {
        _repository.Store(key, data);
    }

    public void Destroy(string key)
    {
        _repository.Destroy(key);
    }

    public T Get<T>(string key)
    {
        return _repository.Get<T>(key);
    }
}

如果这种情况发生了,如果所有的memcache服务器都宕机了,你的选择是什么?你只能通过访问你的数据库/文件系统等来继续正常工作。毕竟,缓存本质上是不可靠的。
假设你的memcached运行在*nix服务器上,你应该考虑从网络或操作系统级别监视它的方法。Memcached有一个维基页面。编写规则/脚本来解析和通知你的管理员并将其启动。我认为,你最简单的选择是使用munin

1

由于Enyim是开源的,因此您可以编辑ServerPool.cs,如下所示:

    /// <summary>
    /// Marks a node as dead (unusable)
    ///  - moves hte node to the  "dead list"
    ///  - recreates the locator based on the new list of still functioning servers
    /// </summary>
    /// <param name="node"></param>
    private void MarkAsDead(MemcachedNode node)
    {
        this.serverAccessLock.UpgradeToWriterLock(Timeout.Infinite);

        try
        {
            // server gained AoeREZ while AFK?
            if (!node.IsAlive)
            {
                this.workingServers.Remove(node);
                this.deadServers.Add(node);

                // check if all servers are dead
                if (this.workingServers.Count == 0)
                    throw new NoMoreServersException();

                this.RebuildIndexes();
            }
        }
        finally
        {
            this.serverAccessLock.ReleaseLock();
        }
    }

我还没有测试上面的代码。顺便说一下,我的更改是这三行:

    // check if all servers are dead
    if (this.workingServers.Count == 0)
        throw new NoMoreServersException();

你还应该创建一个 NoMoreServersException 异常(或使用通用异常(虽然不建议这样做))。

0

如何检查服务是否宕机?有几种方法:

  • 检查进程是否正在运行(如果您正在检查同一台机器)。我怀疑这不是快速的。
  • 尝试连接套接字并查看连接是否失败。我也怀疑这不是快速的。

因此,采取一些措施,以避免所有的memcached都宕机。例如使用monit监视它们。


谢谢。从代码中可以看出,一旦创建了Memcacheclient的实例,就会有一个定时器在每个deadTimeOut时检查死亡服务器是否在线。我想做的就是一旦服务器宕机,向管理员发送警报并停止使用memcache。我的应用程序中有一个布尔标志,我可以用它来检查是否要使用memcache。但是,我该如何获取这个值? - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接