8.2 관계형 데이터베이스에서 확장성
이번에는 다른 상황도 생각해 봅시다. 여러분이 만든 게임 서비스를 이용하는 유저가 어마어마하게 많다고 가정합시다. 게임 서버 한 대로는 이 어마어마한 사용량을 감당할 수 없습니다. 이를 해결하고자 여러분 게임 서버는 하드웨어 여러 대로 구성됩니다.
각 게임 서버는 플레이어 정보를 담고 있는 데이터베이스에 액세스합니다. 그런데 게임 서버도 엄청나게 많습니다. 그러다 보니 데이터베이스 액세스를 하는 양도 엄청나게 많아집니다. 이 문제도 해결해야 합니다. 그래서 우리는 플레이어 정보를 데이터베이스 여러 대에 나누어서 저장합니다.
플레이어 정보가 테이블 여러 개로 구성되어 있으면 생각하기가 쉽습니다. 여러 테이블을 각각 여러 데이터베이스 컴퓨터에 나누면 됩니다. 이를 데이터베이스의 수직(vertical) 분산이라고 합니다.
그러나 여러분이 정의한 테이블 개수는 제한적입니다. 예를 들어 테이블 개수가 10개인 상황에서는 충분한 수의 플레이어를 처리하는 데 필요한 데이터베이스 컴퓨터 대수가 100대라고 합시다. 총 테이블 개수가 10개뿐인데 데이터베이스 컴퓨터 100대에 나눌 수는 없겠지요.
데이터베이스의 수직 분산은 한계가 있습니다. 여러분이 가진 테이블 10개 중에서 정작 액세스되는 테이블이 하나뿐이라면 어떻게 해야 할까요? 이때는 데이터베이스를 수평(horizontal) 분산하는 것이 좋습니다. 예를 들어 여러분 테이블 하나가 레코드를 1억 개 가졌다고 가정합시다. 데이터베이스 컴퓨터가 100대 주어졌다면, 각 컴퓨터에 데이터베이스를 설치하고 1억을 100으로 나눈 수인 100만 개씩 레코드를 분배해야 합니다. 이렇게 수평으로 분산된 데이터베이스에서는 각 컴퓨터가 큰 테이블 1개를 조각조각 가진 셈입니다. 이를 샤드(shard, 조각)라고 합니다.