포스트

2021-03-04-TIL

서버 구성을 한 대에서 시작해 몇 대로 늘려 가는지 수업에서 들은 내용을 정리했다.

서버는 어떻게 생겼는가?


SPA 아키텍처

User -> [Web Server -> WAS(Application Server) -> DB]

(Web Server: Apache, WAS: Tomcat)

  • 정적인 컨텐츠 : HTML, CSS, JS, img, media -> Apache가 빠르다, 보안에 유리, 요새는 nginx를 사용(비동기 이벤트 기반), apache는 멀티스레드 기반, 트래픽 조절, 보안 역할
  • 동적인 컨텐츠 : 글쓰기 등
  • DB : 스프링 기본 H2, MySQL, Firebase

성능의 지표 : performance throughput 단위 시간당 동시 접속자 수

nginx의 구조는 AOSA(The Architecture of Open Source Applications) 2권의 nginx 장에서 확인했다. nginx는 동시 연결 1만 개를 다루는 C10K 문제를 풀기 위해 만들어졌고, 이벤트 기반이라 연결마다 프로세스나 스레드를 새로 띄우는 Apache 방식을 따르지 않는다. 대신 리눅스의 epoll, BSD의 kqueue 같은 운영체제의 이벤트 통지 메커니즘을 사용한다.


서버 2대

User -> [Web Server + WAS] -> DB


서버 3대

User -> Web Server + WAS -> DB1 -> DB2

Master - Slave (x) Primary - Secondary (o)

동기화 복제, 실시간성이 높은 DB를 추가로 둔다.


서버 4대 - 1: 배스천 서버

개발자는 ssh로 붙어서 관리, 배스천 서버를 따로 두어서 거기에 접속해서 나머지 서버에 접근한다.

web을 배스천으로 사용, 터널링을 통해서 여러 개를 거쳐서 가지만 바로 접근하는 것처럼 사용 가능

배스천 호스트(bastion host)는 공격을 견디도록 특별히 구성한 네트워크상의 컴퓨터로, 성채의 능보(bastion)에서 이름을 따왔다. 보통 하나의 애플리케이션이나 프로세스만 올리고 나머지 서비스는 제거하거나 제한한다.


서버 4대 - 2: 로드밸런서와 DB 분산

Web Was -> Web Was -> DB1 DB2 이 중간에 로드밸런서가 트래픽을 분산시켜준다.

cf) 쿠버네티스와는 관계가 없다. 이런 걸 통째로 관리해주는 개념

관계형 DB는 수평확장이 안 되어서 분산이 안 된다.

sol1) DB 파티셔닝 샤딩 -> 어렵다

sol2) Read Replica sync 비용이 커서 많아봐야 10대 정도

DB1은 읽기 전용으로 사용한다. (대부분은 읽기가 많다) DB2는 저장용

AWS RDS 문서는 읽기 전용 복제본(read replica)을 DB 인스턴스의 읽기 전용 사본으로 설명한다. 애플리케이션의 읽기 쿼리를 복제본으로 보내 기본 인스턴스의 부하를 줄이고, 읽기가 많은 워크로드에서 단일 인스턴스의 한계를 넘어 확장할 수 있다. 기본 인스턴스의 변경은 복제본에 비동기로 복사된다.


세션과 WAS 분산

L7에서 요청을 읽어서

관리해주는 것 자체가 어렵다

WAS가 여러 개로 분산되면 미디어 서버가 반드시 필요하다

1) sticky session 로드밸런싱이 잘 안된다는 문제가 있다. -> 세션 db에서 세션 클러스터링을 사용 (Redis 많이 씀)


VPC

VPC

AWS 문서에 따르면 Amazon VPC는 사용자가 정의한, 논리적으로 격리된 가상 네트워크에 AWS 리소스를 띄우는 서비스다. 자체 데이터센터에서 운영하던 전통적인 네트워크와 비슷한 구조이고, VPC를 만든 뒤 서브넷을 추가한다.


코드 리뷰: Mission1 (by Shion)

[August]

  • UserController에 @RequestMapping 사용하는 것도 좋을 것 같습니다.
  • @PostMapping url에 카멜 케이스 적용이 필요한지, 대소문자 구분을 하는지
  • IndexController가 추후에도 index만 관리하는지
  • templates/component 네이밍이 적절한지 궁금합니다.
  • /user 를 사용하는데 /users를 Mapping으로 받아주는게 view를 분리한다는 의미가 더 강한 것 같다. 헷갈림의 방지도 되고.

Question에 생성자 없이도 Setter를 사용하여 값을 셋팅해준다.

[K]

  • IndexController static 변수를 사용하는데, Question 컨트롤러가 저 기능을 담당하게 되면 static을 사용할 필요가 없게된다.
  • UserController의 getProfile 메서드는 User의 getter를 사용하는데, 이렇게 하지말고 User의 매칭하는 메서드를 호출하는 식으로 변경 -> 클래스 내부자원에 직접 접근하는 것 보다는 메서드를 호출하여 처리하는 것이 바람직하다.

[Kyu]

  • GetMapping의 경로가 실제 리소스에 맵핑되는 것인가? -> ok
  • 수업 때 html을 자동으로 뭐 해준다는게 무엇? -> 기본 틀에 해당하는 html구조는 그대로 둔 채로 일부 데이터만 받아서 처리하는 동작을 한다. 그 데이터를 받아서 클라이언트 사이드에서 동적으로 렌더링 해준다. (AJAX)

[cooper]

  • 인덱스에서 회원가입 들어갔다가 다시 회원가입 누르면 users/users 두 번 떠서 문제가 되었는데 무엇?

[Sky]

  • updateForm.html에 readonly가 좋은 방법인 것 같다.
참고한 자료외부 출처 4

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다