首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建高可用性AppFabric缓存集群

创建高可用性AppFabric缓存集群
EN

Stack Overflow用户
提问于 2012-09-11 20:12:05
回答 2查看 4.1K关注 0票数 5

除了在集群配置中设置Secondaries=1之外,还有什么可以启用HighAvailability,特别是在缓存客户端配置上?

我们的配置:

使用about配置,我们可以看到在这三个主机上创建的主区域和次要区域,但是当其中一个主机停止时,会出现以下异常:

  • ErrorCode<ERRCA0018>:SubStatus<ES0001>:The request timed out.
  • An existing connection was forcibly closed by the remote host
  • No connection could be made because the target machine actively refused it 192.22.0.34:22233
  • An existing connection was forcibly closed by the remote host

高可用性的意义不在于能够在不中断服务的情况下处理主机故障吗?我们使用的是一个命名区域--这会破坏高可用性吗?我在某个地方读到,命名区域只能存在于一台主机上(我确实验证了另一台主机上确实存在次要区域)。我觉得我们缺少了一些东西,因为缓存客户端配置可以实现高可用性,任何关于这件事的洞察力都将受到极大的赞赏。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-20 17:06:10

在与微软开了一张票后,我们把它缩小到了一个静态DataCacheFactory对象。

代码语言:javascript
复制
public class AppFabricCacheProvider : ICacheProvider
{
    private static readonly object Locker = new object();
    private static AppFabricCacheProvider _instance;
    private static DataCache _cache;

    private AppFabricCacheProvider()
    {
    }

    public static AppFabricCacheProvider GetInstance()
    {
        lock (Locker)
        {
            if (_instance == null)
            {
                _instance = new AppFabricCacheProvider();
                var factory = new DataCacheFactory();
                _cache = factory.GetCache("AdMatter");
            }
        }
        return _instance;
    }
    ...
}

通过查看来自tracelog的AppFabric,客户端仍然试图连接到所有主机,而不处理掉的主机。在客户端上重置IIS将强制创建一个新的DataCacheFactory (在我们的App_Start中)并停止异常。

MS工程师一致认为,这种方法是最佳实践方法(我们还找到了有关这方面的几篇文章:参见链接链接)

他们正在继续为我们研究解决办法。同时,我们提出了以下临时解决办法,在遇到上述异常时强制创建一个新的DataCacheFactory对象。

代码语言:javascript
复制
public class AppFabricCacheProvider : ICacheProvider
{
    private const int RefreshWindowMinutes = -5;

    private static readonly object Locker = new object();
    private static AppFabricCacheProvider _instance;
    private static DataCache _cache;
    private static DateTime _lastRefreshDate;

    private AppFabricCacheProvider()
    {
    }

    public static AppFabricCacheProvider GetInstance()
    {
        lock (Locker)
        {
            if (_instance == null)
            {
                _instance = new AppFabricCacheProvider();
                var factory = new DataCacheFactory();
                _cache = factory.GetCache("AdMatter");
                _lastRefreshDate = DateTime.UtcNow;
            }
        }
        return _instance;
    }

    private static void ForceRefresh()
    {
        lock (Locker)
        {
            if (_instance != null && DateTime.UtcNow.AddMinutes(RefreshWindowMinutes) > _lastRefreshDate)
            {
                var factory = new DataCacheFactory();
                _cache = factory.GetCache("AdMatter");
                _lastRefreshDate = DateTime.UtcNow;
            }
        }
    }

    ...

    public T Put<T>(string key, T value)
    {
        try
        {
            _cache.Put(key, value);
        }
        catch (SocketException)
        {
            ForceRefresh();
            _cache.Put(key, value);
        }
        return value;
    }

当我们了解更多信息时,将更新这个线程。

票数 1
EN

Stack Overflow用户

发布于 2012-09-13 01:12:17

高可用性指的是保护数据,而不是使其每秒钟都可用(因此出现重试异常)。当缓存主机崩溃时,您将得到一个异常,并应该重试。在此期间,对HA缓存的访问可能会向您抛出一个重试异常,而此时它正忙着调整和创建一个额外的副本。区域使这更复杂,因为它会导致更大的块在再次成为HA之前被复制。

此外,客户端保持到所有缓存主机的连接,因此当一个缓存主机下降时,它会抛出发生了什么事情的异常。

基本上,当一个主机崩溃时,Appfabric会抓狂,直到所有数据的两个副本再次出现在HA缓存中。我们在它前面创建了一个小层来处理这个逻辑,然后每次丢弃一个服务器,以确保它处理所有场景,从而使我们的应用程序继续工作,但速度稍微慢一点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12377194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档