데이터베이스 일관성이란?
데이터베이스 일관성(database consistency)은 데이터베이스 시스템 내의 모든 데이터 포인트가 올바르게 읽히고 승인되기 위해 반드시 충족해야 하는 값들의 집합으로 정의됩니다. 사전에 정의된 값을 충족하지 못하는 데이터가 데이터베이스에 입력되면, 해당 데이터셋에 일관성 오류가 발생합니다. 데이터베이스 일관성은 규칙을 설정함으로써 달성됩니다. 데이터베이스에 쓰기(write)되는 모든 데이터 트랜잭션은 개발자가 설정한 제약 조건, 트리거, 변수, 연쇄 작업(cascade) 등에 정의된 범위 안에서 영향받는 데이터만 변경해야 합니다.
예를 들어, 여러분이 국가교통안전연구원(NTSI)에서 근무하며 새로운 캘리포니아 운전면허 데이터베이스를 구축하는 업무를 맡았다고 가정해 보겠습니다. 지난 10년간 캘리포니아 인구가 급증하면서, 신규 운전면허 발급자를 위한 새로운 영문자·숫자 조합 형식이 필요해졌습니다. 여러분의 팀은 데이터베이스에서 캘리포니아 운전면허 번호의 새로운 기본값을 '영문자 1개 + 숫자 7개'로 결정했습니다. 이제 모든 항목은 이 규칙을 따라야 합니다. 만약 "C08846024"와 같은 값이 입력되면 오류가 반환됩니다. 그 이유는 입력된 값이 영문자 1개 + 숫자 8개 형식이기 때문이며, 이는 본질적으로 비일관적 데이터의 한 형태입니다.
일관성은 또한 한 테이블에서 특정 객체의 데이터가 변경되면, 해당 객체가 존재하는 다른 모든 테이블에서도 동일하게 변경되어야 함을 의미합니다. 운전면허 예시를 계속 살펴보면, 새 면허 소지자의 주소가 변경되었다면 그 변경 사항은 이전 주소가 저장된 모든 테이블에 반영되어야 합니다. 한 테이블에는 옛 주소가 남아 있고 나머지 테이블에는 새 주소가 있다면, 이것이 바로 데이터 비일관성의 전형적인 예입니다.
참고: 데이터베이스 일관성은 특정 트랜잭션으로 입력된 데이터가 실제로 정확하다는 것을 보장하지 않습니다. 단지 시스템 내에서 읽고 쓰이는 데이터가 데이터베이스에 입력 가능한 데이터의 모든 전제 조건을 충족한다는 것만 보장할 뿐입니다. 더 쉽게 설명하면, 위의 예시에서 '영문자 1개 + 숫자 7개' 규칙을 충족하는 데이터를 입력할 수는 있지만, 그것이 실제 존재하는 운전면허 번호와 일치한다는 보장은 없습니다. 데이터베이스 일관성은 데이터가 무엇을 의미하는지가 아니라 그 형식만을 다룹니다.
데이터베이스 일관성이 중요한 이유
일관된 데이터야말로 데이터베이스가 잘 관리된 기계처럼 원활하게 작동하게 만드는 핵심 요소입니다. 비일관적 데이터가 기본 데이터베이스와 복제본(replica)에 유입되지 않도록 하는 규칙과 값들은 다음과 같은 이점을 통해 운영을 매끄럽게 유지합니다.
- 정확성 확보
- 데이터베이스 공간 효율 증대
- 더 빠르고 효율적인 데이터 검색
데이터베이스 일관성은 유입되는 모든 데이터를 규제합니다. 따라서 새로운 데이터를 수용하면서 데이터베이스가 변경되더라도, 최소한 초기에 설정된 유효성 검사 규칙에 따라 일관된 방식으로 변경됩니다. 오늘날 전 세계적으로 하루에도 수십억 달러 규모의 의사결정이 데이터베이스의 '인식된' 일관성에 기반해 이루어집니다. 실시간 정보가 현대 디지털 비즈니스의 새로운 표준이 된 상황에서, 잘못된 정보로부터 데이터셋을 보호하기 위한 유효성 검사 규칙 마련은 필수적입니다. 잘못된 데이터는 지연(latency)을 유발하여 실시간 경험을 실시간답지 못하게 만들기 때문입니다.
데이터베이스 일관성 실제 예시
실제 세계에서 데이터베이스 일관성이 작동하는 예는 무엇일까요? 앞서 NTSI 시나리오를 통해 하나의 예를 살펴보았으니, 이번에는 금융 분야로 눈을 돌려 보겠습니다.
계좌 간 송금을 한다고 가정해 보겠습니다. 잔액 $300이 있는 계좌에 방금 $1,200를 송금했습니다. 화면을 새로 고치면 $1,500의 잔액을 확인할 수 있으리라 확신합니다. 그런데 이 거래 내역이 잔액에 반영되어 있지 않습니다. 심지어 새 잔액이 $0으로 표시됩니다. 이러한 기술적 오류는 약한 일관성의 전형적인 사례이며, 아마도 은행 상담원과 함께 문제를 해결하는 데 시간을 소비하게 될 것입니다. 이런 문제들은 브랜드 평판에 타격을 주고 막대한 비용을 초래할 수 있습니다. 데이터베이스 시스템에서 강한 일관성은 개발자와 소비자 모두에게 점점 더 필수적인 요건이 되고 있습니다.
강한 일관성 vs 약한 일관성
강한 일관성(Strong Consistency)은 기본 데이터베이스, 복제본 및 모든 관련 노드의 데이터가 유효성 검사 규칙에 부합하며 어느 시점에나 동일한 상태임을 의미합니다. 강한 데이터베이스 일관성이 확보되면, 어떤 클라이언트가 데이터에 접근하든 데이터베이스에 설정된 규칙을 준수하는 가장 최신의 데이터를 항상 보게 됩니다.
반면 약한 일관성(Weak Consistency)은 무법지대와 같습니다. 기본 데이터베이스, 복제본 또는 노드의 데이터가 어느 시점에나 동일하다는 보장이 없습니다. 예를 들어 인도의 한 클라이언트가 데이터에 접근했을 때, 유효성 검사 규칙은 통과하지만 최신 업데이트가 반영되지 않은 정보를 볼 수 있으며, 이로 인해 일관성 오류가 발생할 수 있습니다. 그 클라이언트는 과거에는 유효했지만 현재는 더 이상 관련성이 없는 정보를 기반으로 업무를 처리하게 될 수도 있습니다.
일관성 수준(Consistency Levels)
일관성 수준은 새로 허용된 데이터가 유효한 트랜잭션으로 인정받기 전에 몇 개의 복제본 또는 노드가 응답해야 하는지를 규정하는 또 다른 사전 정의 값입니다. 이 설정은 트랜잭션별로 변경할 수 있습니다. 예를 들어, 프로그래머는 새로 입력된 데이터를 단 두 개의 노드만 읽으면 일관성이 인정되도록 지정할 수 있습니다. 이 기준선을 넘으면 이후 해당 데이터는 일관된 데이터로 간주됩니다.
격리 수준(Isolation Levels)
격리 수준은 데이터베이스의 ACID(원자성, 일관성, 격리성, 지속성) 속성의 일부입니다. ACID는 SQL 데이터베이스에서 데이터베이스 일관성의 기본 개념이며, 일관성을 최적화하기 위해 특정 데이터베이스들이 따르는 지침입니다. 격리(isolation)는 ACID의 속성 중 하나로, 특정 데이터 조각을 데이터베이스 네트워크의 다른 정보들로부터 분리하여 다른 사용자 트랜잭션에 의해 수정되지 않도록 보호합니다. 격리는 동시 트랜잭션 환경에서 불필요한 데이터의 읽기와 쓰기를 줄이는 데 활용됩니다.
격리 수준에는 네 가지 유형이 있습니다.
- Read Uncommitted(커밋되지 않은 읽기): 가장 낮은 수준. 이전 트랜잭션이 커밋되지 않은 업데이트를 해당 행에 적용한 경우 행 업데이트를 차단합니다.
- Read Committed(커밋된 읽기): '더티 리드(dirty read)'를 허용하지 않습니다. 트랜잭션이 이미 업데이트되었지만 아직 커밋되지 않은 경우 모든 읽기와 쓰기를 차단합니다.
- Repeatable Read(반복 가능한 읽기): 읽고 있는 데이터 행이 다른 트랜잭션에 의해 접근되거나 업데이트되지 않도록 유지합니다.
- Serializable(직렬화 가능): 가장 높은 격리 수준으로, 특정 데이터 행이 아닌 전체 테이블을 잠그는 방식이 일반적입니다.
데이터베이스 일관성 FAQ
데이터가 일관적이다는 것은 무슨 의미인가요?
사용자의 지리적 위치나 접근 지점에 관계없이, 모든 관련 노드에서 동일한 시점에 동일한 데이터가 나타난다면 그 데이터는 일관적이라고 할 수 있습니다.
데이터 일관성과 데이터베이스 일관성은 같은 개념인가요?
아닙니다. 데이터베이스 일관성은 네트워크에 입력되는 데이터가 테이블 내 다른 모든 데이터와 형식적으로 일치하도록 유효성 검사 규칙을 요구합니다.
데이터 일관성은 데이터가 네트워크 전체와 해당 데이터를 활용하는 여러 애플리케이션 간에 최대한 균일하게 유지되도록 하는 프로세스입니다.
궁극적 일관성(Eventual Consistency)이란 무엇인가요?
궁극적 일관성에서는 업데이트된 데이터가 결국 해당 데이터가 저장된 모든 노드에 반영됩니다. 결과적으로 모든 노드는 네트워크 내 어떤 클라이언트가 접근하더라도 동일한 데이터를 반환하게 됩니다.
관계형 데이터베이스의 단일 테이블은 무엇으로 구성되어 있나요?
관계형 데이터베이스의 모든 데이터는 행(row)과 열(column)로 구성된 테이블에 저장되며, 데이터 포인트는 이 행과 열에 따라 정렬됩니다. 흔히 '레코드(record)'라고 불리는 행은 일반적으로 데이터의 범주를 나타내고, 열 또는 '필드(field)'는 개별 '인스턴스'를 나타냅니다. 테이블은 데이터베이스 내에 위치하며 주제 기반 설계를 통해 데이터의 중복을 방지하는 역할을 합니다.
관계형 데이터베이스는 무엇의 모음으로 구성되어 있나요?
테이블(tables)
ACID 모델과 BASE 모델은 어떻게 다른가요?
ACID와 BASE(Basically Available, Soft State, Eventually Consistent) 모델의 주요 차이점은, ACID가 데이터베이스 일관성 최적화에 중점을 두는 반면 BASE는 고가용성 강화에 초점을 맞춘다는 점입니다. ACID는 트랜잭션의 일관성을 유지하므로, BASE 모델을 선택한다면 일관성이 최우선 과제로 유지되고 철저히 관리되도록 해야 합니다.
Redis 데이터베이스는 일관성이 있나요?
Redis를 캐시로 사용할 때 문제가 되는 일관성은 Redis 인스턴스 간(기본/복제본), 그리고 Redis 캐시와 기본 데이터베이스로서의 Redis 간의 일관성일 수 있습니다. 이 경우 두 데이터가 서로 일치하지 않으면 데이터가 비일관적 상태가 될 수 있습니다. 관련 해결 방법은 'Three Ways to Maintain Cache Consistency' 블로그 글에서 자세히 다룹니다.
오픈소스 Redis는 약한 일관성을 제공하지만, Redis Enterprise의 Active-Active 지리적 분산(Geo-Distribution) 기능은 강한 궁극적 일관성을 제공합니다.
기업용 애플리케이션을 위한 클라우드 캐싱 기법에 관심이 있으신가요? 아래를 클릭하여 Lee Atchison의 『Caching at Scale with Redis』를 확인해 보세요.