1P by neo 2달전 | favorite | 댓글 1개

Datomic: 일반 목적의 기록 시스템 데이터베이스

# Datomic의 배경

  • Datomic은 기록 시스템을 위한 일반 목적 데이터베이스임.
  • 데이터베이스 상태는 [entity, attribute, value] (EAV) 트리플로 표현되며, 이를 datom이라 부름.
  • 스키마를 통해 속성의 유형과 카디널리티를 제어함.
  • 시간을 명시적으로 모델링하는 시간적 데이터베이스임.
  • 각 트랜잭션은 논리적 타임스탬프 t벽시계 시간 txInstant으로 식별됨.
  • 트랜잭션은 datom을 추가하거나 제거할 수 있음.
  • 모든 datom은 트랜잭션 참조를 유지함.
  • 데이터베이스는 이러한 튜플의 계속 증가하는 집합임.

# Datomic의 기능

  • 사용자는 논리적 또는 벽시계 시간에 데이터베이스의 스냅샷 상태를 요청할 수 있음.
  • 데이터베이스의 전체 기록을 볼 수 있음.
  • Datalog 스타일 API, 선언적 그래프 탐색 API, ODM 스타일 Entity 데이터 타입을 통해 쿼리 가능함.
  • Datomic ProDatomic Cloud 두 가지 버전이 있음.

# 1.1 아키텍처

  • Datomic Pro는 여러 협력 서비스로 구성됨.
  • Transactors는 쓰기 트랜잭션을 실행하고 인덱스를 유지하며 데이터를 저장소에 기록함.
  • Peers는 두꺼운 클라이언트로, JVM 라이브러리를 포함하여 트랜잭션을 제출하고 쿼리를 실행하며 결과를 캐시함.
  • Clients는 얇은 클라이언트로, 트랜잭션과 쿼리를 peer 서버로 전달함.
  • 로그에 각 트랜잭션을 시간 순서대로 추가함.
  • CassandraDynamoDB와 같은 데이터 저장소에 영구적이고 불변적인 트리로 저장됨.
  • Sequential CaS 연산을 사용하여 글로벌 트랜잭션 순서를 보장함.
  • Peers는 저장소와 transactors에 직접 연결됨.

# 1.2 트랜잭션 모델

  • Datomic은 독특한 트랜잭션 모델을 가짐.
  • 읽기쓰기 경로를 엄격히 분리함.
  • 읽기는 데이터베이스의 불변 상태를 얻음.
  • 쓰기 트랜잭션은 연산의 정렬된 리스트로 표현됨.
  • 트랜잭션 함수는 데이터베이스 상태를 읽고 새로운 연산 집합을 반환함.
  • 트랜잭션 함수는 호출자에게 값을 반환하지 않음.
  • 트랜잭션은 효과만 반환함.
  • NuBank는 Datomic을 사용하여 금융 서비스를 제공함.

# 1.3 일관성

  • ACID 트랜잭션을 광고하며, 일관성 모델과 내구성 보장을 명확히 약속함.
  • 트랜잭션은 단일 원자적 쓰기로 저장됨.
  • 모든 피어는 특정 시점까지 완료된 트랜잭션을 봄.
  • Serializable 트랜잭션을 보장함.
  • d/sync를 호출하여 최신 상태를 동기화할 수 있음.
  • 단일 쓰기 시스템으로 설계되었으나, 여러 transactor가 동시에 실행될 수 있음.

# 2 테스트 설계

  • Jepsen 테스트 라이브러리를 사용하여 Datomic 테스트 스위트를 설계함.
  • Datomic Pro 1.0.7075를 Debian Bookworm 노드 클러스터에 설치함.
  • DynamoDB 테이블을 AWS에 프로비저닝함.
  • TransactorsPeers를 포함한 다양한 노드에서 테스트를 실행함.
  • HTTP API를 통해 테스트 스위트 작업을 수행함.
  • 네트워크 파티션Garbage Collection을 포함한 다양한 오류를 주입함.
  • systemd 서비스를 사용하여 transactors를 재시작함.

# 2.1 리스트 추가

  • Elle 트랜잭션 검사기를 사용하여 리스트 추가 작업을 설계함.
  • 각 리스트는 기본 키로 식별됨.
  • 읽기추가 작업을 포함한 트랜잭션을 수행함.
  • Datomic은 다중 값 속성을 정렬되지 않은 집합으로 저장함.
  • 트랜잭션 함수를 사용하여 읽기-쓰기 트랜잭션을 표현함.

# 2.2 CaS를 사용한 리스트 추가

  • db/cas 함수를 사용하여 속성의 동시 업데이트를 제어함.
  • 스냅샷 격리를 보장하기 위해 CaS 패턴을 사용함.
  • 각 리스트를 단일 값, 쉼표로 구분된 문자열로 인코딩함.

# 2.3 내부 일관성

  • 내부 일관성을 측정하기 위한 작업을 설계함.
  • 속성 값을 여러 번 변경하거나, 사실을 추가 및 제거하는 트랜잭션을 포함함.
  • CaS 연산을 여러 번 수행함.

# 2.4 승인

  • 승인거부를 시뮬레이션하는 상태 머신을 설계함.
  • 승인거부 함수는 각각의 상태를 확인하고, 트랜잭션을 중단함.

# 3 결과

  • Datomic의 핵심 안전성 주장에 위배되는 행동을 발견하지 못함.
  • 트랜잭션은 총 순서대로 실행된 것처럼 보임.
  • **(d/sync conn)**을 사용한 읽기 트랜잭션은 실시간 순서와 일치함.
  • 내부 일관성은 Datomic의 문서와 일치하지만, 일반적인 데이터베이스 동작과는 다름.

# 3.1 내부 일관성

  • 대부분의 데이터베이스는 트랜잭션 내에서 직렬 실행 의미론을 제공함.
  • Datomic은 트랜잭션 내의 모든 연산을 동시 실행으로 처리함.
  • 트랜잭션 함수는 트랜잭션 시작 시점의 데이터베이스 상태만을 관찰함.
  • 단일 카디널리티 속성에 대해 충돌이 발생하면 트랜잭션이 중단됨.

# 3.2 가상 쓰기 왜곡

  • 트랜잭션 함수가 동시 실행되므로, 개별적으로는 올바른 함수가 함께 실행될 때 잘못된 결과를 초래할 수 있음.
  • 승인거부 함수가 같은 트랜잭션에서 호출되면, 승인과 거부가 동시에 발생할 수 있음.
  • Datomic의 문서와 일치하지만, 사용자에게는 놀라울 수 있음.

# 3.3 엔티티 조건자

  • 엔티티 조건자를 사용하여 데이터베이스 불변성을 보장할 수 있음.
  • 유형, 고유성, 임의 조건자를 포함한 다양한 제약 조건을 제공함.
  • 엔티티 조건자는 데이터베이스의 전체 상태를 검사하여 트랜잭션을 허용할지 결정함.
  • 승인거부 함수에 엔티티 조건자를 추가하여 불변성을 보장함.

GN⁺의 의견

  • Datomic은 시간적 데이터베이스로, 데이터의 과거 상태를 쉽게 조회할 수 있어 금융 서비스와 같은 기록 시스템에 매우 유용함.
  • 트랜잭션 함수의 동시 실행 모델은 성능을 높이지만, 사용자에게는 익숙하지 않을 수 있음.
  • 엔티티 조건자를 통해 복잡한 데이터 무결성 제약 조건을 쉽게 구현할 수 있음.
  • NuBank와 같은 대규모 금융 서비스에서 사용되고 있어, 안정성과 확장성이 검증됨.
  • Datomic의 독특한 트랜잭션 모델은 기존 데이터베이스와는 다른 사고방식을 요구하므로, 학습 곡선이 있을 수 있음.
Hacker News 의견

해커뉴스 댓글 모음 요약

  • 흥미로운 논의와 문서 개선

    • 작업 과정에서 논의가 매우 흥미로웠음. Jepsen이 치명적인 버그를 발견하지 않은 것도 놀라웠음. 문서와 의도된 비정상 동작을 명확히 한 것이 유용한 결과였음. Datomic을 사용하는 은행 운영에 자신감을 주는 유익한 연습이었음.
  • Datomic의 트랜잭션 행동 이해

    • Jepsen 보고서를 처음 깊이 읽어봤는데, Datomic의 트랜잭션 행동에 대한 명확한 설명이 마음에 들었음. SQL 데이터베이스와의 차이를 잘 이해하지 못했음을 깨달음. Datomic의 트랜잭션 구조와 요소 명칭 변경이 눈에 띔.
  • Datomic 보고서의 가치

    • 매우 상세한 보고서로 좋은 데이터베이스에 대한 훌륭한 분석임. 문서가 명확해지고 업데이트된 것도 기쁨. Apple이 FoundationDB에 대해 Jepsen 분석을 의뢰했으면 좋겠다는 생각도 있음.
  • Jepsen 이름의 유래

    • Jepsen이라는 이름은 가수 Carly Rae Jepsen에서 따온 것임. 분산 시스템 연구에 완벽한 이름이라고 생각함.
  • Clojure 프로그램 작성에 도움

    • 항상 훌륭한 작업임. 이러한 시스템에 대해 배우고 Clojure 프로그램 작성에 도움이 되는 작은 정보들을 얻기 위해 읽는 것을 좋아함.
  • Datomic-like 데이터스토어 구축

    • 최근에 Datomic-like 데이터스토어를 구축하고 있어서 이 보고서가 유용할 것 같음. MongoDB 분석도 즐겼으며, Redis, RethinkDB 등의 분석도 확인해보길 권장함.
  • Datomic의 데이터 모델

    • Datomic의 데이터 모델은 트리플 스토어/RDF에 익숙하다면 직관적임. 그러나 문서나 온라인 논의에서 자주 언급되지 않음. 사람들이 이러한 개념에 익숙하지 않아서인지, 아니면 의미 웹과의 연관성이 혼란을 줄 수 있어서인지 궁금함.
  • Datomic의 문서 명확화

    • Jepsen이 불변성 위반 상황을 명확히 했지만, Datomic의 접근 방식은 문서를 명확히 하는 것에 중점을 둔 것 같음. Datomic 팀이 이러한 위반을 사용자 오류로 간주하고 있는 것 같음.
  • 단일 스레드 설계의 장점

    • 단일 스레드로 쓰기 작업을 처리하는 설계 결정이 효과적이었음. Datomic은 훌륭한 설계의 산물이며, 다시 사용해보고 싶음.
  • Datomic의 트랜잭션 특성

    • Datomic을 많이 사용해보지 않았지만, 트랜잭션이 기본적으로 배치 처리라는 점에서 놀랍지 않음. 단일 스레드로 작동하여 경쟁 조건이 적고, 설계상 느리지만 안전함.