대규모 시스템 설계를 위한 노트시리즈(5) - 무상태성

yimo22·2023년 1월 26일
1

Stateless

웹 계층을 수평적으로 확장하는 방법으로는 웹계층을 무상태(Stateless)로 만드는 방법이 있다.
여기서 말하는 무상태성이란,

Http 에서 가지는 무상태성과 같다. 어떠한 이전 요청과도 무관한 각각의 요청을 독립적인 트랜잭션으로 취급하여 통신이 독립적인 쌍의 요청과 응답을 이룰 수 있게 하는 방식이다. Stateless - Wiki

즉, 쉽게말해서 내가 인터넷 웹브라우저에서 같은 버튼에 대하여 클릭을 두번했을 때 두번의 동작이 서로 다른동작으로(독립된) 인식되어 작동하는 것을 뜻한다. Stateless 디자인으로 설계를 하면 해당 데이터 응답의 세션에 관한 정보를 저장할 필요가 없어 서버를 수평적으로 확장할 수 있다는 장점이 있다.
(예를들어, 로그인을 하면서 필요한 요청자의 인증/권한 등을 서버에 저장할 필요가 없게 된다.)


무상태 웹계층

무상태성을 적용한 웹 계층으로, 상태 정보(사용자의 세션 데이터)를 웹계층에서 제거하여 수평적 확장성을 넓힌 아키텍쳐이다. 상태 정보를 관계형 DB, NoSQL 같은 지속성 저장소에 보관하고 필요할때 가져오도록 하는 것이 바람직하며 이렇게 구성된 웹 계층을 무상태 웹 계층이라고 부른다.


상태 의존적인 아키텍쳐

상태정보를 보관하는 서버는 Statless한 서버와는 반대되는 개념이다. 클라이언트 정보(상태)를 유지하여 요청들 사이에 공유되도록 한다. (Stateless 서버에는 이런 장치가 없음)

이로인한 문제는 유저가 많아져 서버의 수를 증축하는데 발생하게 된다. 서버는 서로 유저의 정보를 공유하기 때문에 유저 정보를 갖고있는 서버A와 서버B간의 공유로 인해 지연이 발생하게 된다. 이를 막고자 로드밸런서를 통해서 같은 유저는 같은 서버로 Directing 한다면, 로드밸런서에 부담을 주게 된다. (실제로 로드밸런서에는 고정 세션, Sticky session, 이라는 기능을 제공하고 있다! More)
게다가 로드밸런서 뒷단에 서버를 추가하거나 제거하는 과정도 복잡해지게 된다.


무상태 웹 계층을 갖춘 아키텍쳐

이전과 비슷하지만, 달라진 점은 크게 2가지 이다.

  • 로드밸런서를 통한 웹서버는 자동규모확장 기능을 갖춰 수평적 확장이 가능하다는 것
  • 무상태웹계층의 도입을 위해 NoSQL 서버를 따로 두어 클라이언트들의 정보들을 웹서버 Set이 공유

요약

  • 무상태 웹계층의 도입으로 웹서버의 수평적 확장이 더 자유로워짐

    • 무상태 도입을 위해 웹서버들은 공유하는 별도의 서버 (NoSQL, RDBMS, Memcached(Redis)등) 을 이용
  • 상태정보가 웹 서버들로부터 제거되었으므로, 트래픽양에 따라 웹 서버를 넣거나 빼기만 하면 자동으로 규모를 확장할 수 있음

profile
Viva La Vida!

0개의 댓글