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
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://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
'프로그래밍 > Ops' 카테고리의 다른 글
JMETER 사용해보기 (0) | 2020.04.23 |
---|---|
Zuul , could not acquire a semaphore.. (0) | 2020.04.20 |
APM Scouter (0) | 2019.08.31 |
[Git] How to push another repository? (feat: expected committer email.. but..) (0) | 2019.08.14 |
Git, ssh keygen (Permission denied (publickey) (0) | 2019.06.25 |