본문 바로가기

프로그래밍/Ops

분산서버 처리를 위한 기술들

Load Balancing

부하 분산을 위해서 가상 IP를 통해서 각 노드에 분배하는 기능이다.

오픈 소스 로드 밸런스 중에서는 HA Proxy가 많이 사용된다고 한다. 



로드 밸런서 사용 시 이슈 중 하나가 세션 데이터이다. 

로드 벨런서에 의해 이전 요청과 현 요청에 분배되는 노드가 다르면 세션 관리 일관성에 문제가 있다. 

이 문제를 해결하기 위해 sticky session을 이용하기도 한다. 

다만 해당 노드에 장애가 발생하게 되면 다른 노드에는 해당 세션이 없으므로 이 또한 문제다. 

따라서 세션 클러스터링이 필요하다.



로드 밸런서에 문제가 발생하면 어떻게 할 것인가?

  • 로드 밸런서를 이중화를 기본으로 한다. 
  • 서로 Health check를 한다.
  • Master - Standby로 구성한다. (Fail-over)



특정 노드에 장애가 발생한다면 어떨까?

로드 밸런서는 한 노드가 다운되더라도 이중화 시킨 다른 노드에서 서비스를 지속하게 해 줄수 있다. 




로드 밸런싱은 여러 계층에서 적용할 수 있다. 

  • L2 - Mac 주소 
  • L3 - P 주소 
  • L4 - Transport Layer(IP, Port). TCU, UDP
  • L7 - Application Layer(User Request), HTTP, HTTPS, FTP





Scale out

사실 대부분의 클라우드 서비스 제공 업체들은 Auto Scaling을 지원한다. 
서버의 CPU, RAM 등의 부하를 체크하여 서버를 자동으로 늘렸다가 줄여주는 기능이다.
최근에는 Docker와 함께 Auto Scaling 서버 구성을 많이들 한다고 한다. 




Stateless

위에서 로드밸런스의 단점으로 세션 관리를 언급했었다. 

skicky session으로 해결 가능하지만 이 또한 문제가 있다. 


분산 서버 처리를 위해서는 모든 요청이 stateless 한 것이 유리하다. 

세션 관리는 Redis나 MongoDB를 이용하여 해결할 수 있다. 


만약 어플리케이션의 특성을 고려하여 Apache 대신 NgingX 고려하는 방법도 필요하다. 




Sharding 

데이터베이스에 병목되는 경우도 많기 때문에 데이터베이스를 샤딩하는 것 또한 분산 서버 처리를 위해서 고려해야 하는 점이다. 



CDN 

CSS, Javascript, Image 등 잘 변하지 않는 리소스들은 CDN에서 관리하는 것이 트래픽 절감에 매우 유리하다. 



Micro Service

서비스별로 가지는 특성들은 서로 다르다. 

그렇기 때문에 어떤 서비스는 비동기식으로 빠르게 처리해야 할 필요가 있어 Nodejs로 구성될 수 있고

다른 어떤 서비스는 여러가지 트랜잭션 처리가 필요할 수 있어 Springboot로 구성될 수도 있다. 

즉, 독립적인 기능을 가지면 별도의 서비스로 분리하여 구축할 필요가 있는 것이다.


Service Discovery, Eureka 등 Spring cloud의 솔루션들을 검토하는 것도 좋을 것 같다.














References:

https://d2.naver.com/helloworld/6070967?fbclid=IwAR2PKyrFCEgwx_3Lz6UqTXS80h1H92unE6IC4erP82Z57RTk3PnmwDgqzRs

https://goodgid.github.io/Load-Balancing-And-Clustering/

https://www.devkwon.com/posts/category/%EB%B6%84%EC%82%B0%EC%84%9C%EB%B2%84%EC%B2%98%EB%A6%AC