물론 클라우드 서버를 사용하면 필요한 만큼 서버 개수를 빠르게 늘리거나 줄일 수 있습니다. 그러나 서버 개수가 급격히 늘어나거나 줄어들면 레코드를 재배치해야 하는 양이 많아집니다. 일관된 해시를 쓴다고 하더라도 레코드를 재배치해야 하는 양은 큰 부담일 수밖에 없습니다. 예를 들어 샤드가 1개였다가 10개로 늘어나면, 기존 샤드에 있던 레코드 90%는 옮겨집니다.
이때 우리에게는 레코드를 옮기는 일 자체를 줄여 주는 것이 필요합니다. C 언어로 프로그래밍할 때를 생각해 봅시다. 덩치가 큰 데이터 구조체를 다룰 때, 성능상 구조체 자체보다 구조체의 포인터를 다루어야 할 때가 있습니다. 여기서 핵심은 데이터 자체보다 데이터를 가리키는 또 다른 데이터를 다룬다는 데 있습니다. 이러한 요령을 데이터베이스에 응용해 봅시다. 이를 매핑 DB라고 합니다.
앞서 본 일관된 해시 함수는 잠시 잊읍시다. 그리고 해시 함수가 리턴하는 값에 따라 샤드를 찾는 방식으로 다시 돌아옵시다. 다시 샤드가 늘어날 때마다 모든 레코드를 리해시해야 하는 고통의 수렁으로 되돌아왔습니다.
어떻게 해서 John은 샤드 1에 있고, Alice는 샤드 2에 있다고 가정해 봅시다. 그런데 John과 Alice는 해시 함수에 넣으면 무조건 3이 나옵니다. 우리는 John은 1이 나오고, Alice는 2가 나오기를 원합니다.
이렇게 되려면 해시 함수는 고정된 해시 알고리즘이 아니라, 다른 어딘가에서 “John은 샤드 1에 있다. Alice는 샤드 2에 있다.”를 얻어 올 수 있는 데이터 출처가 있어야 합니다. 이 출처를 ‘매핑 DB’라고 합니다. 매핑 DB는 오로지 “어떤 키는 어떤 샤드에 있다.”라는 정보만 가집니다. 그리고 해당 샤드에는 키에 해당하는 덩치 큰 데이터를 가집니다.