사전 일관성
용어함정

일관성

gabury1

일관성은 서로 어긋나지 않은 상태를 가리키는 말입니다. 무엇과 무엇을 맞추는지는 쓰는 자리마다 다릅니다. 누가 그것을 지키는지도 자리마다 갈립니다. 한 자리에서 배운 뜻을 다른 자리에 그대로 들고 가면 말이 어긋납니다.

상세

여러 뜻이 공유하는 뼈대는 하나입니다. 무엇과 무엇이 어긋나지 않는다는 것입니다. 갈리는 자리는 둘입니다. 무엇과 무엇을 맞추는가, 그리고 누가 그것을 지키는가입니다.

flowchart TD
    C["일관성"] --> T["트랜잭션 — 데이터와 제약"]
    C --> D["분산 복제 — 사본과 사본"]
    C --> M["공유 메모리 — 명령 순서와 보이는 순서"]
    C --> H["캐시 — 사본과 메인 메모리"]

맞추는 대상부터 갈립니다. 트랜잭션에서는 데이터와 미리 정해 둔 제약을 맞춥니다. 분산 복제에서는 여러 사본을 서로 맞춥니다. 공유 메모리에서는 프로그램이 지정한 명령 순서와 실제로 보이는 순서를 맞춥니다. 캐시에서는 같은 주소를 담은 사본들을 맞춥니다.

지키는 쪽도 갈립니다. 트랜잭션 쪽에서는 트랜잭션 자신이 데이터베이스의 일관성을 보존합니다. 분산 복제 쪽에서는 여러 노드로 흩어진 시스템이 한 노드 위에서 도는 것처럼 굴어야 합니다. 공유 메모리 쪽에서는 조건을 만족하는 멀티프로세서를 순차 일관적이라고 부릅니다. 캐시 쪽에서는 코어마다 자기 레벨 1 캐시를 갖는 시스템이 캐시 사이를 맞출 장치를 요구합니다.

무엇이 올바른 상태인가를 누가 정하는지도 같이 갈립니다. Härder 와 Reuter 의 정의는 성공한 트랜잭션이 정의상 적법한 결과만 확정한다고 적습니다. 무엇이 적법한지는 그 정의 안에 없습니다. Gilbert 와 Lynch 의 정의는 반대입니다. 올바름의 기준을 정의가 직접 담습니다. 쓰기 연산이 완료된 뒤에 시작한 읽기 연산은 그 값 또는 그보다 뒤 쓰기의 결과를 돌려줘야 한다는 것입니다.

한국어에는 함정이 하나 더 얹힙니다. 앞의 세 맥락을 영어는 consistency 라고 적습니다. 캐시 맥락은 coherency 라고 적습니다. 국문에서는 둘 다 일관성으로 옮겨집니다. 낱말이 하나로 접히면서 갈림이 안 보이게 됩니다.

그래서 일관성이라는 말만으로는 무엇을 맞추는 이야기인지가 정해지지 않습니다. 맥락 이름을 먼저 대야 뜻이 섭니다.

맥락별 뜻

맥락 뜻 출처
트랜잭션 정상적으로 끝난 트랜잭션이 데이터베이스의 일관성을 보존하는 것. 성공한 트랜잭션은 정의상 적법한 결과만 확정한다 Härder & Reuter, "Principles of Transaction-Oriented Database Recovery" (1983)
분산 복제 모든 연산에 전체 순서가 서서 각 연산이 한 순간에 완료된 것처럼 보이는 것. 쓰기가 완료된 뒤 시작한 읽기는 그 값이나 그보다 뒤 쓰기의 결과를 돌려준다 Gilbert & Lynch, "Brewer's Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services" (2002)
공유 메모리 어떤 실행의 결과든 모든 프로세서의 연산이 어떤 순차 순서로 실행된 것과 같고, 각 프로세서의 연산이 그 순서 안에서 자기 프로그램이 지정한 차례로 나타나는 것 Lamport, "How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs" (1979)
캐시 같은 주소를 두고 캐시와 외부 메모리, 그리고 캐시끼리 내용이 어긋나지 않게 유지하는 것. 영어로는 coherency 다 Arm, Cortex-A Series Programmer's Guide, 9장

트랜잭션

Härder 와 Reuter 는 1983년 논문에서 트랜잭션의 네 성질을 ACID(Atomicity, Consistency, Isolation, Durability, 원자성·일관성·격리성·지속성)로 묶어 이름 붙였습니다. 그 글에서 일관성은 정상적으로 끝난 트랜잭션에 붙는 성질입니다. 트랜잭션이 정상 종료에 이르러 자기 결과를 확정하면 데이터베이스의 일관성이 보존됩니다. 달리 말하면 성공한 트랜잭션은 정의상 적법한 결과만 확정합니다.

두 사람은 이 조건이 네 번째 성질인 지속성에 필요하다고 적습니다. 그리고 네 글자를 묶어 트랜잭션 패러다임의 요점이라고 부릅니다. 어떤 시스템이 트랜잭션을 지원하는가를 묻는 것이 그 시스템 품질의 ACID 시험이라는 말장난도 같은 자리에 있습니다.

이 맥락의 정의에서 눈여겨볼 자리는 적법이라는 낱말입니다. 무엇이 적법한 결과인지는 이 정의가 말하지 않습니다. 정의는 그 판정 기준이 이미 서 있다고 전제하고, 트랜잭션이 그것을 깨지 않은 채로 끝난다는 것만 약속합니다.

분산 복제

Gilbert 와 Lynch 는 2002년 논문에서 일관된 서비스를 형식화하는 가장 자연스러운 방법이 원자적 데이터 객체라고 적습니다. 원자적 일관성은 선형화 가능성이라고도 부릅니다. 두 사람은 이것이 오늘날 대부분의 웹 서비스가 기대하는 조건이라고 적습니다.

이 보장 아래에서는 모든 연산에 전체 순서가 서야 합니다. 각 연산은 한 순간에 완료된 것처럼 보여야 합니다. 두 사람은 이것이 분산 공유 메모리에 대한 요청들이 한 노드 위에서 실행되는 것처럼 굴어야 한다는 요구와 같다고 적습니다. 요청을 한 번에 하나씩 처리하는 것처럼 응답해야 한다는 뜻입니다.

원자적 읽기·쓰기 공유 메모리의 중요한 성질 하나를 두 사람은 따로 짚습니다. 쓰기 연산이 완료된 뒤에 시작한 읽기 연산은 그 값을 돌려주거나 그보다 뒤 쓰기의 결과를 돌려줘야 한다는 것입니다.

공유 메모리

Lamport 는 1979년 논문에서 고속 프로세서가 프로그램이 지정한 것과 다른 순서로 연산을 실행할 수 있다는 데서 이야기를 시작합니다. 실행의 올바름은 프로세서가 다음 조건을 만족하면 보장됩니다. 실행의 결과가 연산들이 프로그램이 지정한 순서대로 실행된 경우와 같아야 합니다. 이 조건을 만족하는 프로세서를 Lamport 는 순차적이라고 부릅니다.

그런 프로세서 여럿이 공통 메모리에 접근하는 컴퓨터로 이야기가 넘어갑니다. 거기서 만족해야 하는 조건은 둘입니다. 어떤 실행의 결과든 모든 프로세서의 연산이 어떤 순차 순서로 실행된 경우와 같아야 합니다. 그리고 각 프로세서의 연산은 그 순서 안에서 자기 프로그램이 지정한 차례로 나타나야 합니다. 이 조건을 만족하는 멀티프로세서를 순차 일관적이라고 부릅니다.

이 맥락에서 다투는 것은 최신값이 아니라 순서입니다. 정의 어디에도 어느 값이 최신인가를 묻는 대목이 없습니다.

캐시

Arm 의 Cortex-A 시리즈 프로그래머 안내서는 캐시와 외부 메모리의 내용이 때때로 같지 않을 수 있다고 적습니다. 프로세서가 캐시 내용을 갱신하고도 아직 메인 메모리로 되쓰지 않았을 수 있기 때문입니다. 반대 방향도 있습니다. 코어가 자기 사본을 뜬 뒤에 다른 주체가 메인 메모리를 갱신할 수도 있습니다. 안내서는 이것을 coherency 의 문제라고 부릅니다. 코어가 여럿이거나 외부 DMA(Direct Memory Access, 직접 메모리 접근) 컨트롤러 같은 메모리 주체가 있을 때 특히 문제가 될 수 있다고 적습니다.

코어들이 클러스터로 구현되고 코어마다 자기 레벨 1 캐시를 갖는 경우도 같은 안내서가 짚습니다. 그런 시스템은 캐시 사이의 coherency 를 유지할 장치를 요구합니다. 한 코어가 메모리 위치를 바꾸면 그 변경이 같은 메모리를 공유하는 다른 코어들에도 보이게 만들기 위해서입니다.

안내서는 이 성질을 위치로도 정의합니다. 어떤 주소에 대한 Point of Coherency 는 메모리에 접근할 수 있는 모든 블록이 그 메모리 위치의 같은 사본을 본다고 보장되는 지점입니다. 코어와 디지털 신호 프로세서와 DMA 엔진이 그런 블록입니다. 대개 이 지점은 메인 외부 시스템 메모리입니다.

영어 원문이 consistency 가 아니라 coherency 라고 적는 자리가 여기입니다. 국문 번역에서 이 낱말 차이가 사라집니다.

경계

격리 수준을 가장 세게 잡으면 일관성 문제가 사라지나. 아닙니다. 두 축이 따로 있습니다.

Google Cloud Spanner 문서가 이 둘을 한 페이지 안에서 갈라 적습니다. 격리 수준을 지정하지 않거나 직렬가능 격리로 두면 Spanner 는 트랜잭션에 가장 엄격한 동시성 제어 보장을 제공합니다. 문서는 그것을 외부 일관성이라고 부릅니다. 격리 수준을 끝까지 올린 자리에서 이름이 일관성 쪽으로 넘어갑니다.

그리고 문서는 외부 일관성이 직렬가능성보다 엄격한 성질이라고 적습니다. 어떤 트랜잭션 처리 시스템이 직렬가능하다는 것은 트랜잭션들을 직렬로 실행한 시스템과 구별할 수 없게 실행한다는 뜻입니다. Spanner 는 거기에 더해 그 직렬 순서가 트랜잭션들의 커밋이 관측되는 순서와 일치할 것까지 보장합니다. 한 트랜잭션이 다른 트랜잭션의 커밋 시작보다 먼저 끝났다면, 두 번째 트랜잭션의 효과는 담고 첫 번째 트랜잭션의 효과는 안 담은 상태를 클라이언트가 결코 볼 수 없습니다.

반대 방향도 같은 문서에 있습니다. 선형화 가능성은 원자적 읽기·쓰기 연산을 지원하는 동시 객체의 성질입니다. 문서는 선형화 가능성이 트랜잭션의 동작에 대해서는 아무 말도 하지 않는다고 적습니다. 복제 객체가 선형화 가능하면 그 복제 프로토콜은 강한 일관성을 보인다고도 적혀 있습니다. 강한 일관성 역시 트랜잭션의 동작에 대해서는 아무것도 강제하지 않습니다.

정리하면 축이 둘입니다. 한쪽은 동시에 도는 트랜잭션들이 서로를 얼마나 보는가를 정합니다. 다른 한쪽은 어느 사본의 값이 언제 보이는가를 정합니다. 한 축을 끝까지 올려도 다른 축은 남습니다. Spanner 문서가 격리 수준을 별도 문서로 떼어 두고 일관성 보장을 이 페이지에서 따로 다루는 것이 그 갈림의 표시입니다.

관련 항목

이 말의 뜻이 갈리는 분야

트랜잭션 · 분산 복제 · 공유 메모리 · 캐시

트랜잭션의 정상 종료를 이루는 성질과 사건

ACID · 원자성 · 격리성 · 지속성 · 커밋

분산 복제에서 이것을 정의하는 개념

CAP · 가용성 · 분할 내성 · 원자적 일관성 · 선형화 가능성 · 분산 공유 메모리 · 전체 순서

공유 메모리에서 이것을 정의하는 개념

순차 일관성 · 멀티프로세서 · 프로그램 순서

캐시에서 이것을 정의하는 개념

coherency · Point of Coherency · 레벨 1 캐시 · 멀티코어 · 메인 메모리 · DMA 컨트롤러 · 디지털 신호 프로세서

경계에서 이것을 정의하는 개념

격리 수준 · 직렬가능성 · 외부 일관성 · 강한 일관성 · 최종 일관성 · TrueTime · Spanner · 동시성 제어

다른 이름: consistency · coherency