ecsimsw

부하 분산에 세션을 유지하는 방법 본문

부하 분산에 세션을 유지하는 방법

JinHwan Kim 2021. 6. 7. 00:10

Load Balancing과 세션 유지

로드 밸런싱을 간단히 말하면, 트래픽을 한 서버에서 모두 처리하는 것이 아니라, 다수의 서버에 적절하게 분배해주는 것이다. 보통 여러 대의 WAS 전면에 Web Server를 두고, 요청을 WAS에 적절히 나누는 식으로 사용된다. 이렇게 로드 밸런싱을 이용하면 서버의 부담도 줄일 수 있으면서, 한 서버가 다운되더라도 서비스를 이어갈 수 있다는 장점이 있다.

 

문제는 세션이다.

세션은 서버에 데이터를 저장한다고 배웠는데, 여러 was에 요청을 분산하면 세션 지속에 문제가 없을까 궁금했다. 

해결책

먼저 세션 지속을 보장하는 Web Server를 사용할 수 있을 것 같다. 예를 들면 NginX plus는 Session Persistence를 지원하고 있음을 확인했다.

 

(Session Persistence, Sticky 키워드를 찾아보면 될 것이다.)

 

NGINX Docs | HTTP Load Balancing

Load balance HTTP traffic across web or application server groups, with several algorithms and advanced features like slow-start and session persistence.

docs.nginx.com

 

또는 Balancing 방식으로 Ip hash를 사용해서, 같은 ip의 경우에 같은 was를 이용하도록 할 수도 있을 것이다. 다만 이 방식으로 로드 밸런싱의 기준을 잡을 경우 우연히라도 트래픽이 한 서버에 몰리거나, 서버가 터질 경우 문제가 될 것 같다.

 

아래는 NginX에서 Ip_hash method 설정 방법을 가져왔다. (참고. http://nginx.org/en/docs/http/load_balancing.html)

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

 

Sticky Session과 Session Clustering

NginX docs에서 'Sticky'라는 표현을 많이 보았다. 뭔가 세션 유지에 대한 해결 키워드가 될 것 같아 찾아보았고, "Sticky Session, Session Clustering"를 공부할 수 있었다.

Sticky Session

Sticky Session은 이름 그대로 서버를 고정하는 방식이다. 첫 요청 이후의 모든 요청을 첫 요청을 처리한 서버로 두는 것으로 세션 문제를 해결한다. 대표적인 방법으로 cookie에 이용 서버를 저장하는 방법이 있다.

 

Ip Hash 방식으로 서버를 고정하면 생길 수 있는 트래픽 쏠림 현상을, Cookie를 사용하면 해결할 수 있다는 장점이 있다.

 

다만, 결국 사용자가 접속해야하는 서버가 정해져있기 때문에 트래픽 몰림 문제에서 완전히 자유로울 수는 없고, 서버에 장애가 발생하는 경우 해당 서버를 이용하고 있던 사용자의 세션 정보를 잃게 된다는 위험이 있다.

Session Clustering 

Clustering은 여러 컴퓨터를 연결하여 하나의 시스템처럼 동작하도록 하는 기술을 말한다. Session Clustering 역시 각 WAS의 세션을 묶어 관리하는 것이다. 이렇게하면 사용자가 같은 묶음으로만 접속한다면 동일한 세션 데이터를 받을 수 있도록 보장할 수 있다. 한 서버에 고정되지 않아도 되므로 트래픽 쏠림 문제를 해결할 수 있고, 개별 서버가 터지더라도 세션 정보를 유지할 수 있게 된다.

 

반대로 세션 데이터가 저장될 때마다 모든 서버에 해당 데이터가 입력되어야 하므로, 즉 동기화의 과정이 필요하므로 성능 저하가 올 수 있고, 개별 서버 안에서도 각 서버의 세션 정보가 아닌 동일 그룹의 모든 세션 정보를 저장해야 하므로 많은 메모리를 요하게 된다. 이런 세션 클러스터링 방식을 보완하고자, 모든 was가 아닌 하나의 서버에만 세션을 동기화하고, 그 외 서버에는 세션 키만 들고 있도록  하여 값을 백업하는 primary-sendary session 복제 방식과 여러 서버에서 하나의 별도의 세션 저장소(session storage)를 사용하는 세션 스토리지 방식이 있다.

Comments