ALB와 NLB

Created
Jan 23, 2025 09:18 AM
Tags
alb
nlb
grpc
aws
ALB(Application Load Balancer)와 NLB(Network Load Balancer)를 비교해본다.

ALB

L7, 즉 application layer에서 로드밸런싱을 지원한다. 경로나 호스트에 따라 라우팅을 할 수 있고, HTTP 헤더나 쿼리 매기변수를 기반으로도 라우팅할 수 있다.
SSL/TLS를 ALB에서 종료하고 백엔드로 평문 HTTP를 전송할 수 있는데, 이렇게할 경우 백엔드 서버에서의 encryption/decryption 부담을 줄일 수 있다.
WebSocket과 HTTP/2를 네이티브로 지원한다.

NLB

L4, 즉 transport layer에서 로드밸런싱을 지원한다. 고정 IP를 제공하고 TCP 수준에서 처리하기 때문에 ALB보다 더 저지연으로 동작한다.
NLB는 여러 개의 IP 주소를 할당하며 각 IP 주소는 특정 백엔드 서버로 요청을 전달한다. NLB는 DNS 조회 시 라운드 로빈 방식으로 여러 IP 주소 중 하나를 반환한다.

gRPC 고려

NLB와 gRPC

NLB는 gRPC의 사용 목적인 낮은 지연이라는 측면에서는 강점이 있지만, TCP 연결 수준에서 작동하기 때문에 로드밸런싱이 제한적이게 보일 수 있다. gRPC는 HTTP/2를 기반으로 멀티플렉싱을 통해 여러 요청을 단일 TCP 연결에서 처리한다. 클라이언트가 단일 TCP 연결만 사용하면, NLB는 백엔드 서버 중 하나로만 요청을 전달하게 된다. 따라서 클라이언트에서 다중 연결 풀을 설정해야 한다.
// round_robin 설정으로 gRPC 클라이언트가 다중 연결을 사용하여 백엔드에 요청을 분산 conn, err := grpc.Dial( "your-nlb-dns-name:443", grpc.WithDefaultServiceConfig(`{"loadBalancingConfig": [{"round_robin":{}}]}`), grpc.WithTransportCredentials(credentials.NewTLS(nil)), )
혹은 클라이언트가 주기적으로 TCP 연결을 닫고 새로운 연결을 생성하도록 구현할 수도 있다.

DNS 캐싱 문제

클라이언트가 NLB의 DNS 이름을 IP로 캐싱하여 특정 백엔드로만 연결될 수 있다. 클라이언트의 DNS 캐싱을 비활성화 하거나 TTL을 짧게 설정해 해결해야 한다.

ALB와 gRPC

한편, ALB는 요청 수준에서 로드 밸런싱이 가능하므로 gRPC의 멀티플렉싱을 활용하면서도 효과적인 로드밸런싱을 할 수 있다는 장점도 있다.