로드 밸런싱

서버에 가해지는 부하(=로드)를 분산(=밸런싱)해주는 장치 또는 기술을 통칭하며 가상 IP를 통해 여러 서버에 접속하도록 분배하는 기능을 의미한다.

발생하는 트래픽이 많을 때 여러 대의 서버가 분산처리하여 서버의 로드율 증가, 부하량, 속도 저하 등을 고려하여 적절히 분산처리하여 해결해주는 서비스이다.

로드 밸런서 (Load Balancer)

로드 밸런싱을 해주는 소프트웨어 혹은 하드웨어 장비를 로드 밸런서(Load Balancer)라고 하며 클라이언트와 서버풀(Server Pool, 분산 네트워크를 구성하는 서버들의 그룹) 사이에 위치하며 주 목적은 동시에 오는 수 많은 커넥션을 한대의 서버로 부하가 집중되지 않도록 트래픽을 관리하고 해당 커넥션이 요청 노드 중의 하나로 전달될 수 있게 하여 각각의 서버가 최적의 퍼포먼스를 보일 수 있도록 한다.

부하 분산에는 L4 Load Balancer와 L7 Load Balancer가 많이 사용됩니다. L4부터 Port를 다룰 수 있기 때문입니다.

한 대의 서버의 각각의 포트에 여러개의 서비스들을 운영하기 위해서 L4 Layer 위에서 작동하는 로드 밸런서가 필요해진 것입니다.

이전에는 비싼 L4 하드웨어 장비를 주로 사용했지만
현재는 MSA의 등장 등으로 L7 로드 밸런싱도 많이 사용하고, AWS ELB, NginX, HaProxy등 다양한 소프트웨어를 사용하고 있습니다.

로드 밸런서를 사용할 때 어려운 문제 중 하나는 세션 데이터를 관리하는 것이다.

서버에 액세스 할 때마다 다른 세션을 사용한다면 특정 사용자의 정보를 일관성 있게 유지할 수 없게 된다.
이러한 문제를 해결하기 위해 세션을 고정(Session Sticky) 한다. 이 방법으로 특정 사용자의 요청이 전달될 노드를 고정시킬 수 있다.

로드 밸런싱 알고리즘

  • 라운드로빈 방식 (Round Robin Method)
    서버에 들어온 요청을 순서대로 돌아가며 배정하는 방식.
    클라이언트의 요청을 순서대로 분배하기 때문에 여러 대의 서버가 동일한 스펙을 갖고 있고, 서버와의 연결(세션)이 오래 지속되지 않는 경우에 활용하기 적합합니다.
  • 가중 라운드로빈 방식 (Weighted Round Robin Method)
    각각의 서버마다 가중치를 매기고 가중치가 높은 서버에 클라이언트 요청을 우선적으로 배분합니다. 주로 서버의 트래픽 처리 능력이 상이한 경우 사용되는 부하 분산 방식입니다. 예를 들어 A라는 서버가 5라는 가중치를 갖고 B라는 서버가 2라는 가중치를 갖는다면, 로드밸런서는 라운드로빈 방식으로 A 서버에 5개 B 서버에 2개의 요청을 전달합니다.
  • IP 해시 방식 (IP Hash Method)
    클라이언트의 IP 주소를 특정 서버로 매핑하여 요청을 처리하는 방식입니다. 사용자의 IP를 해싱(Hashing, 임의의 길이를 지닌 데이터를 고정된 길이의 데이터로 매핑하는 것, 또는 그러한 함수)해 로드를 분배 하기 때문에 사용자가 항상 동일한 서버로 연결되는 것을 보장합니다.
  • 최소 연결 방식 (Least Connection Method)
    요청이 들어온 시점에 가장 적은 연결상태를 보이는 서버에 우선적으로 트래픽을 배분합니다. 자주 세션이 길어지거나, 서버에 분배된 트래픽들이 일정하지 않은 경우에 적합한 방식입니다.
  • 최소 응답시간 방식 (Least Response Time Method)
    서버의 현재 연결 상태와 응답시간(Response Time, 서버에 요청을 보내고 최초 응답을 받을 때까지 소요되는 시간)을 모두 고려하여 트래픽을 배분합니다. 가장 적은 연결 상태와 가장 짧은 응답시간을 보이는 서버에 우선적으로 로드를 배분하는 방식입니다.

L4 Load Balancer 와 L7 Load Balancer 의 차이

L4 Load Balancer

IP, Port 를 기준으로 스케줄링 알고리즘을 통해 부하를 분산합니다.

데이터의 내용을 복호화할 필요가 없어 안전하며,
데이터 안을 들여다보지 않고 패킷 레벨에서만 로드를 분산하기 때문에 속도가 빠르고 효율이 높습니다.

다만, 패킷의 내용을 살펴볼 수 없기 때문에 섬세한 라우팅이 불가능하며,
사용자의 IP가 수시로 바뀌는 경우라면 연속적인 서비스를 제공하기 어렵습니다.

L7 Load Balancer보다 가격이 저렴합니다.

L7 Load Balancer

L7 위에서 동작하기 때문에 IP, Port 이외에도 URI, Payload, Http Header, Cookie 등의 내용을 기준으로 부하를 분산합니다.
그래서 콘텐츠 기반 스위칭이라고도 합니다.

상위 계층에서 로드를 분산하기 때문에 훨씬 더 섬세한 라우팅이 가능하며, 캐싱 기능을 제공합니다.
비정상적인 트래픽을 사전에 필터링할 수 있어 서비스 안정성이 높습니다.

패킷의 내용을 복호화해야 하기에 더 높은 비용을 지불해야하며
클라이언트가 로드 밸런서와 인증서를 공유해야하기 때문에 공격자가 로드 밸런서를 통해서 클라이언트에 데이터에 접근할 보안 상의 위험성이 존재합니다.

L4 Load Balancer는 단지 부하를 분산시키는 것이라면
L7 Load Balancer는 요청의 세부적인 사항을 두고 결제만 담당하는 서버, 회원가입만을 담당하는 서버 등으로 분리해서 가볍고 작은 단위로 여러 개의 서비스를 운영하고 요청을 각각의 서버에 분산할 수 있는 것입니다. 

L7 Load BalancerL4 Load Balancer와 다르게 데이터를 분석해서 처리가 가능하기 때문에 악의적이거나 비 정상적인 콘텐츠를 감지해 보안 지점을 구축할 수도 있는 장점이 있고, 그 만큼 자원 소모가 크다는 단점이 있습니다.

* 용어 *

NAT
private IP를 public IP로 바꾸는데 사용하는 통신망의 주소 변조기

DSR
서버에서 클라이언트로 되돌아가는 경우, 목적지 주소를 스위치 IP가 아닌 클라이언트의 IP 주소로 전달해서 네트워크 스위치를 거치지 않고 바로 클라이언트를 찾아가는 개념

Tunneling
인터넷 상에서 눈에 보이지 않는 통로를 만들어 통신할 수 있게 하는 개념으로 데이터를 캡슐화해서 연결된 상호간에만 캡슐화된 패킷을 구별해 캡슐화를 해제할 수 있다.

라우터 / 클러스터 / 패킷

라우터(Router)

둘 혹은 그 이상의 네트워크와 네트워크 간 데이터 전송을 위해 최적 경로를 설정해주며 데이터를 해당 경로를 따라 한 통신망에서 다른 통신망으로 통신할 수 있도록 도와주는 인터넷 접속 장비

즉, 네트워크를 통해 정보를 주고 받을 때 데이터에 담긴 수신처의 주소를 읽고 가장 적절한 통신 통로를 이용해 다른 통신망으로 전송하는 장치이다.

내부 네트워크는 사용하는 컴퓨터 기종이나 OS, 프로토콜 등을 확실히 알 수 있기 때문에 네트워크의 최적화를 이룰 수 있다.
그러나 내부 네트워크를 외부와 연결할 때는 외부 네트워크에서 사용하는 프로토콜이나 컴퓨터 기종 등의 정보를 알 수 없다.

이러한 알 수 없는 임의의 네트워크와 내부 네트워크를 연결하기 위한 네트워크 장비가 바로 라우터이다.

라우터는 다른 기종간의 네트워크를 연결하는 기능을 하기 때문에 여러 가지 프로토콜에서 전송되는 패킷을 받아들일 수 있어야 한다. 이렇게 받아들인 패킷을 여러 경로 중 가장 효율적인 경로를 선택하여 보내며 흐름 제어를 한다.

클러스터(Cluster)

컴퓨팅 파워를 증가시키기 위한 방법으로 여러대의 컴퓨터를 연결한 병렬 시스템으로 마치 하나의 컴퓨터처럼 사용하는 것을 의미.

클러스터링 환경에서는 특정 장비에 문제가 생기거나 특정 장비에서 실행중인 어플리케이션에 문제가 발생하더라도 전체 서비스에 영향을 미치지 않도록 제어가 가능하다.

서비스를 제공하는 실제 장비는 물리적인 IP를 갖지만 데이터의 처리는 가상 IP를 통해 이루어진다.
(내부 시스템을 가려져 있는 것이 원칙)

패킷(Packet)

통신망에서 주고 받는 메시지의 조각으로 데이터 뿐만 아니라 목적지 주소까지 포함하고 있다.

예를 들어, A란 정보를 전달하고자 할 때, 라우터는 일단 이 정보를 A-1, A-2, A-3 식으로 쪼갠다.

쪼개진 정보는 최적의 경로를 찾아 상대방 서버를 찾아가고 상대방에 붙은 라우터는 이 쪼개진 정보(A-1, A-2, A-3)들을 다시 A란 원래의 모습으로 조합한다.

따라서 전달하고자 하는 정보를 보다 정확하고 빠르게 보낼 수 있으며 용량이 큰 동영상이나 음성 정보도 인터넷을 통해 무리 없이 주고 받을 수 있다.

MQ

MQ

Producer(생산자)가 Message를 Queue에 넣어두면, Consumer가 Message를 가져와 처리하는 방식

– 필요한 이유 ?
Client와 동기방식으로 많은 데이터 통신을 하게 되면 병목현상이 생기게 되고, 서버의 성능이 저하되는데 이런 현상을 막기 위해 또 하나의 미들웨어에 메시지를 위임하여 순차적으로 처리를 하는 것.

AMQP

인스턴스가 데이터를 서로 교환할때 사용하는 방법으로 MQ를 오픈 소스에 기반한 표준 프로토콜이 AMQP(Advanced Message Queuing Protocol)이다.

Rabbit MQ

AMQP 자체가 프로토콜을 의미하는데 이 프로토콜을 구현한 MQ 제품 중 하나로 Publisher(Producer)로부터 메시지를 받아 Consumer에게 라우트 하는 것이 주된 역할이다.

Vhost(virtual host)

Virtual Host를 통해서 하나의 RabbitMQ 인스턴스 안에 사용하고 있는 Application을 분리할 수 있음.

Connection

물리적인 TCP Connection, HTTPS -> TLS(SSL) Connection을 사용.

Channel

하나의 물리적인 Connection 내에 생성되는 가상의 Connection.
Consumer의 process나 thread는 각자 Channel을 통해 Queue에 연결될 수 있음.

Producer/Publisher

메시지들을 전송하는 프로그램(Application)을 의미.

Producing/Publishing

메시지를 전송한다는 의미(Producer/Publisher가 메시지를 전송).

Queue

mailbox를 의미하며 RabbitMQ 시스템 내에 위치하며 메시지를 메모리나 디스크에 저장했다가 Consumer에게 메시지를 전달하는
역할을 하는데 Consumer 대신에 RabbitMQ가 보관하는 메시지 버퍼 외부연동 서버에서 이 비동기 처리를 쉽게 구현하기 위하여
MQ(Message Queuing)를 사용한다.
큐는 스스로 관심있는 메시지 타입을 지정한 Binding을 통해 Exchange에 말 그대로 bind 된다.

Binding

Exchange와 Queue를 연결(관계를 정의)한 일종의 라우팅 테이블이다.
같은 큐가 여러개의 Exchange에 bind 될 수 있고, 하나의 exchange에 여러개의 큐가 binding 될 수도 있다.

Exchange

Publisher(Producer)로부터 수신한 메시지를 적절한 Queue에 분배(전달)하는 라우터의 역할.

Exchange Type

+ Binding 과 메시지를 매칭시키기 위한 라우팅 알고리즘을 정의한 것으로 어떻게 메시지를 라우팅 시킬지 결정하며
브로커는 여러개의 Exchange Type 인스턴스를 가질 수 있다

  1. Direct exchange : (empty string) and amq.direct
    참고 ) AMQP 정의 : 바인딩된 Queue중에서 메시지의 라우팅키와 매핑되어 있는 Queue로 메시지를 전달(1:1)
    1:1 관계로 Unicast방식에 적합, 라운드 로빈 방식으로 여러 workers(Consumer)간 task를 분리
    Exchange에 바인딩 된 Queue 중에서 메시지의 라우팅 키와 매핑되어 있는 Queue로 메시지를 전달한다.
  2. Fanout exchange : amq.fanout
    참고 ) AMQP 정의 : 메시지의 라우팅 키를 무시하고 Exchange에 바인딩 된 모든 Queue에 메시지를 전달(1:N)
  3. Topic exchange : amq.topic
    참고 ) AMQP 정의 : Exchange에 바인딩 된 Queue 중에서 메시지의 라우팅 키가 패턴에 맞는 Queue에게 모두 메시지를 전달 (Multicast)
  4. Headers exchange : amq.match (and amq.headers in Rabbit MQ)
    참고 ) AMQP 정의 : 라우팅 키 대신 메시지 헤더에 여러 속성들을 더해 속성들이 매칭 되는 큐에 메시지를 전달