1. 데이터베이스의 규모 확장
저장할 데이터가 많아지면 데이터베이스에 대한 부하도 증가함.
그때가 오면 데이터베이스를 증성할 방법을 찾아야 함.
데이터베이스의 규모를 확장하는 데는 두 가지 접근법이 있음.
하나는 수직적 규모 확장법이고 다른 하나는 수평적 규모 확장법임.
1-1) 수직적 확장
스케일 업이라고도 부르는 수직적 규모 확장법은 기존 서버에 더 많은 또는
고성능의 자원(CPU, RAM, 디스크 등)을 증설하는 방법임.
가령 아마존 AWS의 RDS는 24TB RAM을 갖춘 서버도 상품으로 제공하고 있음.
이 정도 수준의 고성능 데이터베이스 서버는 많은 양의 데이터를 보관하고 처리할 수 있음.
1-1)-1. 스택오버플로(stackoverflow.com)
2013년 한 해 동안 방문한 천만 명의 사용자 전부를 단 한 대의 마스터 데이터 베이스로 처리함.
이러한 수직적 접근법에는 몇 가지 심각한 약점이 있음.
1-1)-2. 수직적 확장의 단점
1-2) 수평적 확장
데이터베이스의 수평적 확장은 샤딩(sharding)이라고도 부르는데,
더 많은 서버를 추가함으로써 성능을 향상시킬 수 있도록 함.
샤딩은 대규모 데이터베이스를 샤드(shard)라고 부르는 작은 단위로
분할하는 기술을 일컫는다. 모든 샤드는 같은 스키마를 쓰지만
샤드에 보관되는 데이터 사이에는 중복이 없음.
1-2)-1. 샤드로 분할된 데이터베이스
사용자 데이터를 어느 샤드에 넣을지는 사용자 ID에 따라 정함.
user_id%4를 해시 함수로 사용하여 데이터가 보관되는 샤드를 정함.
결과가 0이면 0번 샤드에 1이면 1번 샤드에 보관하는 방식임.
1-2)-2. 각 샤드 노드에 사용자 데이터의 보관법
1-2)-3. 샤딩 전략 구현시 고려사항
1-2)-4. 샤딩 도입시 문제 사항
데이터의 재 샤딩(resharding)
데이터가 너무 많아져서 하나의 샤드로는 더 이상 감당하기 어려울 때
샤드 간 데이터 분포가 균등하지 못하여 어떤 샤드에 할당된 공간 소모가
다른 샤드에 비해 빨리 진행될 때 샤드 소진(shard exhaustion)이라고도 부르는 현상이
발생하면 샤드 키를 계산하는 함수를 변경하고 데이터를 재배치해야 함.
유명 인사 문제(celebrity)
핫스팟 키(hotspot key) 문제라고도 부르는데 특정 샤드에 질의가 집중되어 서버에 과부하 문제.
가령 케이티 페리, 저스틴 비버, 레이디 가가 같은 유명인사가 전부 같은 샤드에 저장되는 데이터베이스가 있을 경우 이 데이터로 사회 관계망 애플리케이션을 구축하게 되면
결국 해당 샤드에는 read 연산 때문에 과부하가 걸리게 될 거임.
이 문제를 풀려면 위에 나열한 유명인사 각각에 샤드 하나씩을 할당해야 할 수도 있고
심지어는 더 잘개 쪼개야 할 수도 있음.
조인과 비정규화(join and de-normalization)
일단 하나의 데이터베이스를 여러 샤드 서버로 쪼개고 나면,
여러 샤드에 걸친 데이터를 조인하기가 힘들어짐.
이를 해결하는 한 가지 방법은 데이터베이스를 비정규화하여
하나의 테이블에서 질의가 수행될 수 있도록 하는 거임
1-2)-5. 데이터베이스 샤딩을 적용한 아키텍처
데이터 베이스에 대한 부하를 줄이기 위해 굳이 관계형 데이터베이스가
요구되지 않는 기능들은 NoSQL로 이전했음.
2. 백만 사용자, 그리고 그 이상
시스템의 규모를 확장하는 것은 지속적이고 반복적인 과정이다.
수백만 사용자 이상을 지원하려면 새로운 전략을 도입해야하고 지속적으로 시스템을 가다듬어야 할 거임.
시스템을 최적화하고 더 작은 단위의 서비스로 분할해야 할 수도 있음.