로드 밸런싱 · 부하 분산
Load Balancing
로드 밸런싱이란?
- 요청을 여러 서버에 고르게 분산
- 한 서버 과부하 방지
- 확장·안정성의 기본
로드 밸런싱을 붙이는 순간 서버는 '한 대뿐인 자산'에서 언제든 교체 가능한 부품으로 성격이 바뀝니다. 배포할 때 한 대씩 뒤로 빼 새 버전을 올리고 다시 붙이면 사용자는 아무것도 느끼지 못합니다. 새벽에 점검 공지를 띄우고 서비스를 세우던 관행이 사라지고 평일 오후에도 배포하는 팀이 됩니다. 인프라 장비가 아니라 일하는 방식이 먼저 바뀌는 지점입니다.
나누는 층위는 크게 둘입니다. L4는 IP와 포트만 보고 넘겨 빠르지만 요청 내용을 모르고, L7은 URL·헤더·쿠키까지 읽어 /api는 API 서버로, /img는 이미지 서버로 갈라 보낼 수 있습니다. 규칙도 순서대로 돌리는 라운드로빈, 접속 수가 가장 적은 쪽으로 보내는 최소 연결, 같은 사용자를 같은 서버로 묶는 IP 해시가 있는데 처리 시간이 들쭉날쭉한 서비스일수록 최소 연결이 유리합니다. 여기에 헬스체크 주기와 실패 임계치, 예를 들어 10초 간격에 3회 연속 실패 시 제외 같은 설정이 장애 대응 속도를 결정합니다.
다만 로드 밸런서 자체가 서버를 늘려주지는 않습니다. 대수를 자동으로 조절하는 것은 오토스케일링, 이미지·영상을 사용자 가까운 곳에서 내려주는 것은 CDN, 주 시스템이 통째로 죽었을 때 대기 시스템으로 넘기는 것은 페일오버입니다. 셋이 맞물릴 때만 실제 트래픽을 견딥니다. 로드 밸런서만 앞에 세워두고 뒤에 서버가 두 대뿐이라면 몰릴 때 두 대가 같이 무너집니다.
현장에서 가장 많이 깨지는 지점은 세션입니다. 로그인 정보를 서버 메모리에 들고 있으면 요청이 다른 서버로 갈 때마다 로그인이 풀려 장바구니가 사라졌다는 문의가 쏟아집니다. 급한 김에 사용자를 한 서버에 묶는 스티키 세션으로 덮는 경우가 많은데, 그 서버가 죽으면 그쪽 사용자만 한꺼번에 튕겨 나갑니다. 세션은 Redis 같은 공용 저장소로 빼는 것이 정석입니다. 또 헬스체크가 포트 응답만 확인하면 애플리케이션이 DB 연결을 잃고도 '정상'으로 보고돼 죽은 서버로 요청이 계속 흘러갑니다.
대규모 웹 서비스의 트래픽 처리 필요에서 발전한 네트워크 기술로, 클라우드 인프라의 기본 요소가 됐습니다.
가상의 사례로 살펴보겠습니다. 연매출 약 400억 원, 임직원 180명 규모의 생활용품 이커머스 A사는 매달 첫째 주 할인전마다 주문이 몰렸습니다. 지난 3월 행사에서는 오픈 10분 만에 웹 서버 한 대가 CPU 98%로 멈추면서 결제 페이지가 12분간 열리지 않았습니다. 그날 하루 취소·문의만 300건 넘게 쌓였습니다.
- 인프라팀 박 팀장이 로그를 뒤져 보니 서버는 이미 2대였지만, DNS 라운드로빈이라 멈춘 쪽으로도 요청이 그대로 갔습니다. '살아 있는지 확인하는 장치가 아예 없었던 겁니다.'
- 클라우드 L7 로드밸런서를 앞단에 두고 웹 서버를 4대로 늘린 뒤, 헬스체크 경로가 DB 연결까지 확인하도록 고쳐 10초 간격 3회 실패 시 자동으로 빠지게 했습니다.
- 1차 테스트에서 로그인이 자꾸 풀리자 개발팀 김 리드가 '세션이 서버 메모리에 있습니다'라고 짚었고, 이틀에 걸쳐 세션 저장소를 Redis로 분리했습니다.
- 동시 접속 8,000명 부하 테스트에서 라운드로빈은 특정 서버 CPU가 90%까지 튀어, 분산 방식을 최소 연결로 바꾸고 이미지 요청은 CDN으로 떼어냈습니다.
- 6월 할인전에는 동시 접속 1만 2천 명에도 중단이 없었고, 평균 응답 시간은 1.8초에서 0.6초로, 결제 실패 문의는 300여 건에서 4건으로 줄었습니다.