웹 서비스 확장 전략
웹 서비스 확장 전략
HA (고가용성) / Resilience (회복 탄력성)
웹 서비스 확장 전략
- 실무 개발 유형
- 솔루션 개발 (B2B) / SI 개발 / 서비스 개발 (B2C) (고가용성)
스케일업을 통한 서비스 확장
Scale Up (스케일 업)
기존 서버의 사양을 업그레이드해 시스템을 확장하는 것
CPU나 RAM 등을 추가하거나 부품, 서버로 교환하는 방법
Scale Out (스케일 아웃)
서버 여러대를 추가하여 시스템을 확장하는 것
여러대로 나눠지기 때문에 각 서버에 걸리는 부하를 균등하게 해주는 로드밸런싱이 필수적으로 동반되어야 함
블루그린 배포
블루를 구버전, 그린을 신버전으로 지칭하여 붙여진 이름으로 운영 환경에 구버전과 동일하게 신버전의 인스턴스를 구성한 후, 로드밸런서를 통해 신버전으로 모든 트래픽을 전환하는 배포 방식
구버전과 동일한 운영 환경으로 신버전의 인스턴스를 구성하기 때문에 실제 서비스 환경에서 신버전을 미리 테스트 할 수 있는 장점이 있고, 빠른 롤백 가능
배포가 완료된 후 남아 있는 기존 버전의 환경을 다음 배포에 재사용할 수 있음
하지만 블루-그린 배포를 위해서는 시스템 자원이 두 배로 필요하며 새로운 환경에 대한 테스트가 전제되어야 함
서버 부하 분산을 위한 네트워크
서버: 무언가를 제공하는 대상 혹은 그 주체
부하: Load -> 로드가 많이 걸리네요
분산: 갈라져 흩어짐, 또는 그렇게 되게 함
네트워크: 통신설비를 갖춘 컴퓨터를 이용해 서로 연결시켜주는 조직이나 체계, 긴밀하게 연결되어 효율적으로 움직일 수 있는 체계
DNS 구성 및 활용
DNS 설정 실습 시나리오
- Spring starter 프로젝트 생성
- /hello 호출하면 long time no see 응답하는 서버 개발
- 세팅된 도메인으로 /hello 호출하여 응답 확인
DNS 매핑 시 웹서버를 이용한 API 서버 연동
WellKnown port와 권한
Internet Assigned Numbers Authority, IANA
WellKnown port list
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
- nginx를 이용한 아파치 리버스 프록시 설정
- 웹서버에 DNS 이름을 설정해 두고
- 웹 서버와 API 연결해 웹 서버에서 DNS 이름을 받으면
- 요청을 API 서버까지 전달하는 형태
DNS 와 HTTPS
- HTTPS 설정 시 유의사항 및 인증서
- Wild 카드 인증서 *.도메인.com
- test.feed.mysweethome.com (X)
- test-feed.mysweethome.com (O)
Virtual IP 와 DNS
- VIP: Virtual IP
읽기 요청 부하 분산
최초 요청 no hit
두번째 동일한 요청 hit
랜덤하게 요청이 왔을 때 각각 저장
- 캐시된 데이터와 변경 데이터 동기화 불가능
- 캐시도 별도 서버로 둠
클러스터링과 레플리카
데이터베이스를 어떻게 확장할 수 있을까?
- 서버 1대 더 증설
클러스터링
- 단일 데이터베이스를 연결하는 둘 이상의 서버 또는 인스턴스를 결합하는 프로세스
- 여러 개의 DB를 '수평적인 구조'로 구축하는 방식
- 두대를 동시 투입
- 동시에 트래픽을 같이 받고 하위의 데이터베이스 서버에게 알림
레플리카
- 여러 개의 DB를 권한에 따라 '수직적인 구조(Master-Slave)'로 구축하는 방식
- Master node는 쓰기(Write/Update/Delete) 작업 처리, 읽기 작업은 Slave node에서 처리
샤딩
- 대규모 분산 데이터베이스 시스템에서 데이터를 수평으로 분할하여 여러 서버에 분산 저장하는 기술
- 샤딩 키는 데이터를 분할하고 분산 저장하는 기준, 샤딩의 성능과 효율성을 결정짓는 중요한 요소
- https://engineering.linecorp.com/ko/blog/line-manga-database
- 이미지 테이블의 이미지 키를 기준으로 함
- 이미지 키 값을 가지고 5개의 서버를 연산해 맞는걸 찾아서 넣는 방법
- 통계 이력처럼 사용하는 테이블이라면
- 날짜를 기준으로 월별, 연도별로 분할
쓰기 요청 분산
- HTTP 요청으로 나눠서 보냈을 경우
- 계속 API 서버가 대응하느라 나머지 쓰기 요청이나, 조회 요청에 대해 제대로 처리 할 수 없음
- 첫번째 방법으로 유형에 따라 나눔
스프링 어플리케이션 이벤트 실습
로컬 캐시처럼 어플리케이션 내부에서 이벤트 데이터 저장
분산환경에서 메시지 큐 활용
- Kafka, RebbitMQ
- 이벤트 객체들을 큐에 작성 → 일종의 데이터베이스로 따지면 테이블
- Broker: 중계 의미
- https://binux.tistory.com/74
feat. 패스트캠퍼스 - 한 번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online