networking MikroTik HomeServer

ECMP로 이해하는 네트워크 로드밸런싱

동일 목적지로 가는 여러 경로를 동시에 활용하는 ECMP의 원리와 MikroTik 라우터에서의 설정 방법을 실습합니다.

홈랩 Kubernetes에서 Gateway API를 운영하면서 VIP(Virtual IP)로 들어오는 트래픽을 여러 노드에 분산해야 하는 상황이 생겼습니다. 이때 활용한 기술이 ECMP입니다.


ECMP란?

ECMP(Equal-Cost Multi-Path)는 동일한 목적지로 가는 비용이 같은 여러 경로를 동시에 사용하는 라우팅 기법입니다.

RFC 2992 - Analysis of an Equal-Cost Multi-Path Algorithm

일반 라우팅 vs ECMP

일반적인 라우팅에서는 목적지당 하나의 최적 경로만 사용합니다. 나머지 경로는 대기 상태로 유지됩니다.

flowchart LR
subgraph "일반 라우팅"
Client1[Client] --> Router1[Router]
Router1 -->|Active| Node1A[node1]
Router1 -.->|Standby| Node2A[node2]
Router1 -.->|Standby| Node3A[node3]
end

ECMP는 비용이 같은 여러 경로를 동시에 활용합니다:

flowchart LR
subgraph "ECMP 라우팅"
Client2[Client] --> Router2[Router]
Router2 -->|Active| Node1B[node1]
Router2 -->|Active| Node2B[node2]
Router2 -->|Active| Node3B[node3]
end

ECMP의 장점

장점설명
로드밸런싱트래픽이 여러 경로로 자동 분산
고가용성한 경로 장애 시 나머지 경로로 자동 우회
대역폭 활용여러 링크의 대역폭을 동시에 사용

트래픽 분산 방식

ECMP는 패킷 단위가 아닌 연결(Flow) 단위로 트래픽을 분산합니다. 이 방식을 이해하는 것이 ECMP의 핵심입니다.

RFC 2992: “Protocols such as TCP perform better if the path they flow along does not change while the stream is connected.”

패킷 단위 분산의 문제점

만약 패킷 단위로 분산한다면 어떤 일이 발생할까요?

sequenceDiagram
participant C as Client
participant R as Router
participant N1 as node1
participant N2 as node2
Note over C,N2: 패킷 단위 분산 (문제 발생)
C->>R: Packet 1 (seq=100)
R->>N1: Packet 1 → node1 (10ms 지연)
C->>R: Packet 2 (seq=200)
R->>N2: Packet 2 → node2 (2ms 지연)
C->>R: Packet 3 (seq=300)
R->>N1: Packet 3 → node1 (10ms 지연)
Note over N1,N2: Packet 2가 먼저 도착!
N2-->>C: Packet 2 도착 (seq=200)
N1-->>C: Packet 1 도착 (seq=100)
Note over C: 순서 역전 → TCP 재전송 발생

같은 TCP 연결의 패킷들이 서로 다른 경로로 가면:

  • 경로마다 지연 시간(latency)이 다름
  • 늦게 보낸 패킷이 먼저 도착하는 순서 역전(reordering) 발생
  • TCP가 패킷 손실로 오인하여 불필요한 재전송 발생
  • 결과적으로 성능 저하

Flow 단위 분산의 원리

Flow 단위 분산은 같은 연결의 모든 패킷을 항상 같은 경로로 보냅니다.

sequenceDiagram
participant C as Client
participant R as Router
participant N1 as node1
Note over C,N1: Flow 단위 분산 (정상 동작)
C->>R: Packet 1 (seq=100)
R->>N1: Packet 1 → node1
C->>R: Packet 2 (seq=200)
R->>N1: Packet 2 → node1 (같은 경로)
C->>R: Packet 3 (seq=300)
R->>N1: Packet 3 → node1 (같은 경로)
Note over N1: 순서대로 도착
N1-->>C: 모든 패킷 순서대로 응답

Flow 식별: 5-Tuple Hash

라우터는 패킷 헤더에서 5가지 요소를 추출하여 해시값을 계산합니다.

Linux 커널에서는 fib_multipath_hash_policy 설정으로 해시 필드를 선택합니다.

모드해시 필드
0Layer 3 (기본)Source IP, Dest IP, Protocol
1Layer 4+ Source Port, Dest Port

Linux Kernel - IP Sysctl Documentation

flowchart LR
subgraph "5-Tuple"
A[소스 IP]
B[소스 Port]
C[목적지 IP]
D[목적지 Port]
E[프로토콜]
end
subgraph "Hash 계산"
H[Hash Function]
end
subgraph "경로 선택"
R1[hash % 3 = 0 → node1]
R2[hash % 3 = 1 → node2]
R3[hash % 3 = 2 → node3]
end
A --> H
B --> H
C --> H
D --> H
E --> H
H --> R1
H --> R2
H --> R3

해시 계산 과정:

  1. 패킷에서 5-tuple 추출: (1.1.1.1, 50000, 172.30.1.7, 443, TCP)
  2. 해시 함수 적용: hash("1.1.1.1:50000:172.30.1.7:443:TCP") = 12847392
  3. 경로 수로 나눈 나머지: 12847392 % 3 = 0node1 선택

같은 5-tuple을 가진 패킷은 항상 같은 해시값을 가지므로 항상 같은 경로로 갑니다.

실제 분산 예시

연결5-TupleHash 결과선택된 노드
사용자A 연결11.1.1.1:50000VIP:4430node1
사용자A 연결21.1.1.1:50001VIP:4431node2
사용자B2.2.2.2:50000VIP:4432node3
사용자C3.3.3.3:50000VIP:4430node1

같은 사용자(사용자A)라도 소스 포트가 다르면 다른 Flow로 인식되어 다른 노드로 분산됩니다. 브라우저가 새 탭을 열거나 새 연결을 맺으면 소스 포트가 바뀌므로 자연스럽게 로드밸런싱이 됩니다.

세션 유지(Session Persistence)

Flow 기반 분산의 핵심 장점은 세션 유지입니다:

  • TCP 연결 동안 5-tuple이 변하지 않음
  • 따라서 연결이 유지되는 동안 항상 같은 노드로 라우팅
  • 상태 기반 애플리케이션(로그인 세션, 장바구니 등)도 문제없이 동작

참고: 일부 로드밸런서는 “sticky session”을 위해 쿠키를 사용하지만, ECMP는 라우터 레벨(L3)에서 동작하며 L4 포트 정보까지 포함한 5-tuple 해시로 세션을 유지합니다.


MikroTik에서 ECMP 설정

MikroTik RouterOS에서 ECMP를 설정하는 방법은 간단합니다. 하나의 route에 여러 gateway를 지정하면 됩니다.

CLI로 설정

Terminal window
/ip route add dst-address=172.30.1.7/32 \
gateway=172.30.1.20,172.30.1.70,172.30.1.82 \
distance=10 \
comment="ECMP to Gateway VIP"
  • dst-address: 목적지 (여기서는 Gateway VIP)
  • gateway: 쉼표로 구분된 여러 next-hop (3개 노드의 IP)
  • distance: Administrative Distance (낮을수록 우선)

MikroTik IP Routing - ECMP

Winbox에서 설정

  1. IP → Routes 메뉴로 이동
  2. + 버튼 클릭
  3. Gateway 필드에 여러 IP를 쉼표로 구분하여 입력

실제 설정 확인

현재 홈랩 MikroTik 라우터의 route 설정입니다.

Route 목록

Terminal window
/ip route print detail where dst-address=172.30.1.7/32
Flags: A - active, S - static, D - dynamic, b - bgp
0 A S ;;; ECMP to Gateway VIP
dst-address=172.30.1.7/32
gateway=172.30.1.20,172.30.1.70,172.30.1.82
gateway-status=172.30.1.20 reachable via bridge,
172.30.1.70 reachable via bridge,
172.30.1.82 reachable via bridge
distance=10
1 Db dst-address=172.30.1.7/32 gateway=172.30.1.20
distance=20 bgp-as-path="64513" received-from=node1
2 Db dst-address=172.30.1.7/32 gateway=172.30.1.70
distance=20 bgp-as-path="64513" received-from=node2
3 Db dst-address=172.30.1.7/32 gateway=172.30.1.82
distance=20 bgp-as-path="64513" received-from=node3-gpu

설정 해석

RouteTypeDistance역할
0번Static ECMP10Active - 트래픽 분산
1-3번BGP (개별)20노드 상태 모니터링

Distance가 낮을수록 우선순위가 높습니다.

  • Static ECMP route(distance=10)가 Active 상태로 트래픽 처리
  • BGP route들(distance=20)은 distance가 높아 라우팅에는 사용되지 않음

참고: MikroTik RouterOS 기본값은 Static=1, BGP=200입니다. 위 예시에서는 관리 편의를 위해 명시적으로 distance를 설정했습니다.

MikroTik Route Selection and Filters

Q: BGP route가 “백업”이 아니라면, 왜 필요한가?

Static route와 BGP route가 같은 노드들을 가리키므로, Static이 모두 실패하면(3개 노드 다운) BGP도 당연히 실패합니다. BGP의 진짜 역할은 노드 상태 모니터링입니다. BGP keepalive가 실패하면 라우터가 해당 노드의 다운을 감지하고, 이 정보를 활용하여 Static ECMP에서 해당 gateway를 제외합니다.


BGP와 ECMP의 조합

현재 구성에서 BGP와 Static ECMP를 함께 사용하는 이유가 있습니다.

RouterOS 6.x의 BGP 제한

RouterOS 6.x에서는 BGP로 받은 route에 대해 ECMP가 기본 지원되지 않습니다. 같은 prefix를 여러 피어에서 광고해도 하나의 route만 Active로 선택됩니다.

MikroTik Forum - BGP ECMP Discussion

Terminal window
/routing bgp peer print
Flags: E - established
# INSTANCE REMOTE-ADDRESS REMOTE-AS
0 E default 172.30.1.20 64513
1 E default 172.30.1.70 64513
2 E default 172.30.1.82 64513

3개 노드 모두 BGP 피어링이 되어 있고, 각 노드가 VIP(172.30.1.7/32)를 광고합니다. 하지만 RouterOS 6.x에서는 이 중 하나만 Active route로 선택됩니다.

해결책: Static ECMP + BGP 조합

flowchart LR
subgraph Router[MikroTik Router]
Static[Static ECMP<br/>distance=10]
BGP[BGP<br/>distance=20]
end
subgraph Nodes[K8s Nodes]
N1[node1]
N2[node2]
N3[node3]
end
Static -->|트래픽| N1 & N2 & N3
BGP -.->|keepalive| N1 & N2 & N3

Static route와 BGP route 모두 같은 3개 노드를 가리킵니다. 차이점은:

  • Static ECMP: 하나의 route에 3개 gateway → ECMP 로드밸런싱
  • BGP: 3개의 개별 route → 라우팅에 사용되지 않지만 노드 상태 감지

각 역할:

구성 요소역할
Static ECMP트래픽을 3개 노드에 분산
BGP keepalive노드 생존 여부 모니터링 (TCP 기반, 빠른 감지)
ARPgateway reachability 확인 (L2 수준)

Failover 시나리오:

  1. node1 다운 → BGP session 끊김 → 라우터가 node1 다운 인지
  2. Static ECMP의 gateway 중 node1이 unreachable로 표시
  3. 트래픽이 node2, node3로만 분산

정리

개념설명
ECMP동일 비용 다중 경로 - 여러 경로를 동시에 사용
Flow 기반 분산5-tuple 해시로 연결 단위 분산, 세션 유지 보장
MikroTik 설정하나의 route에 여러 gateway를 쉼표로 지정
Distance낮을수록 우선순위 높음 (Static=10이 BGP=20보다 우선)
BGP 역할라우팅이 아닌 노드 상태 모니터링 (keepalive)

ECMP는 별도의 로드밸런서 장비 없이 라우터 레벨에서 트래픽을 분산할 수 있는 효율적인 방법입니다. 특히 홈랩처럼 비용과 복잡도를 최소화해야 하는 환경에서 유용합니다.


참고

관련 콘텐츠

댓글