어떻게 한 대로 부족할 때, 나눠 담기
데이터가 계속 쌓이면 어떻게 될까? 아무리 큰 창고도 언젠가는 가득 찬다. 그러면 창고를 여러 채로 늘려 짐을 나눠 담고, 한 채가 무너져도 짐을 잃지 않도록 같은 짐을 다른 창고에도 복사해 둔다. 데이터도 마찬가지다. 컴퓨터 한 대로 감당이 안 되면 여러 대에 나눠 담고, 고장에 대비해 여러 대에 복사해 둬요.
한 대로는 부족해져요
앞 레슨까지 데이터를 담고, 찾고, 안전하게 바꾸고, 빠르고 작게 다루는 법을 봤다. 그런데 데이터는 멈추지 않고 쌓인다. 사용자가 늘고 기록이 늘고, 사진과 영상까지 들어온다.
컴퓨터 한 대에 담을 수 있는 양에는 한계가 있어요. 디스크 크기도, 한 대가 한꺼번에 처리할 수 있는 요청 수도 정해져 있다. 아래에서 한 대에 데이터를 계속 넣어 보자.
데이터 추가를 계속 눌러 보자. 한 대의 용량을 넘기면 더는 담지 못해요.
한 대가 꽉 찼다. 더 넣고 싶어도 자리가 없다. 더 큰 컴퓨터로 바꾸는 방법도 있는데, 이것을 수직 확장이라고 해요. 하지만 큰 컴퓨터일수록 값이 가파르게 비싸지고, 아무리 키워도 결국 다시 가득 찬다.
그래서 다른 길을 택한다. 한 대를 키우는 대신 여러 대로 늘리는 것이다. 이것을 수평 확장이라고 부른다. 그렇다면 데이터를 여러 대에 어떻게 나눠 담을까?
여러 대에 나눠 담아요
데이터를 조각으로 나눠 여러 대에 흩어 담는다. 한 대가 전부를 떠안는 대신 대마다 일부만 맡는 것이다. 이렇게 나눠 담는 일을 분산, 그중에서도 데이터를 조각내 나누는 것을 샤딩이라고 해요.
나누는 기준은 여러 가지다. 이름이 ㄱ부터 ㅁ까지인 데이터는 1번 대, ㅂ부터 ㅎ까지는 2번 대에 담듯 범위로 나눌 수도 있고, 앞에서 본 해시로 키를 숫자로 바꿔 그 값에 따라 고르게 흩을 수도 있다. 범위로 나누면 특정 구간에 데이터가 몰릴 수 있어서, 고르게 퍼뜨리고 싶을 때는 해시를 많이 쓴다.
조각을 하나씩 눌러 여러 대에 나눠 담아 보자. 대마다 전체의 일부만 갖게 돼요.
조각이 세 대에 흩어졌다. 한 대가 지던 짐이 가벼워졌고, 데이터가 더 늘면 컴퓨터를 한 대 더 붙여 새 조각을 맡기면 된다. 이렇게 늘려 갈 수 있으니 아주 큰 데이터도 담을 수 있어요.
어떤 데이터를 찾을 때는 그 데이터가 어느 대에 있는지부터 알아야 한다. 나눈 기준을 알고 있으니 키만 보면 찾아갈 대가 정해진다. 그런데 걱정이 하나 생긴다. 어떤 조각을 맡은 그 한 대가 갑자기 고장 나면 어떻게 될까?
같은 데이터를 여러 대에 복사해 둔다
나눠 담으면 약점이 생긴다. 어떤 조각을 맡은 컴퓨터가 고장 나면 그 조각이 통째로 사라진다. 컴퓨터가 많을수록 그중 어딘가가 고장 날 일도 잦아진다.
그래서 같은 데이터를 여러 대에 복사해 둔다. 한 대가 멈춰도 복사본을 가진 다른 대가 이어받으니 데이터를 잃지 않아요. 이렇게 같은 데이터를 여러 대에 두는 것을 복제라고 한다. 복사본이 있으면 읽기 요청을 여러 대가 나눠 받을 수도 있다.
먼저 복사해 둔 뒤 한 대를 꺼 보자. 한 대를 꺼도 복사본을 가진 다른 대가 살아 있어 데이터가 남아요.
한 대를 꺼도 데이터는 멀쩡했다. 복사본 덕분이다. 여기서 두 가지를 꼭 구분하자. 분산은 데이터를 쪼개 서로 다른 대에 나누는 것이고, 복제는 같은 데이터를 여러 대에 똑같이 두는 것이다. 실제 시스템은 보통 둘을 함께 써서 조각마다 복사본을 둬요.
복제에는 대가도 있다. 데이터를 고칠 때마다 모든 복사본을 맞춰야 하는데, 컴퓨터끼리 연락하는 데 시간이 걸리니 잠깐은 복사본마다 값이 다를 수 있다. 네트워크가 끊기면 옛 값이라도 바로 답할지, 맞춰질 때까지 기다릴지 골라야 하는 순간도 온다.
느슨한 그릇, NoSQL
데이터가 어마어마하게 많고 아주 빠르게 들고 나야 할 때는 엄격한 표가 오히려 짐이 되기도 한다. 모든 줄이 같은 칸을 갖춰야 하고, 표끼리 잇는 조인과 트랜잭션을 여러 대에 걸쳐 지키는 일은 비싸기 때문이다.
그래서 규칙을 느슨하게 푼 저장소를 쓴다. 표 대신 키 하나에 값 하나를 매달아 바로 담고 바로 꺼내는 식이에요. 앞에서 본 해시 테이블을 여러 대로 키운 모양이라, 키만 있으면 어느 대에 있는지도 바로 정해진다. 이런 저장소들을 묶어 NoSQL이라고 부른다.
잣대를 눌러 엄격한 표와 느슨한 키-값 그릇을 견줘 보자. 모양이 자유롭고 크고 빠른 처리에 맞는 쪽은 느슨한 그릇이에요.
느슨한 그릇은 규칙이 적은 만큼 자유롭고 빠르다. 줄마다 칸이 달라도 되고, 키만 있으면 값을 바로 담고 꺼낸다. 그 대신 표끼리 잇는 조인이나 엄격한 트랜잭션 같은 편리함은 일부 내려놓아요.
그래서 무엇을 얻고 무엇을 내려놓을지 쓰임에 맞게 고른다. 돈이 오가는 장부처럼 정확함이 먼저인 곳에는 엄격한 표를, 엄청난 양의 기록을 빠르게 쌓아야 하는 곳에는 느슨한 그릇을 쓰는 식이다. 한 서비스 안에서 둘을 함께 쓰는 일도 흔하다.
데이터 영역을 정리해요
여기까지 먼 길을 걸어왔다. 값을 담는 자료 구조에서 시작해 표를 모은 데이터베이스를 봤고, 해시와 트리와 인덱스로 큰 표에서 빠르게 찾는 법을 배웠다. SQL로 묻고 조인으로 표를 이었으며, 정규화로 중복을 덜고 트랜잭션으로 안전하게 바꿨다.
캐시와 압축으로 더 빠르고 작게 다루는 법도 봤어요. 그리고 오늘은 한 대로 부족할 때 나눠 담고 복사해 두는 법까지 왔다.
데이터 영역의 큰 줄기를 차례로 눌러 닫아 보자. (자료 구조라는 그릇 → 표를 모은 데이터베이스 → 빠르게 찾기 → 묻고 잇기 → 정리하고 안전하게 바꾸기 → 빠르고 작게 → 나눠 담기와 복제)
오늘 내용을 모으면 이렇다. 데이터가 한 대로 감당이 안 되면 여러 대에 조각내 나눠 담고(분산), 고장에 대비해 같은 데이터를 여러 대에 복사해 둔다(복제). 나누기와 복사하기는 다른 일이고, 실제로는 둘을 함께 쓴다.
거대하고 빠른 처리를 위해서는 표의 규칙을 느슨하게 푼 NoSQL이라는 저장소를 쓰기도 해요. 무엇을 얻고 무엇을 내려놓을지 골라 쓰는 것이 핵심이다.
이제 데이터를 다루는 큰 그림이 한눈에 들어온다. 작은 그릇 하나에서 시작해 여러 대에 나누고 복사하는 큰 살림까지 왔다. 정보를 안전하게 담고, 빠르게 찾고, 크게 늘리는 이 솜씨가 다음 영역의 바탕이 돼요.
다음 영역은 인공지능이다. 많은 데이터가 모이는 곳에서 기계가 규칙을 스스로 찾아낸다. 첫 레슨에서는 기계가 배운다는 것이 무슨 뜻인지부터 살펴본다.