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] endECMP는 비용이 같은 여러 경로를 동시에 활용합니다:
flowchart LR subgraph "ECMP 라우팅" Client2[Client] --> Router2[Router] Router2 -->|Active| Node1B[node1] Router2 -->|Active| Node2B[node2] Router2 -->|Active| Node3B[node3] endECMP의 장점
| 장점 | 설명 |
|---|---|
| 로드밸런싱 | 트래픽이 여러 경로로 자동 분산 |
| 고가용성 | 한 경로 장애 시 나머지 경로로 자동 우회 |
| 대역폭 활용 | 여러 링크의 대역폭을 동시에 사용 |
트래픽 분산 방식
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설정으로 해시 필드를 선택합니다.
값 모드 해시 필드 0 Layer 3 (기본) Source IP, Dest IP, Protocol 1 Layer 4 + Source Port, Dest Port
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해시 계산 과정:
- 패킷에서 5-tuple 추출:
(1.1.1.1, 50000, 172.30.1.7, 443, TCP) - 해시 함수 적용:
hash("1.1.1.1:50000:172.30.1.7:443:TCP") = 12847392 - 경로 수로 나눈 나머지:
12847392 % 3 = 0→ node1 선택
같은 5-tuple을 가진 패킷은 항상 같은 해시값을 가지므로 항상 같은 경로로 갑니다.
실제 분산 예시
| 연결 | 5-Tuple | Hash 결과 | 선택된 노드 |
|---|---|---|---|
| 사용자A 연결1 | 1.1.1.1:50000 → VIP:443 | 0 | node1 |
| 사용자A 연결2 | 1.1.1.1:50001 → VIP:443 | 1 | node2 |
| 사용자B | 2.2.2.2:50000 → VIP:443 | 2 | node3 |
| 사용자C | 3.3.3.3:50000 → VIP:443 | 0 | node1 |
같은 사용자(사용자A)라도 소스 포트가 다르면 다른 Flow로 인식되어 다른 노드로 분산됩니다. 브라우저가 새 탭을 열거나 새 연결을 맺으면 소스 포트가 바뀌므로 자연스럽게 로드밸런싱이 됩니다.
세션 유지(Session Persistence)
Flow 기반 분산의 핵심 장점은 세션 유지입니다:
- TCP 연결 동안 5-tuple이 변하지 않음
- 따라서 연결이 유지되는 동안 항상 같은 노드로 라우팅
- 상태 기반 애플리케이션(로그인 세션, 장바구니 등)도 문제없이 동작
참고: 일부 로드밸런서는 “sticky session”을 위해 쿠키를 사용하지만, ECMP는 라우터 레벨(L3)에서 동작하며 L4 포트 정보까지 포함한 5-tuple 해시로 세션을 유지합니다.
MikroTik에서 ECMP 설정
MikroTik RouterOS에서 ECMP를 설정하는 방법은 간단합니다. 하나의 route에 여러 gateway를 지정하면 됩니다.
CLI로 설정
/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 (낮을수록 우선)
Winbox에서 설정
- IP → Routes 메뉴로 이동
- + 버튼 클릭
- Gateway 필드에 여러 IP를 쉼표로 구분하여 입력
실제 설정 확인
현재 홈랩 MikroTik 라우터의 route 설정입니다.
Route 목록
/ip route print detail where dst-address=172.30.1.7/32Flags: 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설정 해석
| Route | Type | Distance | 역할 |
|---|---|---|---|
| 0번 | Static ECMP | 10 | Active - 트래픽 분산 |
| 1-3번 | BGP (개별) | 20 | 노드 상태 모니터링 |
Distance가 낮을수록 우선순위가 높습니다.
- Static ECMP route(distance=10)가 Active 상태로 트래픽 처리
- BGP route들(distance=20)은 distance가 높아 라우팅에는 사용되지 않음
참고: MikroTik RouterOS 기본값은 Static=1, BGP=200입니다. 위 예시에서는 관리 편의를 위해 명시적으로 distance를 설정했습니다.
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
/routing bgp peer printFlags: 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 645133개 노드 모두 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 & N3Static route와 BGP route 모두 같은 3개 노드를 가리킵니다. 차이점은:
- Static ECMP: 하나의 route에 3개 gateway → ECMP 로드밸런싱
- BGP: 3개의 개별 route → 라우팅에 사용되지 않지만 노드 상태 감지
각 역할:
| 구성 요소 | 역할 |
|---|---|
| Static ECMP | 트래픽을 3개 노드에 분산 |
| BGP keepalive | 노드 생존 여부 모니터링 (TCP 기반, 빠른 감지) |
| ARP | gateway reachability 확인 (L2 수준) |
Failover 시나리오:
- node1 다운 → BGP session 끊김 → 라우터가 node1 다운 인지
- Static ECMP의 gateway 중 node1이 unreachable로 표시
- 트래픽이 node2, node3로만 분산
정리
| 개념 | 설명 |
|---|---|
| ECMP | 동일 비용 다중 경로 - 여러 경로를 동시에 사용 |
| Flow 기반 분산 | 5-tuple 해시로 연결 단위 분산, 세션 유지 보장 |
| MikroTik 설정 | 하나의 route에 여러 gateway를 쉼표로 지정 |
| Distance | 낮을수록 우선순위 높음 (Static=10이 BGP=20보다 우선) |
| BGP 역할 | 라우팅이 아닌 노드 상태 모니터링 (keepalive) |
ECMP는 별도의 로드밸런서 장비 없이 라우터 레벨에서 트래픽을 분산할 수 있는 효율적인 방법입니다. 특히 홈랩처럼 비용과 복잡도를 최소화해야 하는 환경에서 유용합니다.