除了在集群配置中设置Secondaries=1之外,还有什么可以启用HighAvailability,特别是在缓存客户端配置上?
我们的配置:
使用about配置,我们可以看到在这三个主机上创建的主区域和次要区域,但是当其中一个主机停止时,会出现以下异常:
ErrorCode<ERRCA0018>:SubStatus<ES0001>:The request timed out.An existing connection was forcibly closed by the remote hostNo connection could be made because the target machine actively refused it 192.22.0.34:22233An existing connection was forcibly closed by the remote host高可用性的意义不在于能够在不中断服务的情况下处理主机故障吗?我们使用的是一个命名区域--这会破坏高可用性吗?我在某个地方读到,命名区域只能存在于一台主机上(我确实验证了另一台主机上确实存在次要区域)。我觉得我们缺少了一些东西,因为缓存客户端配置可以实现高可用性,任何关于这件事的洞察力都将受到极大的赞赏。
发布于 2012-09-20 17:06:10
在与微软开了一张票后,我们把它缩小到了一个静态DataCacheFactory对象。
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对象。
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;
}当我们了解更多信息时,将更新这个线程。
发布于 2012-09-13 01:12:17
高可用性指的是保护数据,而不是使其每秒钟都可用(因此出现重试异常)。当缓存主机崩溃时,您将得到一个异常,并应该重试。在此期间,对HA缓存的访问可能会向您抛出一个重试异常,而此时它正忙着调整和创建一个额外的副本。区域使这更复杂,因为它会导致更大的块在再次成为HA之前被复制。
此外,客户端保持到所有缓存主机的连接,因此当一个缓存主机下降时,它会抛出发生了什么事情的异常。
基本上,当一个主机崩溃时,Appfabric会抓狂,直到所有数据的两个副本再次出现在HA缓存中。我们在它前面创建了一个小层来处理这个逻辑,然后每次丢弃一个服务器,以确保它处理所有场景,从而使我们的应用程序继续工作,但速度稍微慢一点。
https://stackoverflow.com/questions/12377194
复制相似问题