Мое приложение использует AppFabric для нашей модели распределенного кэширования в производственной веб-ферме серверов Windows Web 5. Приложение представляет собой веб-приложение .net4 c #. Мы сталкиваемся с некоторыми проблемами с AppFabric и у нас есть некоторые вопросы относительно установки таких. Основная проблема, с которой мы столкнулись, заключается в том, что при перезапуске одного из серверов web 5 сайт на других серверах также ненадолго отключается, за исключением исключений appfabric, подобных приведенным в журналах событий:
- Сообщение: ErrorCode: SubStatus: временный сбой. Пожалуйста, повторите попытку позже.
- ErrorCode: SubStatus: указанный регион не существует. Используйте API CreateRegion, чтобы исправить ошибку.
У нас есть класс-оболочка провайдера кэша, который создает объект datacachefactory и т. Д. И используется в качестве посредника между веб-приложением и appfabric. Это одноэлементный класс, поэтому в Init класса создается только один экземпляр объекта 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 копии данных?
Когда мы перезагружаем серверы, мы пытаемся никогда не перезапускать ведущие хосты одновременно.
Спасибо за любые отзывы об этом!