Open hubtwork opened 2 weeks ago
모든 컴포넌트(웹 앱, 데이터베이스, 캐시 등)가 단 한 대의 서버에서 실행되는 간단한 시스템
단일서버로 충분하지 않아 여러 서버를 두어야 할 때 웹/모바일 트래픽 처리 서버(웹 계층)와 데이터베이스 서버(데이터 계층)로 분리
관계형 데이터베이스(Relational Database 또는 Relational Database Management System, RDBMS)
비 관계형 데이터베이스(NoSQL)
부하 분산 집합(load balancing set)에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할
사용자는 공개 IP 주소(Public IP)로 접속하고 로드밸런서는 사설 IP 주소(Private IP)로 웹 서버와 통신
라운드 로빈 방식 (Round Robin Method)
가중 라운드로빈 방식 (Weighted Round Robin Method)
IP 해시 방식 (IP Hash Method)
클라이언트의 IP 주소를 특정 서버로 매핑하여 요청을 처리하는 방식
사용자의 IP를 *해싱(Hashing)하여 부하를 분산하기 때문에 사용자가 항상 동일한 서버로 연결되는 것을 보장
경로가 보장되며, 접속자 수가 많을수록 분산 및 효율이 뛰어남
해싱(Hasing) : 임의의 길이를 지닌 데이터를 고정된 길이의 데이터로 매핑하는 것, 또는 그러한 함수
최소 연결 방식 (Least Connection Method)
최소 응답시간 방식 (Least Response Time Method)
대역폭 방식 (Bandwidth Method)
데이터베이스 서버 사이에 주(master) - 부(slave) 관계를 설정하고 데이터 원본은 주 서버에, 사본은 부 서버에 저장하는 방식
쓰기 연산(write operation)은 주 서버에서만 지원하고 부 서버에서는 읽기 연산(read operation)만을 지원
값비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고, 뒤이은 요청이 보다 빨리 처리될 수 있도록 하는 저장소
데이터가 잠시 보관되는 곳으로 데이터베이스보다 훨씬 빨라서 성능이 개선될 뿐 아니라 데이터베이스의 부하를 줄일 수 있고 캐시 계층의 규모를 확장시키는 것도 가능하다.
웹 서버는 캐시에 응답이 저장되어 있는지를 물어보고 저장되어 있다면 캐시에서 데이터를 클라이언트에 반한화고 없다면 데이터베이스 질의를 통해 데이터를 찾아 캐시에 저장한 뒤 클라이언트에 반환하는데, 이러한 전략을 캐시 우선 읽기 전략(read-through caching strategy)이라 한다.
정적 콘텐츠를 전송하는 데 쓰이는, 지리적으로 분산된 서버의 네트워크로 이미지, 비디오, CSS, JavaScript 파일 등을 캐시할 수 있다.
사용자가 웹사이트를 방문하면, 그 사용자에게 가장 가까운 CDN 서버가 정적 콘텐츠를 전달하게 되며 사용자가 CDN 서버로부터 멀면 멀수록 웹사이트는 천천히 로드
상태 정보를 보관하는 서버는 클라이언트 정보, 즉 상태를 유지하여 요청들 사이에 공유되도록 하는데 무상태 서버에는 이런 장치가 없다.
클라이언트로부터의 요청이 항상 같은 서버로 전송되도록 하기 위해 로드밸런서에서는 고정 세선(sticky-session) 기능을 제공하고 있는데, 이는 로드밸런서에 부담이며 로드밸런서 뒷단에 서버를 추가하거나 제거하기도 어려워 서버 장애 처리에 어려움
웹 서버는 상태 정보가 필요할 경우 공유 저장소(shared storage)로부터 데이터를 가져오는데 상태 정보는 웹 서버로부터 물리적으로 분리되어 있어 구조적으로 단순하고 안정적이며, 규모 확장이 쉽다.
지리적 라우팅(geoDNS-routing 또는 geo-routing): 장애가 없는 상황에서 사용자는 가장 가까운 데이터 센터로 안내되는 절차
다중 데이터센터 아키텍처를 만들기 위한 기술적 난제
메시지의 무손실(durability, 즉 메시지 큐에 일단 보관된 메시지는 소비자가 꺼낼 때까지 안전히 보관된다는 특성)을 보장하는 비동기 통신을 지원하는 컴포넌트로 메시지의 버퍼 역할을 하며 비동기적으로 전송한다.
메시지 큐의 기본 아키텍처
메시지 큐의 장점
기존 서버에 고성능의 자원(CPU, RAM, 디스크 등)을 증성하는 방법
데이터베이스의 수평적 확장은 샤딩(sharding)이라고도 불리는데 더 많은 서버를 추가함으로써 성능 향상
샤딩은 대규모 데이터베이스를 샤드(shard)라고 부르는 작은 단위로 분할하는 기술을 일컫는데 모든 샤드는 같은 스키마를 쓰지만 샤드에 보관되는 데이터 사이에는 중복이 없다.
샤딩 키(sharding key)
시스템의 규모를 확장하는 것은 지속적이고 반복적(iterative)인 과정
초기 서비스를 만들어보고, 서비스가 확장해가는 과정에서 고민했던 내용들이어서 흥미로웠다. 앞으로 이 내용들을 더 자세하고 구체적으로 공부할 생각에 싱낭다
기본적인 Infra 의 구조 및 스케일링에 대한 이해도를 쌓기에 좋은 챕터 👍 근데 왜 DB 는 AZ 를 나눠놓고, NoSQL 은 AZ 를 안 나누는지? 서로 다른 AZ 의 DB 간의 동기화 등에 대해서는 좀 설명 없이 그냥 이렇게 하면됩니다~ 식으로 정리되어 있던 부분이 좀 아쉽다 🤣
기초를 다진 다는 생각으로 천천히 읽었다. 전반적으로 한번씩 이야기 해주어서 좋긴 했다. 내용을 아는 사람들은 한번씩 다시 본다라는 느낌으로 봤을 거 같은데 아무것도 모르는 사람이 보기에는 조금은 불친절한 책 같았다.
한줄 요약 : 시스템 디자인 Overview 잘 봤다
단계적으로 반복적으로 시스템을 확장해 나가는 방법을 어렵지 않게 설명해주어서 좋았다. 아직 1장이라 그런지 각 부분에 대한 디테일이 기대된다.
시스템 구조를 한 눈에 볼 수 있어서 좋았다. 역시 그림이 있어야 읽기 쉬운 것 같다. 흠 내용 중에 샤딩에서 키가 중요하다고 하고 키 생성에 mod 방식만 나왔는데, 이거처럼 전체적으로 설명이 얕은 감 있었다. 하지만 키워드들이 머리속에 남기도 하고 찾아보기 좋은 것 같다. 기대된다.
Chapter Ownership : @zinokim