GN⁺: 데이터베이스 기초
(tontinton.com)bashdb
의 기본
- 가장 간단한 데이터베이스 프로그램인
bashdb
는 두 개의 bash 함수로 구성됨. -
db_set
함수는 데이터를 파일에 추가하고,db_get
함수는 데이터를 검색함. -
bashdb
의 문제점으로 내구성, 원자성, 고립성, 성능 등이 있음.
bashdb
를 ACID로 개선하기
- ACID는 원자성, 일관성, 고립성, 내구성을 의미하는 데이터베이스 트랜잭션의 속성임.
-
bashdb
의 내구성을 개선하기 위해db_set
에sync
명령어를 추가함. - 고립성을 위해
flock
프로그램을 사용하여 파일 잠금을 추가함.
내구성
-
fsync
와fdatasync
는 쓰기 버퍼를 디스크에 플러시하는 시스템 호출임. -
sync
명령어는 모든 '더러운' 페이지를 디스크에 플러시하며,-d
플래그는fdatasync
를 호출함.
고립성
-
flock
을 사용하여bashdb
에 다중 프로세스 고립성을 제공함. -
flock
은 파일 잠금을 위한 리눅스 프로그램으로,-s
플래그를 사용하여 동시 읽기를 허용함.
나쁜 소식
-
bashdb
로 원자성을 보장하는 간단한 방법을 찾을 수 없음. - 성능 향상을 위해
O(n)
알고리즘을 개선할 필요가 있음.
저장 엔진
- 저장 엔진의 목적은 지속적인 저장소에 데이터를 읽고 쓰는 추상화를 제공하는 것임.
- 저장 엔진 설계는 디스크 I/O와 디스크 탐색을 최소화하는 것을 목표로 함.
가변 B-트리
- B-트리는 BST의 공간적 국소성을 갖는 변형으로, 디스크 I/O와 탐색을 최소화함.
- B-트리는 노드가 더 많은 자식을 가질 수 있게 일반화된 BST임.
불변 LSM 트리
- LSM 트리는 쓰기 중심의 워크로드에 유리한 순차적으로 쓰여진 불변 데이터 구조임.
- LSM 트리는 메모리에 데이터를 버퍼링하고, 일정 용량에 도달하면 정렬된 SSTable로 플러시함.
블룸 필터
- 블룸 필터는 집합 내에 항목이 존재하지 않는지 효율적으로 확인할 수 있는 확률적 데이터 구조임.
- 블룸 필터는 해시 함수를 사용하여 작동하며, 공간 복잡도가
O(log n)
임.
Write Ahead Log
- WAL은 모든 트랜잭션 작업을 로그하는 특별한 파일로, 데이터베이스 프로세스가 시작될 때 상태를 재구성함.
고립성
- 고립성을 달성하기 위해 비관적 잠금, 낙관적 잠금 또는 MVCC를 사용할 수 있음.
- ANSI/ISO 표준 SQL 92는 다양한 읽기 고립 수준을 정의함.
분산 시스템
- 분산 시스템은 복잡성을 추가하며, 가용성과 수평적 확장을 위해 데이터를 여러 기계에 분산시킬 수 있음.
- CAP 이론에 따라 시스템은 일관성, 가용성, 분할 허용 중 두 가지만 보장할 수 있음.
일관된 해싱
- 일관된 해싱은 노드 추가 또는 제거 시 마이그레이션되는 항목의 양을 줄이는 데이터 분할 방법임.
GN⁺의 의견:
- 데이터베이스의 기본적인 문제와 ACID 속성에 대한 이해는 데이터베이스 엔지니어링의 핵심임.
-
bashdb
예제는 실제 데이터베이스 시스템에서 발생하는 문제를 이해하는 데 도움이 됨. - 저장 엔진과 분산 시스템의 설계는 데이터베이스의 성능과 신뢰성을 결정하는 중요한 요소임.
Hacker News 의견
-
첫 번째 댓글 요약:
- LSM 기반 데이터베이스의 특성 중 하나는 삭제된 레코드나 톰스톤(tombstone)이 오랫동안 남아 있다는 것임.
- 최종 레벨에서만 톰스톤을 건너뛰어야 하며, 모든 레벨에서 건너뛰면 안 됨.
- 그렇지 않으면 상위 레벨의 톰스톤이 제거되어 하위 레벨의 항목이 다시 나타날 수 있음.
- RocksDB와 같은 데이터베이스는 이 문제를 최적화하여 해결하려고 함.
-
두 번째 댓글 요약:
- 분산 시스템을 배우는 것을 피하면 위험할 수 있음.
- 실제로 모든 비트리비얼(중요하지 않은) 생산 시스템은 분산 시스템임.
- 데이터베이스가 복제 세트인 경우, 그것은 분산 시스템임.
- 분산 시스템에 대해 배우고 싶다면 jepsen.io와 raft.github.io를 확인할 것.
-
세 번째 댓글 요약:
- 일관성에 대해 데이터베이스 일관성과 애플리케이션 일관성이 있음.
- 한 테이블에서는 ACID(원자성, 일관성, 격리성, 지속성)를 달성할 수 있지만, 여러 테이블에 걸친 쓰기에서 실패할 수 있음.
- 여러 테이블을 동시에 업데이트하는 트랜잭션을 다룰 때, 모든 테이블이 동시에 업데이트되거나 전혀 업데이트되지 않아야 함.
-
네 번째 댓글 요약:
- 데이터베이스를 구축하는 데 관련된 다양한 개념에 대한 훌륭한 개요를 제공하는 글임.
- SIMD를 사용하여 단일 기계에서 성능을 끌어올리는 것부터 합의 알고리즘에 이르기까지 다룸.
- 데이터베이스 신뢰성과 분산 시스템에 적용되는 형식적 방법에 대한 언급이 있음.
- 아마존 S3 팀이 TLA+를 사용하여 모델링하는 방법에 대한 흥미로운 논문이 있음.
-
다섯 번째 댓글 요약:
- 많은 사람들이 SQL을 배워 데이터베이스를 배우지만, B-트리를 이해함으로써 RDBMS의 강점과 약점을 더 잘 이해할 수 있음.
- 인덱스를 추가하여 데이터베이스를 빠르게 하려고 하지만, 실제로는 문제를 가리는 것에 불과함.
- 일부 문제는 B-트리에 적합하지만, 많은 문제는 그렇지 않음.
- SQL은 원격 B-트리 시스템에 대한 쿼리 인터페이스에 불과함.
-
여섯 번째 댓글 요약:
- 많은 개발자들이 어느 시점에서 자신만의 작은 데이터베이스를 만들어보는 단계를 거침.
- 이 과정을 통해 무엇이 작동하지 않는지에 대해 많은 것을 배울 수 있음.
- 자신만의 데이터베이스를 만드는 것은 기존 솔루션에 대한 존중을 높이는 데 도움이 됨.
- 디스크로부터 데이터를 빠르고 신뢰성 있게 전송하는 것이 어려운 일임.
-
일곱 번째 댓글 요약:
- Bash 버전에서 원자성은 파일을 임시 파일로 복사한 다음 수정하고
sync; mv; sync
를 사용하여 달성할 수 있음.
- Bash 버전에서 원자성은 파일을 임시 파일로 복사한 다음 수정하고
-
여덟 번째 댓글 요약:
- 문서 API가 MongoDB와 유사하고, 리더가 없는 복제가 Cassandra와 유사하며, 스레드당 코어 아키텍처가 ScyllaDB와 유사한 매우 멋진 디자인임.
- 이 모든 것이 Rust로 구현되었음.
-
아홉 번째 댓글 요약:
- 'Database Internals'라는 책이 놀라울 정도로 훌륭하며, 내부에 대한 심층적인 탐구를 제공함.
- 다른 비슷한 책이 있는지 물어봄.
-
열 번째 댓글 요약:
- 'Database Design and Implementation'이라는 책도 자바로 작성된 많은 예제와 함께 매우 훌륭한 독서임.
- 실제 연구를 위해서는 Andy (Pavlo), Viktor Leis, Thorsten Grust, Thomas Neumann 등의 작업을 추천함.