라우트와 부하 분산
CreateYourVPN에서 라우트란 무엇인지, 1분 만에 만드는 방법, 빈 라우트가 왜 유용한지, 그리고 시스템이 사용자를 서버에 어떻게 분산하는지.
라우트는 여러분의 인프라와 사용자가 실제로 보는 것 사이를 잇는 다리입니다. 여러분은 서버와 인바운드를 관리하지만, 사용자는 앱에서 짧은 "서버" 목록을 보게 됩니다 — 그리고 그 목록의 모든 항목이 사실은 라우트입니다.
라우트 = 사용자 앱의 한 줄
라우트는 클라이언트 구독 안에서 하나의 이름으로 묶인 인바운드 그룹입니다. 규칙은 단순합니다.
비어 있지 않은 라우트 1개 = 사용자 서버 목록의 항목 1개.
라우트는 인바운드 하나만 담을 수도 있고, 서로 다른 서버에 있는 인바운드 열 개를 담을 수도 있습니다. 사용자는 이런 구조를 전혀 보지 못합니다: 그저 "🇺🇸 USA"를 선택할 뿐이고, 실제로 어느 서버로 접속할지는 부하 분산기가 결정합니다 — 자세한 내용은 아래에서 다룹니다.
한편 사용자에게 보이는 이름은 선택된 인바운드의 이름입니다: 인바운드 이름을 명확하게 지어 두면("🇺🇸 New York", "🇺🇸 Dallas") 사용자에게도 정확히 그 이름이 보입니다.
첫 서버를 연결하면 시스템이 알아서 기본 라우트를 만들고 첫 인바운드를 그 안에 넣어 줍니다 — 그래서 설정 하나 없이도 모든 게 바로 작동하는 것입니다. 라우트가 진짜 힘을 발휘하는 건 더 많은 걸 원할 때입니다: 여러 국가, 전용 "스트리밍" 라우트 등등.
라우트 만들기
클러스터 페이지의 "라우트" 섹션에서 **"새 라우트"**를 클릭하세요. 마법사는 세 개의 섹션으로 구성됩니다.
- 클라이언트에게 표시되는 라우트 — 이름(예:
🇺🇸 USA)과 국기. 이건 라우트의 "간판"입니다. - 부하 분산 알고리즘 — "트래픽 기준 최소 부하"(기본값) 또는 "라운드 로빈". 차이점은 아래에서 설명합니다.
- 풀의 인바운드 — 어떤 인바운드가 이 라우트에 속하는지. 이 섹션은 선택 사항입니다: 빈 라우트를 만들고 나중에 드래그로 채워 넣어도 됩니다.
인바운드는 하나의 라우트에만 속할 수 있습니다. 이미 다른 라우트가 차지하고 있는 인바운드를 선택하면, 그 인바운드는 새 라우트로 옮겨집니다. 이렇게 해서 시스템은 각 진입점의 트래픽이 정확히 하나의 규칙 집합에 의해서만 관리되도록 보장합니다.
토폴로지 다이어그램: 라우트를 한눈에
클러스터 페이지에서 라우트는 실시간 다이어그램으로 표시됩니다: 왼쪽에는 서버와 그 인바운드들, 오른쪽에는 라우트 박스들. 인바운드는 마우스로 드래그할 수 있습니다: 인바운드를 잡아서 다른 라우트에 놓으면 끝입니다. "미할당" 영역도 있습니다 — 인바운드를 그곳에 놓으면 모든 라우트에서 분리됩니다.
라우트 박스 자체의 순서도 바꿀 수 있습니다(드래그 핸들이나 화살표 사용) — 이건 순전히 여러분 편의를 위한 시각적 정렬일 뿐입니다.
빈 라우트
인바운드가 하나도 없는 라우트는 점선 테두리로 표시되며, 분배 노드로 이어지는 "파이프"도 없습니다 — 사용자에게는 보이지 않는다는 힌트입니다. 빈 라우트는 편리한 자리 표시자로 쓸 수 있습니다: "🇯🇵 Japan"을 미리 만들어 두고, 나중에 일본 서버가 생기면 인바운드를 드래그해 넣으세요 — 그러면 라우트가 살아납니다.
반대 상황도 강조해서 표시됩니다: 어떤 라우트에도 속하지 않은 인바운드가 있으면 패널이 경고합니다 — "인바운드가 어떤 라우트에도 포함되지 않아 클라이언트가 아직 볼 수 없습니다".
부하 분산: 누가 어느 서버로 가는가
사용자가 연결을 요청하면, 각 라우트마다 시스템은 풀 안에서 인바운드를 하나 선택합니다 — 그것도 최신 서버 메트릭(3강에서 다룬 바로 그 메트릭)을 기반으로 실시간으로요. 알고리즘은 두 가지입니다.
"트래픽 기준 최소 부하" (기본값)
시스템은 각 서버에 사용자 1인당 남은 대역폭이 얼마나 되는지를 살펴봅니다: 채널 용량에서 현재 트래픽을 뺀 뒤, 접속 중인 사용자 수로 나눕니다. 여유가 가장 큰 서버가 선택됩니다. 이것은 "실제 부하 기준"의 공정한 분산 방식입니다: 형식적으로는 사용자 수가 적어 보여도, 이미 포화 상태인 약한 서버로는 새 사용자가 가지 않습니다.
시스템은 채널 용량을 스스로 추정합니다 — 실제 트래픽에서 관측된 피크값을 근거로 삼습니다(서버가 한동안 부하를 받지 않으면 그 피크값은 서서히 "식습니다").
"라운드 로빈"
단순한 규칙입니다: 새 사용자는 현재 접속자 수가 가장 적은 서버로 갑니다 — 다만 서버의 계수로 보정됩니다. 계수는 가중치입니다: 계수가 2.0인 서버는 "공간이 두 배"인 것으로 취급되어, 계수 1.0인 이웃 서버보다 대략 두 배 많은 사용자를 받게 됩니다. 덕분에 크기가 다른 머신들도 공정하게 부하를 나눌 수 있습니다.
풀 안의 어떤 서버가 아직 용량 추정치를 갖고 있지 않다면(예를 들어 방금 추가되어 트래픽 피크를 한 번도 겪지 않은 서버라면), 해당 라우트는 자연스럽게 라운드 로빈으로 전환됩니다 — 결정은 언제나 실제로 존재하는 데이터를 근거로 내려집니다.
재분배는 언제 일어나는가
늘, 그리고 자동으로 일어납니다. 서버 선택은 매 요청마다 최신 메트릭을 이용해 다시 계산됩니다: 부하가 바뀌면 새 사용자는 더 한산한 서버로 향하기 시작합니다. 동시에 시스템은 조건이 비슷할 때는 같은 사용자에게 같은 선택을 유지하려고 노력합니다 — 그래야 그 사용자의 "서버"가 이리저리 튀지 않으니까요.
그리고 한 가지 안전장치가 더 있습니다: 모니터링이 이용 불가로 판단한 서버는 선택 대상에서 제외됩니다 — 자세한 내용은 7강에서 다룹니다.
핵심 요약
- 라우트는 인바운드 그룹의 "간판"이며, 비어 있지 않은 라우트 하나가 사용자 앱의 한 줄이 됩니다.
- 인바운드 하나는 라우트 하나에만 속합니다. 어떤 라우트에도 속하지 않은 인바운드는 클라이언트에게 보이지 않습니다.
- 빈 라우트는 완전히 정상적인 자리 표시자입니다: 점선 박스이며 사용자에게는 숨겨집니다.
- 알고리즘은 두 가지입니다: 남은 대역폭 기준(스마트하며 기본값)과 가중치가 적용된 라운드 로빈.
- 분산은 실시간입니다: 접속마다 현재 메트릭을 기반으로 다시 계산됩니다.