[Spring Cloud] 웹 서비스 확장 전략( DNS, 와일드 카드 인증서, Virtual IP, 읽기 요청 부하 분산)

WOOK JONG KIM·2022년 12월 11일
0

패캠_java&Spring

목록 보기
98/103
post-thumbnail

DNS

DNS(Domain Name System)는 인터넷에 연결된 컴퓨터들의 이름IP 주소를 매핑하는 시스템
-> DNS는 인터넷상의 컴퓨터들을 찾기 위한 전화번호부 역할

예를 들어, 사람들은 www.google.com이라는 간단한 문자열을 사용하여 Google의 웹사이트에 접속할 수 있음
-> 이 때, DNS는 컴퓨터가 실제로 접속할 수 있도록 www.google.com이라는 문자열을 이용해 Google의 서버의 IP 주소를 찾아주는 역할

DNS 설정 실습

sudo vim /etc/hosts

host 파일: 도메인네임과 이들의 IP주소를 하나하나 대응시켜서 저장해 놓은 텍스트 파일

host 파일 수정


DNS 매핑 시 웹 서버를 이용한 APi 서버 연동

Well-known Port
-> 특정한 쓰임새를 위해서 IANA에서 할당한 TCP 및 UDP 포트 번호의 일부
-> 이는 포트 번호를 따로 입력하지 않아도 사용 가능
-> root 권한을 가진 사용자만 실행 가능(기존에 사용된 8080포트를 80으로 변경할려는 경우)

▷ 0번 ~ 1023번 : 잘 알려진 포트 ( well-known port )
▷ 1024번 ~ 49151번 : 등록된 포트 ( registered port )
▷ 49152번 ~ 65535번 : 동적 포트 ( dynamic port )

통상적으로 client - web server - spring boot(api-server) 형태로 구성
-> web server 와 api server 권한이 서로 다름
-> 보안 이슈로 인해 물리적으로 같은 서버에 web server와 spring boot(or Tomcat)를 같이 설치하여 서비스하는 추세

web server는 80(Wellknown port)로 서비스 하고 뒤에 개발자가 만든 api(port : 8080)를 붙인 형태로 운영 함
-> api에 루트 권한을 주지 않아도 안정적으로 서비스 가능

HTTPS는 인증서를 구비해야 접근 가능

인증서

인터넷 접속 시 인증서는 웹 서버의 신뢰성을 확인하는 역할

웹 서버는 사용자의 요청을 처리하기 전에 인증서를 제공하며, 이 인증서는 웹 서버가 신뢰할 수 있는 인증기관에서 발급받은 것이여야 함
-> 사용자는 인증서를 보고 웹 서버가 신뢰할 수 있는 인증기관에서 발급받은 것인지를 확인할 수 있음

와일드카드 인증서

와일드카드 인증서는 웹 서버용 인증서의 한 종류로, 도메인 이름에 와일드카드 문자(*)를 사용하는 경우에 적용 가능
-> 와일드카드 인증서는 하나의 인증서로 여러 개의 서브도메인을 인증할 수 있도록 해줌

예를 들어, 와일드카드 인증서를 사용하면 다음과 같은 서브도메인을 모두 인증할 수 있다

.example.com
.blog.example.com
*.store.example.com

위의 서브도메인들은 모두 example.com의 서브도메인이며, 와일드카드 인증서를 사용하면 하나의 인증서로 모두 인증할 수 있다
-> 보안 관리 간단


Virtual IP와 DNS

Virtual IP는 가상의 IP 주소
-> 일반적으로 컴퓨터는 네트워크에 연결되면 고유한 IP 주소를 가지게 되는데, 이를 Physical IP함. 반면 Virtual IP는 컴퓨터에 연결된 네트워크 장비에 의해 관리되는 가상의 IP 주소

Virtual IP는 대기 중인 서버를 운영하는데 주로 사용
-> 서버의 서비스 중단을 방지하기 위해 대기 중인 서버가 정상 작동하는 것처럼 가상의 IP 주소를 가지게 하고, 실제 서버가 장애가 발생하면 가상의 IP 주소를 실제 서버에 할당하여 서비스를 이어서 제공 할 수 있다

블루그린 배포를 할때 사용자가 볼 때는 서버가 중단된 적이 한번이 없던 것 처럼 할려면 네트워크 장비의 도움이 필요
-> 이때 사용하는 것이 VIP임(이와 네트워크 장비를 매핑해줌 ex: 위 처럼 스위치)

API 서버는 API(서로 다른 소프트웨어 시스템 간에 서비스를 제공하고 소통할 수 있도록 정의된 인터페이스)를 제공하기 위해 운영되는 서버
-> ex) 모바일 앱이 웹 서비스를 사용하기 위해서는 웹 서비스의 API를 통해 접근해야 함


읽기 요청 부하 분산

spring cloud 사용하는 핵심적인 이유는 트래픽을 분산 처리해서 효율,안정적으로 서비스를 운영하기 위함

ex) 스케일 아웃을 통해 여러 대의 서버가 균등하게 트래픽을 나눠 받게 네트워크 장비를 세팅, DNS 세팅, VIP 세팅

일반적으로 요청은 읽기 요청, 쓰기 요청으로 나뉨

데이터가 DB에 저장되어 있기에, DB가 일을 처리할 수 없으면 데이터 보낼 수 없음

최초 요청 시 api server가 db 서버에 sql 질의를 통해 데이터를 받아 json 형태로 바꿔 전달

만약 같은 요청이 또 온다면(ex: 인기 게시물 목록의 첫번째 게시물 안 이미지 보여주기 -> 많은 사람들이 요청)api server 내 캐시(키:값 형태 -> HotPost : 1st)를 정의 및 이용하여 DB까지 가지 않더라도 응답을 보냄
-> 단일 서버에 부하 줄이는 가장 간단한 방법

api server마다 각각의 local cache를 가진 경우

이렇게 여러 개의 서버가 요청을 나눠 가질려면 네트워크 장비(L7스위치의 로드 밸런싱)를 이용
-> 중간에 데이터가 변경된다면, 캐시 내용과 실제 변경된 데이터 내용이 일치하지 않아 문제가 생길 수 있음
-> 이를 해결하기 위해서는 Cache server를 둬야 함

서버가 여러대인 경우에는 데이터의 정합성을 보장할 수 없음
-> 캐시 서버를 두고 여기다 저장

캐시 서버를 따로 두고 캐시 업데이트를 한다면 api server 마다 데이터가 다를 일이 없음
-> 로컬 캐시는 보통 static resource 처리를 위해 사용하고, 대부분은 캐시 서버를 두고 처리

또 고려해야 할 것이, 많은 요청을 처리하기 위해 Api server를 여러대 두었는데 아무리 Cache server를 사용하더라도 db server(한 대)는 한계가 있음

db server를 여러대 두는 것도 고려 해봐야 함(이는 다음 포스팅 내용)

profile
Journey for Backend Developer

0개의 댓글