# 제프슨: Datomic Pro 1.0.7075 분석

> Clean Markdown view of GeekNews topic #14852. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14852](https://news.hada.io/topic?id=14852)
- GeekNews Markdown: [https://news.hada.io/topic/14852.md](https://news.hada.io/topic/14852.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-05-17T08:33:37+09:00
- Updated: 2024-05-17T08:33:37+09:00
- Original source: [jepsen.io](https://jepsen.io/analyses/datomic-pro-1.0.7075)
- Points: 1
- Comments: 1

## Topic Body

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

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

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

#### # 1.1 아키텍처
- **Datomic Pro**는 여러 협력 서비스로 구성됨.
- **Transactors**는 쓰기 트랜잭션을 실행하고 인덱스를 유지하며 데이터를 저장소에 기록함.
- **Peers**는 두꺼운 클라이언트로, JVM 라이브러리를 포함하여 트랜잭션을 제출하고 쿼리를 실행하며 결과를 캐시함.
- **Clients**는 얇은 클라이언트로, 트랜잭션과 쿼리를 **peer 서버**로 전달함.
- **로그**에 각 트랜잭션을 시간 순서대로 추가함.
- **Cassandra**나 **DynamoDB**와 같은 데이터 저장소에 **영구적이고 불변적인 트리**로 저장됨.
- **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에 프로비저닝함.
- **Transactors**와 **Peers**를 포함한 다양한 노드에서 테스트를 실행함.
- **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**의 독특한 트랜잭션 모델은 기존 데이터베이스와는 다른 사고방식을 요구하므로, **학습 곡선**이 있을 수 있음.

## Comments



### Comment 25318

- Author: neo
- Created: 2024-05-17T08:33:38+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40369467) 
##### 해커뉴스 댓글 모음 요약

* **흥미로운 논의와 문서 개선**
  - 작업 과정에서 논의가 매우 흥미로웠음. 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을 많이 사용해보지 않았지만, 트랜잭션이 기본적으로 배치 처리라는 점에서 놀랍지 않음. 단일 스레드로 작동하여 경쟁 조건이 적고, 설계상 느리지만 안전함.
