1장에서는 1명의 사용자를 지원하는 시스템에서 최종적으로 몇 백만 사용자를 지원하는 시스템을 설계한다.
모든 컴포넌트가 단 한 대의 서버에서 실행되는 간단한 시스템으로 웹 앱, 데이터베이스, 개시 등이 전부 한 대의 서버에서 실행된다.
사용자 요청 처리 흐름
사용자가 늘어나면서 웹/모바일 트래픽 처리 용도와 데이터베이스 용도로 서버를 분리하면 각각을 독립적으로 확장해 갈 수 있다.
자료를 테이블과 열, 칼럼으로 표현하며, SQL을 사용하면 여러 테이블에 있는 데이터를 그 관계에 따라 조인(join)하여 합칠 수 있다.
일반적으로 비-관계형 데이터베이스는 조인(join) 연산은 지원하지 않는다.
NoSQL은 다시 네 부류로 나눌 수 있다.
< 비-관계형 데이터베이스를 선택하는 경우 >
웹 서버가 다운되어 사용자가 웹 사이트에 접속할 수 없거나,
너무 많은 사용자가 접속하여 웹 서버가 한계에 도달하게 외더 응답 속도가 느려지거나 서버 접속이 불가능 할 때.
이런 문제를 해결하는 데는 부하 분산기
또는 로드밸런서(load balancer)
를 도입하는 것이 최선이다.
부하 분산 집합(load balancing set)에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할을 한다.
< 로드 밸런서 동작 시나리오 >
사용자는 로드밸런서의 공개 IP 주소(public IP address)로 접속한다.
웹 서버는 클라이언트의 접속을 직접 처리하지 않게 되고, 보안을 위해서 서버 간 통신에는 사설 IP 주소(private IP address)가 이용된다. 부하 분산 집합에 서버를 2개 설치하게 되면, 장애를 자동 복구하지 못하는 문제(no failover)가 해소되며, 웹 계층의 가용성(availability)가 향상된다.
사설 IP 주소란?
같은 네트워크에 속한 서버 사이의 통신에만 쓰일 수 있는 IP주소로, 인터넷을 통해서는 접속할 수 없다. 로드밸런서는 웹 서버와 통신하기 위해서 사설 IP 주소를 이용한다.
보통 서버 사이에 주(Master)-부(Slave) 관계를 설정하고 데이터 원본은 주 서버에, 사본은 부 서버에 저장하는 방식이다.
쓰기 연산(Write operation)은 마스터에서만 지원하며 데이터베이스를 변경하는 명령어인 insert, delete, update 등은 마스터 디비로 전달되어야 한다. Slave DB는 Master DB로 부터 그 사본을 전달 받아 읽기 연산(Read operation)만을 지원한다.
읽기 연산의 비중이 쓰기 연산보다 훨씬 높다. 그래서 slave DB의 수가 master DB의 수보다 많다.
데이터베이스 다중화 이점