일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 포트앤어댑터 아키텍처
- 위상정렬
- pandas
- 문자열
- DP
- 비트마스크
- 백준
- 스프링
- series
- disjoint set
- spring security
- 데이터 flow
- ddd
- 헥사고날 아키텍처
- BFS
- JPA
- UML
- 자바
- equals
- 다익스트라
- 파이썬
- java
- 이펙티브 자바
- docker
- 알고리즘
- springboot
- 세그먼트 트리
- dfs
- Redis
- dataframe
- Today
- Total
코딩못하는사람
nginx로 로드밸런싱 해보기 본문
1.문제점
AWS 프리티어 EC2는 정말 고마운 서비스이기도 하지만, 무료이니 만큼 성능이 나오지 않는다.
프로젝트 jar 파일 빌드할때마다 서버가 다운되는 경우가 많았고 Docker가 Out-Of-Memory 되는 경우가 많았다.
그렇게 인스턴스를 재부팅할때마다 너무 화가나서 말로만 들었던 scale out을 해보기로 결심했다.
이 프리티어 서비스를 최대한 활용하기 위해 서비스를 세분화하고 여러개의 프리티어 인스턴스에 나누어 올리고 nginx의 로드밸런싱 기능을 통해 부하를 나누는 분산 아키텍쳐를 생각하게 되었다.
2. 아키텍쳐 구상
프로젝트의 첫 아키텍쳐는 nginx의 리버스 프록시 기능을 사용해 nginx가 각각의 request를 받아 각각의 포트로 프록시 해주는 방식으로 구성했다.( nginx안의 화살표는 이해의 편의를 위함이고 서로를 모른다)
첫 아키텍쳐에서 분산 아키텍쳐를 구현하기 위해 서비스를 세분화하고 최대한 각각 다른 서버에 분배했다.
화상회의 서버인 openVidu서버는 새로운 인스턴스에 올리고,SpringBoot는 Docker 이미지로 만들어서 DockerHub를 통해 새로운 인스턴스에서 추가로 배포하고자 했다.
3.서버 scale out 및 nginx 설정 과정
1.우선 새로운 프리티어 EC2를 발급받고 도메인을 탄력적 IP에 도메인을 발급받는다.(https간의 CORS라서 도메인이 필요함)
2.내 스프링 서버를 다른 EC2에 간편하게 옮기기위해 도커파일로 만들어서 이미지화 했다.
3.Dockerfile을 작성하고 빌드하여 내 jar파일의 이미지를 만들었다.
그 후 이미지 명명규칙에 따라 이미지 이름을 변경하고 DockerHub에 푸시했다.
이제 새로만든 EC2에 도커를 설치한 후 nginx를 letsencrypt로 ssl설정을 해주고 올린 이미지를 다운받아 아키텍쳐 2번그림의 서버를 완성시켰다.
오픈비두서버는 화상회의 서버만 가지게 세분화 하였고 DB는 AWS RDS라서 모두의 엔드포인트가 같아서 같이 배포할
필요가 없이 RDS의 보안그룹만 수정해주었다.
이제 1번서버에서 로드벨런싱 설정을 해주면 된다.
기존 아키텍쳐에서 사용하던 /etc/nginx/conf.d의 conf.d파일을 수정해보자
기존에는 /api 요청이 오면 localhost인 127.0.0.1:8080포트로 프록시해주는 설정이였다
여기서 nginx의 로드밸런싱 기능을 써보자.
conf.d파일에서 upstream을 생성하여 부하를 나눌 ip의 리스트를 작성하자
1번서버 기존의 8080포트와 도커로 배포한 2번서버의 ip와 톰캣이 열려있는 8081포트를 적어주자
이제 api요청에 127.0.0.1을 쓰던것을 upstream의 이름인 load로 변경해주면 로드밸런싱 설정이 완료된다.
로드밸런싱에도 여러가지 설정이 있다.
순서대로 요청을 돌아가며 처리해주는 라운드로빈 방식
서버마다 가중치를 주고 가중치가 높은곳 부터 부하를 보내는 가중치 라운드 로빈 방식
클라이언트의 ip를 해싱해서 분배하는 IP 해시방식 등등 여러가지 방식이 있지만 다른 설정이 없다면 라운드 로빈 방식을 채택한다.
로드 밸런싱 확인
내 정보를 불러오는 api를 postman을 통해 여러번 호출해봤다.
request를 서로의 서버에서 돌아가며 처리하는 모습에 감동을 해버렸다.
배운점 및 나아갈점
- upstream에 수평적으로 증설할 서버의 ip만 적어주고 docker로 배포한다면 원하는 만큼 분산 아키텍쳐를 구현할 수 있다.
- 여러가지 로드밸런싱 알고리즘 중에서 가중치 라운드 로빈 방식을 사용해보고 싶다.
- 인턴때 배웠던 jmeter를 활용해서 서버 성능의 차이를 테스트해봐야겠다.
'C.S 지식정리' 카테고리의 다른 글
헥사고날 아키텍처란 (0) | 2023.02.13 |
---|---|
NoSQL이란 (0) | 2021.12.22 |
Redis란? (우아한 Redis 강연) (0) | 2021.07.31 |
유스케이스 다이어그램 (2) | 2021.04.29 |
[UML] 클래스 다이어그램 (0) | 2021.04.29 |