1960년, MIT 링컨연구소에 있던 두 연구원 Irving S. Reed와 Gustave Solomon이 SIAM 저널(Journal of the Society for Industrial and Applied Mathematics) 8권 300~304쪽에 논문 한 편을 싣습니다. 제목은 “Polynomial Codes over Certain Finite Fields”, 분량은 단 5페이지였어요. 이 짧은 논문이 이후 CD, DVD, QR코드, 보이저 탐사선의 심우주 통신, 그리고 지금 이 글이 다루는 MinIO 같은 분산 오브젝트 스토리지까지 관통하는 오류 정정 부호의 원형이 됩니다. 66년 전 통신 이론 논문 한 편이 어떻게 오늘날 홈랩의 스토리지 안정성까지 책임지게 됐을까요?
리드-솔로몬 부호란 무엇인가
리드-솔로몬 부호는 메시지를 다항식의 계수로 취급한 뒤, 그 다항식을 유한체 위의 여러 점에서 평가(evaluate)해 원래보다 긴 부호어를 만드는 방식이에요. 원 논문은 메시지 (a₀, a₁, …, aₘ₋₁)를 다항식 P(x) = a₀ + a₁x + … + aₘ₋₁xᵐ⁻¹의 계수로 놓고, 이를 유한체 K의 원소 개수 N개 지점 (P(0), P(α), P(α²), …, P(αᴺ⁻¹))에서 평가한 값들을 부호어로 정의합니다. 여기서 핵심은 다항식의 성질이에요. 서로 다른 두 개의 m-1차 다항식은 많아야 m-1개 지점에서만 값이 같을 수 있으므로, 충분히 많은 지점에서 평가해두면 그중 일부 값이 사라지거나 훼손돼도 남은 값들만으로 원래 다항식을 유일하게 복원할 수 있다는 거예요.
이 원리를 스토리지에 그대로 옮기면, 원본 데이터를 다항식의 계수로 나눠 담고 그 다항식을 여러 지점에서 평가한 값들을 서로 다른 디스크나 노드에 하나씩 저장하는 셈이 됩니다. 데이터 조각 K개만 있으면 원래 다항식의 차수를 결정할 수 있기 때문에, 몇 개 조각이 사라져도 나머지 조각들로 다항식을 다시 세워 잃어버린 값을 그대로 재현할 수 있어요.
왜 하필 유한체 위에서 계산해야 할까
유한체를 쓰는 이유는 다항식 연산을 아무리 반복해도 결과가 항상 정확하게 닫혀 있기 때문이에요. 일반적인 실수나 정수 연산에서는 나눗셈을 거듭하면 소수점 오차나 오버플로우가 누적될 수 있지만, 유한체(보통 GF(2⁸)처럼 원소 개수가 2의 거듭제곱인 갈루아체)에서는 덧셈·뺄셈·곱셈·나눗셈을 아무리 섞어 계산해도 결과가 항상 그 체 안의 정확한 값으로 되돌아와요. 그래서 컴퓨터가 바이트 단위 데이터를 다룰 때도 반올림 걱정 없이 정확한 복원이 보장되는 거고, 이게 부동소수점 근사가 아니라 100% 정확한 복구를 리드-솔로몬 부호가 약속할 수 있는 이유예요.
원 논문이 발표될 당시엔 이 다항식 평가 방식을 실제로 빠르게 복호화(decode)할 알고리즘이 마땅치 않아 이론에 머물렀지만, 이후 BCH 부호 방식과 결합되고 벌리캠프-매시(Berlekamp-Massey) 알고리즘 같은 실용적 복호 기법이 나오면서 비로소 하드웨어에 구현 가능한 기술이 됐습니다.
Erasure coding은 RAID의 패리티와 무엇이 다른가
Erasure coding은 데이터 조각 K개에 패리티 조각 M개를 더해 총 N개(N = K + M) 조각으로 분산 저장하고, 그중 아무 K개만 남아 있어도 원본을 복원하는 방식이에요. RAID 5나 RAID 6도 사실 erasure coding의 한 형태이긴 하지만, 이 둘은 XOR 연산만으로 패리티를 만드는 아주 제한된 특수 사례에 가까워요. RAID 5는 XOR 패리티 하나로 디스크 1개 고장까지만, RAID 6는 XOR 패리티 둘로 디스크 2개 고장까지만 버틸 수 있고, 그 이상으로 패리티 개수를 늘리려면 XOR만으로는 수학적으로 한계에 부딪힙니다.
반면 리드-솔로몬 부호는 유한체 다항식 연산을 쓰기 때문에 패리티 조각 개수 M을 사실상 원하는 만큼 늘릴 수 있어요. 데이터 조각이 12개든 패리티 조각이 8개든, 원래 다항식의 차수와 평가 지점 개수만 맞추면 동일한 수학적 틀 안에서 처리됩니다. 그 결과 RAID처럼 “패리티 1개냐 2개냐” 둘 중 하나를 고르는 게 아니라, 스토리지 클러스터의 규모와 원하는 내구성 수준에 맞춰 패리티 비율을 자유롭게 설계할 수 있다는 게 근본적인 차이예요.
MinIO는 이 원리를 실제로 어떻게 구현했나
MinIO는 오브젝트를 저장할 때마다 리드-솔로몬 알고리즘으로 데이터 조각 K개와 패리티 조각 M개를 만들어 이레이저 세트(erasure set) 안의 드라이브에 하나씩 분산 저장합니다. MinIO 공식 문서 기준으로 이레이저 세트는 드라이브 2개에서 최대 16개(최근 버전은 32개)까지 묶을 수 있고, 패리티 수준은 EC:N 표기로 나타내요. 예를 들어 16드라이브 이레이저 세트에서 EC:4를 설정하면 데이터 조각 12개와 패리티 조각 4개로 나뉘어, 드라이브 4개가 동시에 고장 나도 나머지 12개 조각만으로 오브젝트를 그대로 복구할 수 있습니다. MinIO는 기본적으로 전체 드라이브의 절반을 데이터, 나머지 절반을 패리티로 나누는 N/2 구성을 권장하며, 운영 환경에서는 최소 EC:3 이상을 쓰도록 안내하고 있어요.
여기서 끝이 아니에요. MinIO는 RAID처럼 볼륨 전체가 아니라 오브젝트 단위로 힐링(healing)을 수행한다는 점도 실전에서 큰 차이를 만듭니다. 드라이브 하나가 고장 나 교체되면, 볼륨 전체를 처음부터 재구성하는 RAID 리빌드와 달리 MinIO는 실제로 그 드라이브가 담당하던 오브젝트들만 하나씩 순차적으로 복구해서, 대규모 클러스터에서도 복구 시간을 대폭 줄일 수 있다고 공식 블로그는 설명해요. 데이터 무결성 검증도 HighwayHash 체크섬으로 별도로 관리해서, 조용히 비트가 손상되는 비트로트(bit rot)까지 함께 잡아냅니다.
홈랩에서 이 원리가 실제로 의미하는 것
MinIO를 홈서버에 직접 설치해본 사람이라면 콘솔 설정 화면에서 패리티 값을 고르는 순간, 방금까지 살펴본 다항식 복원 원리가 그대로 동작하고 있다는 걸 알 수 있어요. 다만 리드-솔로몬 부호의 이점은 디스크나 노드가 충분히 많을 때 제대로 살아나기 때문에, 디스크 1~2개짜리 단일 노드 구성에서는 erasure coding을 켜봐야 실질적인 중복성을 거의 확보하지 못해요. 최소 4개 이상의 디스크가 모였을 때부터 패리티 비율을 조정하는 의미가 생기고, 그 아래 규모라면 TrueNAS Scale의 RAID-Z처럼 다른 방식의 중복성 전략을 고려하는 게 더 현실적이에요. 두 방식 모두 결국 “일부가 사라져도 전체를 지킨다”는 목표는 같지만, 구현에 쓰이는 수학과 그로부터 얻는 유연성의 폭이 다르다는 걸 기억해두면 스토리지 구성을 고를 때 판단 기준이 훨씬 명확해집니다. 참고로 조각 손실 자체를 막는 이번 원리와 달리, 이미 저장된 데이터가 조용히 손상되는 걸 감지하고 막는 ZFS의 종단 간 데이터 무결성 원리는 또 다른 논문에서 다루니 함께 읽어보면 스토리지 안정성을 더 입체적으로 이해할 수 있어요.
결론
Reed와 Solomon이 1960년에 남긴 5페이지짜리 논문은 애초에 통신 채널의 오류를 정정하려는 목적이었지만, 그 안의 다항식-유한체 원리는 시간이 지나며 CD의 스크래치 복원부터 오늘날 MinIO의 EC:N 설정 화면까지 형태만 바꿔가며 계속 쓰이고 있어요. 홈랩 규모에서 이 논문을 직접 읽을 일은 없겠지만, 패리티 조각 개수를 늘리거나 줄일 때 그 뒤에서 실제로 무슨 수학이 돌아가는지 알고 있으면 단순히 “안전해 보이니까 EC:4로 설정”하는 것과는 다른, 근거 있는 선택을 할 수 있습니다. 결국 66년 전 논문 한 편이 지금 이 순간에도 여러분의 드라이브 위에서 조용히 계산을 돌리고 있는 셈이에요.
참고 자료
- Reed, I. S., & Solomon, G. (1960). Polynomial Codes over Certain Finite Fields. Journal of the Society for Industrial and Applied Mathematics, 8(2), 300–304.
- MinIO AIStor 공식 문서 - Erasure Coding
- MinIO 공식 블로그 - Object Storage Erasure Coding vs. Block Storage RAID
- MinIO GitHub - Erasure Code README
자주 묻는 질문
Q1. 리드-솔로몬 부호와 RAID 5/6의 패리티는 같은 원리인가요?
아니요, RAID 5/6의 패리티는 XOR 연산만으로 만든 리드-솔로몬 부호의 극히 제한된 특수 사례이고, 일반적인 리드-솔로몬 부호는 유한체 다항식 연산을 써서 패리티 조각 수를 임의로 늘릴 수 있다는 점이 근본적으로 달라요.
Q2. MinIO의 EC:4 표기는 정확히 무슨 뜻인가요?
EC:4는 패리티 조각을 4개 생성한다는 뜻으로, 16드라이브 구성이라면 데이터 조각 12개와 패리티 조각 4개로 나뉘어 드라이브 4개가 동시에 고장 나도 데이터를 그대로 복구할 수 있어요.
Q3. 조각을 몇 개까지 잃어도 원본 데이터를 복구할 수 있나요?
전체 조각 수 N 중에서 데이터 조각 수 K개에 해당하는 개수만 남아 있으면 복구할 수 있어요. 즉 N-K개, 즉 패리티 조각 수만큼의 조각이 사라져도 안전해요.
Q4. 왜 하필 유한체(finite field) 연산을 써야 하나요?
일반 정수 연산은 나눗셈을 반복하면 오버플로우나 정밀도 손실이 생기지만, 유한체는 덧셈·뺄셈·곱셈·나눗셈이 항상 그 체 안에서 닫혀 있어서 다항식을 아무리 계산해도 결과가 정확하게 원래 값으로 되돌아온다는 점이 보장돼요.
Q5. 리드-솔로몬 부호는 스토리지 말고 다른 곳에도 쓰이나요?
네, CD와 DVD의 스크래치 오류 정정, QR코드 같은 2차원 바코드의 훼손 복원, 보이저·화성 탐사선의 심우주 통신 등 리드-솔로몬 부호는 스토리지보다 훨씬 먼저 통신·미디어 분야에서 폭넓게 쓰였어요.
Q6. 홈랩 규모에서도 erasure coding을 쓸 가치가 있나요?
디스크나 노드가 4개 이상 모이는 시점부터 실익이 커져요. 디스크 1~2개짜리 단일 노드 MinIO라면 erasure coding의 이점을 거의 못 살리므로, 그 전까지는 단순 백업이나 RAID-Z 같은 대안이 더 현실적이에요.
관련 글


