규모의 확장성과 관계된 설계 문제를 푸는데 유용한 지식들을 정리한다.
또한 "가상면접사례" 가 제목에 포함된 만큼, 기초적인 지식들을 함께 정리하는 것을 목표로 한다.
(1) 브라우저가 설치된 컴퓨터는 opentutorials.org의 IP를 알아내기 위해서 가장 가까운 곳에 위치한 DNS에 opentutorials.org의 IP를 문의 한다.
(2)가장 가까운 DNS 서버가 IP를 알고 있다면 즉시 IP 주소를 알려준다. 하지만 IP 주소를 모르면 루트 도메인 네임서버에게 문의한다.
(3) 루트 네임서버는 도메인의 최상위 도메인이 .org인 것을 보고 .org가 등록된 네임서버의 IP를 전달한다. 이것은 이런 의미가 된다. "나는 IP 주소를 가지고 있지 않지만, .org 네임서버에게 물어보면 도와줄꺼야"
(4) 가장 가까운 DNS는 org 도메인을 관리하는 네임서버에게 문의한다.
(5) org 네임서버는 opentutorials의 네임서버 IP 주소를 알려준다.
(6) 가장 가까운 DNS 서버는 opentutorials의 네임서버에게 문의하고,
(7) www 의 네임서버를 알려준다.
(8) 최종적으로 www 네임서버에게 문의 후
(9) www.opentutorials.org의 IP 주소를 얻는다.
(10) 가장 가까운 DNS 서버는 이 IP 주소를 클라이언트에게 알려준다. 클라이언트 컴퓨터는 이 IP를 브라우저에게 알려주면 브라우저는 이 IP에 해당하는 컴퓨터에 접속 할 수 있게 된다.
web service architecture
일반적인 사용자 요청 처리 흐름은 아래와 같음
(1) DNS에 도메인 이름을 IP 주소로 변환하는 과정 진행
(2) 변환된 IP 주소로 HTTP 요청을 전달
(3) 요청받은 웨 서버는 정적 컨텐츠 또는 JSON을 전달함
웹사이트를 호스팅하는 제공업체가 호스팅됩니다. 이 사람들은 서버 공간을 임대하여 웹 사이트 또는 응용 프로그램을 호스팅하고 전 세계적으로 사용할 수 있도록 합니다. 웹 호스팅은 사람들이 웹 사이트, 웹 응용 프로그램, 백업 파일, 데이터베이스 등을 저장하는 장소입니다. 모든 물건을 보관하는 집이라고 생각하십시오. 웹 호스트에 컴퓨터 파일(HTML, 문서, 이미지, 비디오 등)을 저장합니다. 종종 "웹 호스팅"이라는 용어는 귀하의 웹사이트(따라서 호스트라는 단어)를 저장하기 위해 컴퓨터/서버를 임대하고 다른 컴퓨터가 귀하의 웹사이트에 있는 파일에 액세스할 수 있도록 인터넷 연결을 제공하는 회사를 의미합니다.
도메인 이름은 웹사이트 이름입니다. 도메인 이름은 인터넷 사용자가 웹사이트에 액세스할 수 있는 주소입니다. 도메인 이름은 인터넷에서 컴퓨터를 찾고 식별하는 데 사용됩니다. 컴퓨터는 일련의 숫자인 IP 주소를 사용합니다. 그러나 인간이 일련의 숫자를 기억하는 것은 어렵습니다. 이 때문에 IP 주소를 사용하는 대신 인터넷에서 개체를 식별하기 위해 도메인 이름이 개발되고 사용되었습니다.
- MySQL , Oracle , MsSQL , PostgreSQL ...
- 자료를 테이블과 열, 칼럼으로 표현하고, 각 테이블간의 관계에 집중하여 스키마를 설계
- Join 을 통해서 각 테이블간의 정의된 관계를 활용하여 클라이언트에 정보를 제공할 수 있음
- ACID
- Mongo DB, CouchDB, Neo4j, Cassandra , HBase , Amazon DynamoDB ...
- 키-값 저장소, 그래프 저장소, 칼럼 저장소, 문서 저장소 등으로 나눠 질 수 있음
- 관계형데이터베이스가 아닌 Remainder라고 생각하면 됨
- BASE
- 아주 낮은 응답 지연시간(latency)이 요구되는 경우
- 다루는 데이터가 비정형이라 관계형 데이터가 아닌 경우
- 데이터(JSON, YAML, XML..) 을 직렬화(serialize) 역직렬화(deserialize) 하는 경우
- 대용량의 데이터가 저장할 필요가 있는 경우
- scale up 이라고도 함
- 서버를 더 좋은 사양으로 바꾸는 것(CPU, RAM, Memory..)
- scale out 이라고도 함
- 서버의 개수를 늘리는 것
scale up
을 고려하는 것이 좋고, 반대의 경우에는 scale out
을 고려해본다Q : 데이터베이스 서버 한개가 다운 되면 어떻게 될까?
A1 : 부 서버가 다운된다면, 읽기연산은 한시적으로 모두 주 데이터베이스로 전달되고 즉시 새로운 부 데이터베이스 서버가 생성될 것 + 부 서버가 여러대인 경우 곧바로 새로 생성될 것이라 문제가 없을것으로 보임
A2 : 주 데이터베이스 서버가 다운되는 경우에 한 개의 부 데이터 서버가 있다면, 역할을 주 데이터베이스로 변경할 것이고 새로운 부 데이터베이스 서버가 수행될 것임
A3 : 프로덕션 환경에서는 부 서버에 보관된 데이터베이스가 최신이 아닐경우 문제가 생길 수 있음, 이 경우에는 recovery script를 추가해야함. 다중 마스터나 원형 다중화 방식을 도입하면 될 수 있음
(1) Master 노드에 쓰기 트랜잭션이 수행된다.
(2) Master 노드는 데이터를 저장하고 트랜잭션에 대한 로그를 파일에 기록한다.(BIN LOG)
(3) Slave 노드의 IO Thread는 Master 노드의 로그 파일(BIN LOG)를 파일(Replay Log)에 복사한다.
(4) Slave 노드의 SQL Thread는 파일(Replay Log)를 한 줄씩 읽으며 데이터를 저장한다.
(5) 리플리케이션은 Master와 Slave간의 데이터 무결성 검사(데이터가 일치하는지)를 하지 않는 비동기방식으로 데이터를 동기화한다.
DB 요청의 60~80% 정도가 읽기 작업이기 때문에 Replication만으로도 충분히 성능을 높일 수 있다.
비동기 방식으로 운영되어 지연 시간이 거의 없다.
노드들 간의 데이터 동기화가 보장되지 않아 일관성있는 데이터를 얻지 못할 수 있다.
Master 노드가 다운되면 복구 및 대처가 까다롭다.
(1) 1개의 노드에 쓰기 트랜잭션이 수행되고, COMMIT을 실행한다.
(2) 실제 디스크에 내용을 쓰기 전에 다른 노드로 데이터의 복제를 요청한다.
(3) 다른 노드에서 복제 요청을 수락했다는 신호(OK)를 보내고, 디스크에 쓰기를 시작한다.
(4) 다른 노드로부터 신호(OK)를 받으면 실제 디스크에 데이터를 저장한다.
노드들 간의 데이터를 동기화하여 항상 일관성있는 데이터를 얻을 수 있다.
1개의 노드가 죽어도 다른 노드가 살아 있어 시스템을 계속 장애없이 운영할 수 있다.
여러 노드들 간의 데이터를 동기화하는 시간이 필요하므로 Replication에 비해 쓰기 성능이 떨어진다.
장애가 전파된 경우 처리가 까다로우며, 데이터 동기화에 의해 스케일링에 한계가 있다.
read-through caching strategy
라고 함(1) 데이터가 캐시에 있으면 캐시에서 데이터를 리턴
(2) 데이터가 캐시에 없으면 DB에 요청
(3) (1) 또는 (2) 의 결과를 클라이언트에 전달
SPOF
를 일으킬 수 있기 때문에 단일화 캐시 서버를 두는 것은 위험js
, css
, html
, jpg
등..(1) URL을 통해서 컨텐츠 접근을 수행, CDN 서비스 사업자가 도메인을 제공
(2) 서버에 캐시된 이미지가 없는 경우, 원본 서버에 요청하여 파일을 가져와서 전달 및 캐싱
(3) 응답의 HTTP 헤더에는 해당 파일이 얼마나 캐시 될 수 있는지Time To Live
를 설정(원본서버에서 캐시서버에게 컨텐츠를 넘겨줄때)
무상태(stateless)
라고 부름서버는 클라이언트가 요청한 정보에 응답하기 위해서 DB Server 로 부터 데이터를 가져옴
일반적인 웹 서버 계층
(1) 트래픽 우회 : 올바른 데이터 센터로 트래픽을 보내는 효과적인 방법
(2) 데이터 동기화
(3) 테스트와 배포를 통한 데이터 정합성 검증
(1) 호스트 단위 메트릭 : 시스템 자원을 관리
(2) 종합 메트릭 : 데이터 베이스 계층의 성능이나 캐시 계층의 성능을 관리
(3) 비즈니스 메트릭 : 일별 사용자나 방문자, 재방문 정도를 확인할 수 있음
SPOF
를 고려해야함샤딩
이라고 부름샤드
라고 부르는 작은 단위로 분할하는 기술을 말함
- Resharding : 데이터베이스가 많아지거나, 공간 소모가 빨라지는 경우 해싱 기법을 통해서 다시 샤딩하는 것
- celebrity 문제
- 조인과 비정규화 : 샤드가 너무 많아질 경우 조인하기 힘들어질 수 있음