2012-02-11 5 views
1

내 응용 프로그램은 Windows Web Server의 프로덕션 웹 팜에있는 분산 캐싱 모델에 AppFabric을 사용하고 있습니다. 응용 프로그램은 .net4 C# 웹 응용 프로그램입니다. 우리는 AppFabric에 몇 가지 문제를 겪고 있으며 그와 같은 설정에 관해 몇 가지 질문을합니다.appfabric 문제를 해결하는 데 도움이 필요합니다.

  • : 우리가 가진 가장 큰 문제는 웹 (5 개) 서버 중 하나가 다시 시작되는 경우, 다른 서버에있는 사이트는 또한 우리의 이벤트 로그에 나타나는 다음과 같은 appfabric 예외 짧은 시간 동안 아래로 갈 것입니다 메시지 : ErrorCode : SubStatus : 일시적인 오류가 있습니다. 나중에 다시 시도하십시오.
  • ErrorCode : SubStatus : 참조 된 지역이 존재하지 않습니다. CreateRegion API를 사용하여 오류를 수정하십시오.

우리는 datacachefactory 객체 등을 만드는 캐시 공급자 래퍼 클래스를 가지고 있으며 웹 응용 프로그램과 appfabric 사이의 중개자로 사용됩니다. 이는 싱글 톤 클래스이므로 클래스의 초기화시 datacachefactory 객체의 인스턴스 하나만 생성됩니다.

위의 두 번째 오류는 내가 우리 코드에서 영역이 Init에서 즉 매우 초기에 만들어졌지만 그 노드가 해당 메모리를 포함하는 클러스터에서 나왔다는 것을 발견했다고 믿습니다 , 위의 오류가 결과입니다. 이 문제를 해결하려면 모든 요청 appfabric에서 영역을 만들어야하지만 존재하지 않는 경우에만 영역을 생성해야합니다.이 소리가 맞습니까?

다른 오류에 관해서는, 나는 그것이 구성 될 수 있다고 생각합니다.

 <?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> 

참고 :이 클러스터 구성 XML 파일입니다 우리가 appfabric를 사용하여, 그들 모두와 함께 같은 문제를보고 여러 응용 프로그램을 가지고 우리가 설정 캐시하여 여러 있습니다.

<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> 

누구든지 위에 문제를 참조하십시오 그리고 이것은 각 서버에서 응용 프로그램의 Web.config의 항목은

입니까? 보시다시피 3 명의 리드 호스트와 2 명의 보조 호스트가 있습니다.

나는이에서에 다음과 같은 한 몇 가지 질문은 다음과 같습니다

  • 나는 로컬 캐시 문제에 대해 읽고 -이의 기술적 장점은 무엇입니까? 즉. 이것은 노드 당 데이터의 로컬 사본을 제공 할 것인가?
  • 포트 관련 권장 사항은 무엇입니까? 위의 포트가 정확합니까? 아니면 동일한 포트와 충돌이있을 수 있습니까?
  • 3 명의 리드 호스트와 2 명의 보조 호스트가 권장되는 분할입니까? 데이터의 사본이 3 개 있다는 것을 의미합니까?

서버를 다시 시작할 때 우리는 동시에 리드 호스트를 다시 시작하지 않습니다.

의견을 보내 주셔서 감사합니다.

답변

1

우리는 AppFabric 캐싱을 광범위하게 사용합니다.

Message: ErrorCode:SubStatus:There is a temporary failure. Please retry later. 

을 자주 보게 될 것입니다. 이 오류가 발생하면 재 시도를 자동화하는 AppFabric 주위에 래퍼를 작성하는 것이 가장 좋습니다.지수 적 백 오프를 사용하고 싶지만 재 시도 기간을 무작위로 지정하는 것만으로는 충분하지 않을 수 있습니다.

Web.config 파일의 캐시 구성은 캐시 팩터를 만드는 데만 사용됩니다. 호스트 중 하나에 접속하여 클러스터 구성을 얻습니다. Web.config의 모든 호스트를 나열하는 것만으로도 호스트가 다운되면 다른 호스트에 연결할 수 있습니다. 비록 당신이 단지 하나의 호스트를 나열했다하더라도, 당신의 캐싱은 잘 동작 할 것입니다.

로컬 캐시를 사용하면 쓰기보다 자주 개체를 읽으면 성능이 향상 될 수 있습니다. 실험을 통해 크기를 조정해야합니다.