System Compleat.

ASP.NET State Service for session sharing

Techs
( younjin.jeong@gmail.com , 정윤진 )


오늘은 세션 공유에 대한 이야기.

윈도우 웹 서버에서 세션을 공유하는 방법은 일전에도 소개 한 바와같이 2가지란다. ( InProcess 의 경우 시스템 하는 사람 기준에는 '공유' 의 방법으로 보이지 않아서 제외 )

하나는 ASP.NET 의 State Service 를 사용하는 방법, 다른 하나는 MSSQL DB를 사용하는 방법.

이 중 두번째 방법은 그냥 그 개념을 생각만 해도 세션 전용의 디비를 두어야 하나 싶을 정도로 고민스러운 방법이라 패스. ( 그 수많은 요청에 의한 세션 정보 열람을 위해 디비에 접근하는 웹서버를 상상해 보시라! )

뭐 아시는 분들은 다 아실만한 이야기 들이지만, 이번에 어찌저찌 하다 보니 보게되어 소개 한다.

웹 서버의 로드밸런싱을 처리하다 보면 세션 공유의 필요성이 발생하게 되는데, 유닉스/리눅스 기반에서는 jsp 라면 웹로직이나 기타 WAS 의 도움을 받는 경우가 대부분이고, php 등은 memcached 를 사용하거나 NFS(?) 를 사용하는 등의 방법이 많다.  여기에 고객의 수가 증가하게 되면서 보다 안정적인 서비스로 가기위해서는 이 세션 공유 서버에 대한 복제 등이 지원이 되어야 하는데, asp state service 는 여기까지는 지원을 하지 않는 듯 하다.

대략적인  IIS 의 Session State 의 동작에 대한 다이어그램은 다음과 같다.



대체 Session State 라는게 뭐냐? 라는 점이 궁금하신 분은,  닷넷 개발자면 아주 잘 아는 내용을 억지로 시스템하는 사람이 번역한 아래의 내용을 참조 하시면 되겠다.  물론, 충분한 이해를 바탕으로 한 것이 아니기 때문에 뭔가 알맹이-껍데기 스러운 번역이기에 괜히 머리 복잡해 지기 싫으신 분은 안펼쳐도 무방하겠다.  lol (나중에 현희형이 감수 및 이해를 도와주면 보다 윤기가 흐르는 번역이 될지도... 퍽!!@!! )




아무튼, 본 서비스를 사용하여 윈도우 서버의 세션 공유는 다음의 순서로 적용할 수 있다. ( Windows 2008 서버 이상 기준 )

1. 서비스 설치
  서비스의 설치는, 다른 윈도우 구성요소와 마찬가지로 윈도우 Feature 추가에서 쉽게 찾을 수 있다.

2. 서비스의 구동.
  서비스를 구동하고 netstat -na 를 통해 바인딩 된 포트 및 주소를 확인 해 보면,
  127.0.0.1:42424 
  로 리스닝 하는 것을 볼 수 있다.

  당연히 많은 서버의 로드 밸런싱에 사용 할 것이므로, 로컬 호스트 리스닝은 의미 없다.  다음의 레지스트리를 수정하여
  바인딩 되는 주소를 변경하도록 한다.
 
  HKML\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnections
  의 값을 0에서 1로 변경하고 서비스를 재시작 후, netstat -na 를 다시 찍어 보면
  0.0.0.0:42424
  를 확인 가능하다.

  물론, 이때 외부에서 해당 포트로 접근을 시도하면 당삼 안된다.  윈도우 방화벽의 Inbound 에 해당 포트 규칙을
  추가하자.  이후 타 서버에서 정상적으로 접근이 가능하다면, 설정 완료.

  + 다음의 설정 값을 통해 포트도 변경이 가능하다.
  HKML\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\Port

ASP.NET State Service Parameters

  

3. 웹 서버들이 state 서버를 사용하도록 설정 ( web.config )

<?xml  version="1.0"?>
<configuration>
    <system.web>
        <!-- ... -->
        <sessionState
             mode="StateServer"
             stateConnectionString="tcpip=SERVER_IP_ADDRESS:PORT"
             cookieless="false"
             timeout="20" />
        <!-- ... -->
    </system.web>
</configuration>


4. 윈도우에서 세션을 공유하기 위해서는 몇가지 주의 해야 할 사항이 있다.
  a. ASP.NET 의 <machineKey> 설정이 로드밸런싱 되는 모든 웹 서버에서 동일해야 한다. 
      <machineKey> 에 대한 자세한 설정은 다음의 링크를 참조 한다.
       http://msdn.microsoft.com/en-us/library/w8h3skw9.aspx
  b. 운용 중 웹 팜에서 세션 상태가 손실 되는 경우.
      - IIS 의 메타베이스 에서 응용프로그램의 경로가 모두 동일해야  함.  ( IIS 메타베이스의 확인 및 수정 방법 클릭 )
      - IIS 의 메타베이스 백업 및 복구 방법


방법이 약간 복잡하거나, IIS 로 서비스 하는 경우 보통 Stand Alone 서버의 소규모 사업장이 많지만, 이러한 .NET 기반의 서비스가 확장 되는 경우에 대비하여 간단한 테스트를 통해 사전에 확장 가능한 방법에 대한 고려가 필요하겠다.

보다 대규모가 되는 경우, DFS 등에 대한 고려 역시 따라야 할 것.



본 포스팅을 위해 참조된 링크.

http://msdn.microsoft.com/en-us/library/aa479041.aspx#aspnetsessionstate_topic2
http://blog.maartenballiauw.be/post/2007/11/ASPNET-load-balancing-and-ASPNET-state-server-(aspnet_state).aspx
http://msdn.microsoft.com/en-us/library/w8h3skw9.aspx
http://support.microsoft.com/kb/325056
http://support.microsoft.com/kb/240225/
http://support.microsoft.com/kb/302573/
http://msdn.microsoft.com/en-us/library/aa227609(VS.60).aspx


( younjin.jeong@gmail.com , 정윤진 )