HAProxy 및 로드 밸런싱 개념 소개

소개

HAProxy는 High Availability Proxy의 약자로, 인기 있는 오픈 소스 소프트웨어 TCP/HTTP 로드 밸런서 및 프록시 솔루션으로 Linux, macOS 및 FreeBSD에서 실행할 수 있습니다. 가장 흔한 사용 방법은 여러 서버(예: 웹, 응용 프로그램, 데이터베이스)에 워크로드를 분산하여 서버 환경의 성능과 신뢰성을 향상시키는 것입니다. GitHub, Imgur, Instagram 및 Twitter를 포함한 많은 고급 환경에서 사용됩니다.

이 안내서에서는 HAProxy가 무엇인지에 대한 일반적인 개요를 얻고 로드 밸런싱 용어를 검토하며, 자체 서버 환경의 성능과 신뢰성을 향상시키는 데 사용될 수 있는 예제를 살펴볼 것입니다.

HAProxy 용어

로드 밸런싱 및 프록시화를 논할 때 중요한 여러 용어와 개념이 있습니다. 다음 하위 섹션에서 자주 사용되는 용어를 살펴볼 것입니다.

기본 로드 밸런싱 유형에 대해 알아보기 전에 ACL, 백엔드 및 프론트엔드를 검토해야 합니다.

액세스 제어 목록 (ACL)

로드 밸런싱과 관련하여 ACL은 일부 조건을 테스트하고 테스트 결과에 따라 작업을 수행하는 데 사용됩니다(예: 서버 선택 또는 요청 차단). ACL의 사용은 패턴 일치 및 백엔드에 대한 연결 수와 같은 다양한 요인을 기반으로 유연한 네트워크 트래픽 전달을 허용합니다.

ACL의 예:

acl url_blog path_beg /blog

이 ACL은 사용자 요청의 경로가 /blog로 시작하는 경우 일치합니다. 예를 들어 http://yourdomain.com/blog/blog-entry-1 요청이 일치합니다.

ACL 사용에 대한 자세한 안내는 HAProxy 구성 매뉴얼을 참조하십시오.

백엔드

A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:

  • 어떤 로드 밸런싱 알고리즘을 사용할지
  • a list of servers and ports

A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.

여기에는 두 개의 백엔드 구성인 web-backendblog-backend이 포트 80에서 각각 두 개의 웹 서버를 수신 대기하도록 예시가 있습니다:

backend web-backend
   balance roundrobin
   server web1 web1.yourdomain.com:80 check
   server web2 web2.yourdomain.com:80 check
   
backend blog-backend
   balance roundrobin
   mode http
   server blog1 blog1.yourdomain.com:80 check
   server blog1 blog1.yourdomain.com:80 check

balance roundrobin 라인은 로드 밸런싱 알고리즘을 지정하며, 이는 로드 밸런싱 알고리즘 섹션에서 자세히 설명되어 있습니다.

모드 http는 레이어 7 프록시가 사용될 것임을 지정합니다. 이는 로드 밸런싱 유형 섹션에서 설명되어 있습니다.

서버 지시문 끝에 있는 체크 옵션은 해당 백엔드 서버에서 건강 상태를 확인해야 함을 지정합니다.

프론트엔드

A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend section of the HAProxy configuration. Their definitions are composed of the following components:

  • a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
  • ACLs
  • use_backend 규칙은 ACL 조건이 일치하는 경우 사용할 백엔드를 정의하고, default_backend 규칙은 다른 모든 경우를 처리합니다.

A frontend can be configured to various types of network traffic, as explained in the next section.

로드 밸런싱 유형

이제 로드 밸런싱에 사용되는 기본 구성 요소에 대한 이해를 갖게 되었으므로, 로드 밸런싱의 기본 유형으로 이동할 수 있습니다.

로드 밸런싱 없음

A simple web application environment with no load balancing might look like the following:

No Load Balancing

이 예에서 사용자는 직접 웹 서버에 연결하며, yourdomain.com에 로드 밸런싱이 없습니다. 단일 웹 서버가 다운되면 사용자가 더 이상 웹 서버에 액세스할 수 없습니다. 또한, 많은 사용자가 동시에 서버에 액세스하려고 하고 서버가 그 부하를 처리할 수 없는 경우, 사용자는 느린 경험을 할 수 있거나 전혀 연결할 수 없을 수 있습니다.

레이어 4 로드 밸런싱

여러 서버로 네트워크 트래픽을 로드 밸런싱하는 가장 간단한 방법은 레이어 4 (전송 계층) 로드 밸런싱을 사용하는 것입니다. 이 방법으로 로드 밸런싱하면 IP 범위 및 포트를 기반으로 사용자 트래픽을 전달합니다 (즉, http://yourdomain.com/anything에 대한 요청이 들어오면, 트래픽은 모든 yourdomain.com 요청을 처리하는 백엔드로 포트 80으로 전달됩니다). 레이어 4에 대한 자세한 내용은 네트워킹 소개TCP 하위 섹션을 확인하십시오.

다음은 레이어 4 로드 밸런싱의 간단한 예제 다이어그램입니다:

Layer 4 Load Balancing

사용자가 로드 밸런서에 액세스하면, 로드 밸런서는 사용자의 요청을 웹-백엔드 백엔드 서버 그룹 중 하나로 전달합니다. 선택된 백엔드 서버는 사용자의 요청에 직접 응답합니다. 일반적으로 웹-백엔드의 모든 서버는 동일한 콘텐츠를 제공해야 합니다. 그렇지 않으면 사용자는 일관성 없는 콘텐츠를 받을 수 있습니다. 참고로 웹 서버는 모두 동일한 데이터베이스 서버에 연결됩니다.

레이어 7 로드 밸런싱

네트워크 트래픽을 로드 밸런싱하는 더 복잡한 방법 중 하나는 레이어 7(응용 계층) 로드 밸런싱을 사용하는 것입니다. 레이어 7을 사용하면 로드 밸런서가 사용자의 요청 내용을 기반으로 다른 백엔드 서버로 요청을 전달할 수 있습니다. 이 로드 밸런싱 모드를 사용하면 같은 도메인과 포트 아래에 여러 웹 애플리케이션 서버를 실행할 수 있습니다. HTTP 하위 섹션을 참조하십시오. 네트워킹 소개에서 자세히 알아보십시오.

다음은 간단한 레이어 7 로드 밸런싱의 예시 다이어그램입니다.

Layer 7 Load Balancing

이 예시에서, 사용자가 yourdomain.com/blog를 요청하면, 사용자는 블로그 백엔드로 전달되며, 블로그 애플리케이션을 실행하는 서버 그룹입니다. 다른 요청은 웹-백엔드로 전달되며, 이 예시에서는 다른 애플리케이션을 실행할 수 있습니다. 두 백엔드는 모두 동일한 데이터베이스 서버를 사용합니다.

A snippet of the example frontend configuration would look like this:

frontend http
  bind *:80
  mode http

  acl url_blog path_beg /blog
  use_backend blog-backend if url_blog
 
  default_backend web-backend

이것은 포트 80에서 모든 들어오는 트래픽을 처리하는 http라는 프론트엔드를 구성합니다.

acl url_blog path_beg /blog는 사용자 요청의 경로가 /blog로 시작하는 경우 요청을 일치시킵니다.

use_backend blog-backend if url_blog는 ACL을 사용하여 트래픽을 blog-backend로 프록시합니다.

default_backend web-backend은 다른 모든 트래픽이 web-backend으로 전달될 것임을 지정합니다.

로드 밸런싱 알고리즘

사용되는 로드 밸런싱 알고리즘은 백엔드에서 로드 밸런싱할 때 선택될 서버를 결정합니다. HAProxy는 여러 알고리즘 옵션을 제공합니다. 로드 밸런싱 알고리즘 외에도 서버에 가중치 매개변수를 할당하여 다른 서버와 비교하여 서버가 선택되는 빈도를 조정할 수 있습니다.

A few of the commonly used algorithms are as follows:

roundrobin

라운드 로빈은 서버를 차례로 선택합니다. 이것이 기본 알고리즘입니다.

leastconn

가장 적은 연결 수를 가진 서버를 선택합니다. 장시간 세션에 대해 이를 권장합니다. 동일한 백엔드에 있는 서버도 라운드 로빈 방식으로 교체됩니다.

source

소스 IP 주소의 해시를 기반으로 사용자가 요청하는 서버를 선택합니다. 이 방법은 동일한 사용자가 동일한 서버에 연결되도록 보장합니다.

스티키 세션

일부 응용 프로그램은 사용자가 계속하여 동일한 백엔드 서버에 연결되어야 합니다. 이는 스티키 세션을 사용하여 필요한 백엔드에서 appsession 매개변수를 사용하여 달성할 수 있습니다.

헬스 체크

HAProxy는 백엔드 서버가 요청을 처리할 수 있는지를 확인하기 위해 헬스 체크를 사용합니다. 이를 통해 서버가 사용 불가능해지면 백엔드에서 수동으로 서버를 제거할 필요가 없어집니다. 기본 헬스 체크는 서버에 TCP 연결을 시도하는 것입니다.

서버가 건강 검사를 실패하면 요청을 처리할 수 없으므로 해당 서버는 자동으로 백엔드에서 비활성화되고 해당 서버가 다시 건강 상태가 될 때까지 트래픽이 전달되지 않습니다. 백엔드의 모든 서버가 실패하면 적어도 하나의 백엔드 서버가 다시 건강 상태가 될 때까지 서비스를 사용할 수 없게 됩니다.

일부 유형의 백엔드(예: 데이터베이스 서버)의 경우 기본 건강 검사가 여전히 서버가 여전히 건강한지 여부를 결정하는 것은 아닙니다.

Nginx 웹 서버는 독립적인 프록시 서버 또는 로드 밸런서로도 사용할 수 있으며, 캐싱 및 압축 기능으로 인해 HAProxy와 함께 자주 사용됩니다.

고가용성

이 튜토리얼에서 설명한 레이어 4 및 7 로드 밸런싱 설정은 모두 로드 밸런서를 사용하여 트래픽을 여러 백엔드 서버 중 하나로 방향을 지정합니다. 그러나 이러한 설정에서 로드 밸런서는 단일 장애점입니다. 만약 로드 밸런서가 다운되거나 요청으로 과부하가 걸리면 서비스의 고대역이나 다운타임이 발생할 수 있습니다.

A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.

여기에 고가용성 설정의 다이어그램이 있습니다:

이 예에서 여러 로드 밸런서(하나는 활성이고 하나 이상은 수동)가 서버 간에 다시 매핑할 수 있는 정적 IP 주소 뒤에 있습니다. 사용자가 웹 사이트에 액세스하면 요청이 외부 IP 주소를 통해 활성 로드 밸런서로 전달됩니다. 해당 로드 밸런서가 실패하면 장애 조치 메커니즘이 감지하고 IP 주소를 수동 서버 중 하나로 자동 재할당합니다. 활성/수동 HA 설정을 구현하는 여러 가지 다른 방법이 있습니다. 자세한 내용은 예약된 IP 사용 방법을 참조하십시오.

결론

로드 밸런싱의 이해를 가지고 있고 HAProxy를 사용하는 방법을 알고 있다면, 자체 서버 환경의 성능과 신뢰성을 향상시키는 데 필요한 탄탄한 기반이 마련됩니다.

HAProxy의 출력을 나중에 확인하려면 CentOS 8에서 Rsyslog를 사용하여 HAProxy 로깅 구성하는 방법[빠른 시작]을 확인하세요.

일반적인 HAProxy 오류를 확인하여 문제를 해결하려면. 더 깊은 문제 해결이 필요한 경우 일반적인 HAProxy 오류를 해결하는 방법을 살펴보십시오.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts