컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋 이상의 중앙처리장치 혹은 저장장치와 같은 컴퓨터 자원들에게 작업(Work), 즉, 부하(Load)를 나누는 것을 의미한다. 이로써 가용성 및 응답시간을 최적화시킬 수 있다.
=> "한 놈(한 서버)이 일을 다 처리하면 부담스러우니, 여러 놈(여러 서버)한테 일을 나누겠다!"
Global 외부 HTTP(s) 로드 밸런싱
Global
Cloud Run, App Engine, Cloud Functions 등 서버리스 백엔드 서비스 활용가능
여러 백엔드 서비스에 경로 지정이 가능함
*WebSocket 지원
내부 HTTP(s) 로드 밸런싱
HTTP 통신은 기본적으로 클라이언트 요청(request)이 있을때만 서버가 응답(response)하는 방식인 단방향 통신이기 때문에 HTTP로 Streaming 실시간 데이터 교환시 Header가 불필요하게 커지기 때문에 생겨난 웹버전 socket 프로토콜입니다.
웹 환경에서 연속된 데이터를 처리하기 위해 사용 (ex. 채팅, 주식)
특징
HTTP(Hyper Text Transfer Protocol)
서버 -> 브라우저로 전송 되는 정보가 암호화 되지 않음
-> 패킷 도난시 사용자 데이터를 도난 당할 수 있음.
HTTPS(Hyper Text Transfer Protocol Secure)
우선 HTTPs의 s는 Secure에 약자이고, HTTP 프로토콜에서 보안을 추가한 형태이며, TLS/SSL(보안 소켓 계층)을 사용하여 [서버 -> 브라우저]로 이동 할때 사용자의 정보를 암호화해서 보내게 됨으로써 혹시라도 데이터를 도난 당해도 제 3자가 정보를 볼 수 없도록함
SSL 이란 보안 소켓 계층으로 인터넷 상 데이터를 안전하게 전송하기 위한 인터넷 암호화 통신 프로토콜이며, L6 표현계층으로 어떤 계층의 데이터라도 암호화 가능하다.
SSL 어떻게 작동하는가?
대칭키와 공개키를 조합해서 쓰는 이유
GCP SSL 인증서 생성
구글이 직접 설치한 해저 네트워크망을 사용하기 때문에 타 벤더사와 다르게 서버로 들어오는 트래픽을 구글이 전 세계에 배포한 엣지 노드 중 가장 가까운 노드에 접속한 후, 구글의 광케이블 백본망으로 목표 서버로 전송한다. (글로벌 로드밸런싱을 지원)
타 벤더사 network edge service : AWS Global Accelerator
TCP | UDP | |
---|---|---|
연결방식 | 연결형 서비스 | 비연결형 서비스 |
패킷교환 | 가상 회선 방식 | 데이터그램 방식 |
전송 순서 보장 | 보장함 | 보장하지 않음 |
신뢰성 | 높음 | 낮음 |
전송 속도 | 느림 | 빠름 |
-> TCP는 handskake가 강제 되는 단점 때문에 온라인 게임같은 지연시간 없는 실시간 스트리밍이 필요한 경우에는 UDP를 사용
SSL proxy vs TCP proxy
기본적으로 구조는 동일하지만 SSL을 통해 암호화하느냐 마느냐로 갈린다.
Global L7 HTTP 로드 밸런서를 만들어보고 인스턴스 그룹별 path지정을 통해 클라우드 웹 서비스 구조파악과 백엔드 버킷 사용해보기.
추가적으로 gcloud 활용
gcloud config set compute/region asia-northeast3
gcloud config set compute/zone asia-northeast3-b
nginx.sh 생성
cat << EOF > nginx.sh
#! /bin/bash
apt-get update
apt-get install -y nginx
service nginx start
sed -i -- 's/nginx/Google Cloud Platform - '"\$HOSTNAME"'/'
/var/www/html/index.nginx-debian.html
EOF
nginx-template 생성
gcloud compute instance-templates create nginx-template \
--metadata-from-file startup-script=nginx.sh
apache2.sh 생성
cat << EOF > apache2.sh
#! /bin/bash
sudo apt-get update
sudo apt-get -y install apache2
sudo cat <<EOF > /var/www/html/login/index.html
<html><title>Login</title>
<body><p>Login</p>
<p>id</p>
<p>pw</p>
</body>
</html>
EOF
gcloud compute instance-groups managed create nginx-group
--base-instance-name nginx
--size 2
--template nginx-template
gcloud compute instance-groups managed create apache-group \
--base-instance-name apache \
--size 2 --template apache-template
port tcp 80 port 생성
gcloud compute firewall-rules create tcp-rule-80 --allow tcp:80
gcloud compute http-health-checks create http-check
gcloud compute http-health-checks create http-login-check \
--request-path=login
gcloud storage buckets create gs://cat-images-bucket
gsutil cp kitten.png gs://cat-image-bucket/images/
gcloud compute backend-buckets create bucket-backend \
--gcs-bucket-name=cat-images-bucket
backend service(nginx,apache) 생성
gcloud compute backend-services create nginx-backend \
--protocol HTTP --http-health-checks http-check --global
gcloud compute backend-services create apache-backend \
--protocol HTTP --http-health-checks http-login-check --global
backend service(nginx, apache) 인스턴스 그룹과 연결
gcloud compute backend-services add-backend nginx-backend \
--instance-group nginx-group \
--instance-group-zone asia-northeast3-b \
--global
gcloud compute backend-services add-backend apache-backend \
--instance-group nginx-group \
--instance-group-zone asia-northeast3-b \
--global
HTTP 로드밸랜서
gcloud compute url-maps create web-map \
--default-service nginx-backend
url map path role 추가
gcloud compute url-maps add-path-matcher web-map \
--path-matcher-name = path-matcher-2 \
--new-hosts=* \
--default-service = nginx-backend \
--backend-bucket-path-rules="/images/* = bucket-backend"
'''
HTTP target proxy 생성 (URL map에 proxy 연결)
gcloud compute target-http-proxies create http-lb-proxy --url-map web-map
Forwarding Rule 생성
gcloud compute forwarding-rules create http-content-rule \
--global \
--target-http-proxy http-lb-proxy \
--ports 80
backend Path 구분을 통한 routing
default (nginx)
/login/* (apache2)
/images/kitten.png (bucket-images)
url map에서 /path로 라우팅했을때 not found
백엔드 서비스로 주소 지정을 해주었음에도 url을 찾지 못해서 not found가 나옴
해결 방법
default로 정해진 /var/www/html에서 index.html을 찾지 못해서 Not Found가 나왔기 때문에 home 디렉토리를 생성하고 index.html file에 넣어주면 해결
backend bucket 권한 문제
해결방법
권한 문제가 발생하였고, 아래 명령어로 모든 유저가 오브젝트를 볼 수 있는 권한을 줘서 해결
gsutil iam ch allUsers:objectViewer gs://cat-images-bucket
처음에는 옵션이나 명령어 같은 부분을 하나 하나 찾아 써야해서 오히려 콘솔보다 느릴 수 도 있겠다 싶지만 2번 3번 이상이 된다면 오히려 콘솔에서 설정 부분(머신타입, 방화벽 등) 사소하게 놓칠 수 있지만 코드로 한다면 오히려 오류 없이 만들 수 있고 속도 면에서 장점있을거 같다 싶었습니다.
이번 기회에 로드밸런싱에 대해 다 알게 되었다고는 못하겠지만 로드밸런서 특징별 대체적으로 어떤 구조와 기능을 가지고 있는지 알게되는 시간이 됐고 다음 번에는 이걸 활용해서 다른 프로젝트에도 적용이 가능하지 않을까 생각합니다.