Мое приложение использует AppFabric для нашей модели распределенного кэширования в производственной веб-ферме серверов Windows Web 5. Приложение представляет собой веб-приложение .net4 c#. Мы столкнулись с некоторыми проблемами с AppFabric и у нас есть несколько вопросов относительно их настройки. Основная проблема, с которой мы сталкиваемся, заключается в том, что если один из веб-серверов 5 будет перезапущен, сайт на других серверах также перестанет работать в течение короткого периода времени с исключениями appfabric, такими как следующие, которые появляются в наших журналах событий:
- Сообщение: ErrorCode:SubStatus:Произошла временная ошибка. Повторите попытку позже.
- ErrorCode:SubStatus:Упомянутый регион не существует. Используйте CreateRegion API, чтобы исправить ошибку.
У нас есть класс-оболочка поставщика кеша, который создает объект datacachefactory и т. д. и используется в качестве посредника между веб-приложением и appfabric. Это одноэлементный класс, поэтому при инициализации класса создается только один экземпляр объекта datacachefactory.
Вторая ошибка выше я кажется нашел причину, в нашем коде регион создавался на Init т.е. в самом начале, но если из кластера выходит нода которая содержит регион в своей памяти, то вышеприведенное ошибка - это результат. Чтобы решить эту проблему, следует пытаться создавать регион при каждом запросе appfabric — но создавать его только в том случае, если он не существует — правильно ли это звучит?
Что касается другой ошибки, я считаю, что это может быть связано с конфигурацией. Это XML-файл конфигурации кластера:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="dataCache" type="Microsoft.ApplicationServer.Caching.DataCacheSection, Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<dataCache size="Small">
<caches>
<cache consistency="StrongConsistency" name="App1Cache"
secondaries="1">
<policy>
<eviction type="Lru" />
<expiration defaultTTL="10" isExpirable="true" />
</policy>
</cache>
<cache consistency="StrongConsistency" name="App2Cache"
secondaries="1">
<policy>
<eviction type="Lru" />
<expiration defaultTTL="10" isExpirable="true" />
</policy>
</cache>
<cache consistency="StrongConsistency" name="App3Cache"
secondaries="1">
<policy>
<eviction type="Lru" />
<expiration defaultTTL="10" isExpirable="true" />
</policy>
</cache>
<cache consistency="StrongConsistency" name="default">
<policy>
<eviction type="Lru" />
<expiration defaultTTL="10" isExpirable="true" />
</policy>
</cache>
</caches>
<hosts>
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="724664608" size="1228" leadHost="true" account="SERVER1\user"
cacheHostName="AppFabricCachingService" name="SERVER1"
cachePort="22233" />
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="598646137" size="1228" leadHost="true" account="SERVER2\user"
cacheHostName="AppFabricCachingService" name="SERVER2"
cachePort="22233" />
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="358039700" size="1228" leadHost="true" account="SERVER3\user"
cacheHostName="AppFabricCachingService" name="SERVER3"
cachePort="22233" />
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="929915039" size="1228" leadHost="false" account="SERVER4\user"
cacheHostName="AppFabricCachingService" name="SERVER4"
cachePort="22233" />
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="1752630351" size="1228" leadHost="false" account="SERVER5\user"
cacheHostName="AppFabricCachingService" name="SERVER5"
cachePort="22233" />
</hosts>
<advancedProperties>
<securityProperties>
<authorization>
<allow users="everyone" />
</authorization>
</securityProperties>
</advancedProperties>
</dataCache>
</configuration>
Примечание. У нас настроено несколько кешей, так как у нас есть несколько приложений, использующих appfabric, и мы наблюдаем одинаковые проблемы со всеми ними.
А это запись web.config в приложении на каждом из серверов:
<dataCacheClient requestTimeout="15000" channelOpenTimeout="3000" maxConnectionsToServer="1">
<localCache isEnabled="true" sync="TimeoutBased" ttlValue="300" objectCount="10000" />
<clientNotification pollInterval="300" maxQueueLength="10000" />
<hosts>
<host name="SERVER1" cachePort="22233" />
<host name="SERVER2" cachePort="22233" />
<host name="SERVER3" cachePort="22233" />
<host name="SERVER4" cachePort="22233" />
<host name="SERVER5" cachePort="22233" />
</hosts>
<transportProperties connectionBufferSize="131072" maxBufferPoolSize="268435456" maxBufferSize="8388608" maxOutputDelay="2" channelInitializationTimeout="60000" receiveTimeout="600000" /></dataCacheClient>
Кто-нибудь видит проблему с вышеперечисленным? Как видите, у нас есть 3 ведущих хоста и 2 вторичных.
Вот некоторые вопросы, которые у меня возникают в связи с этим:
- Я читал о наличии локального кеша - в чем его техническая выгода? т.е. даст ли это локальную копию данных для каждого узла.
- Какова наилучшая практика в отношении портов? Верны ли вышеуказанные порты или могут возникнуть конфликты с теми же используемыми портами?
- 3 ведущих хоста и 2 вторичных, это рекомендуемое разделение? Означает ли это, что существует 3 копии данных?
Когда мы перезапускаем серверы, мы стараемся никогда не перезапускать ведущие хосты одновременно.
Спасибо за любой отзыв по этому поводу!