# 데이터베이스 기초

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

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=12357](https://news.hada.io/topic?id=12357)
- GeekNews Markdown: [https://news.hada.io/topic/12357.md](https://news.hada.io/topic/12357.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2023-12-16T10:00:45+09:00
- Updated: 2023-12-16T10:00:45+09:00
- Original source: [tontinton.com](https://tontinton.com/posts/database-fundementals/)
- Points: 5
- Comments: 1

## Topic Body

### `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` 예제는 실제 데이터베이스 시스템에서 발생하는 문제를 이해하는 데 도움이 됨.
- 저장 엔진과 분산 시스템의 설계는 데이터베이스의 성능과 신뢰성을 결정하는 중요한 요소임.

## Comments



### Comment 21438

- Author: neo
- Created: 2023-12-16T10:00:46+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=38655066) 
- 첫 번째 댓글 요약:
  - LSM 기반 데이터베이스의 특성 중 하나는 삭제된 레코드나 톰스톤(tombstone)이 오랫동안 남아 있다는 것임.
  - 최종 레벨에서만 톰스톤을 건너뛰어야 하며, 모든 레벨에서 건너뛰면 안 됨.
  - 그렇지 않으면 상위 레벨의 톰스톤이 제거되어 하위 레벨의 항목이 다시 나타날 수 있음.
  - RocksDB와 같은 데이터베이스는 이 문제를 최적화하여 해결하려고 함.

- 두 번째 댓글 요약:
  - 분산 시스템을 배우는 것을 피하면 위험할 수 있음.
  - 실제로 모든 비트리비얼(중요하지 않은) 생산 시스템은 분산 시스템임.
  - 데이터베이스가 복제 세트인 경우, 그것은 분산 시스템임.
  - 분산 시스템에 대해 배우고 싶다면 jepsen.io와 raft.github.io를 확인할 것.

- 세 번째 댓글 요약:
  - 일관성에 대해 데이터베이스 일관성과 애플리케이션 일관성이 있음.
  - 한 테이블에서는 ACID(원자성, 일관성, 격리성, 지속성)를 달성할 수 있지만, 여러 테이블에 걸친 쓰기에서 실패할 수 있음.
  - 여러 테이블을 동시에 업데이트하는 트랜잭션을 다룰 때, 모든 테이블이 동시에 업데이트되거나 전혀 업데이트되지 않아야 함.

- 네 번째 댓글 요약:
  - 데이터베이스를 구축하는 데 관련된 다양한 개념에 대한 훌륭한 개요를 제공하는 글임.
  - SIMD를 사용하여 단일 기계에서 성능을 끌어올리는 것부터 합의 알고리즘에 이르기까지 다룸.
  - 데이터베이스 신뢰성과 분산 시스템에 적용되는 형식적 방법에 대한 언급이 있음.
  - 아마존 S3 팀이 TLA+를 사용하여 모델링하는 방법에 대한 흥미로운 논문이 있음.

- 다섯 번째 댓글 요약:
  - 많은 사람들이 SQL을 배워 데이터베이스를 배우지만, B-트리를 이해함으로써 RDBMS의 강점과 약점을 더 잘 이해할 수 있음.
  - 인덱스를 추가하여 데이터베이스를 빠르게 하려고 하지만, 실제로는 문제를 가리는 것에 불과함.
  - 일부 문제는 B-트리에 적합하지만, 많은 문제는 그렇지 않음.
  - SQL은 원격 B-트리 시스템에 대한 쿼리 인터페이스에 불과함.

- 여섯 번째 댓글 요약:
  - 많은 개발자들이 어느 시점에서 자신만의 작은 데이터베이스를 만들어보는 단계를 거침.
  - 이 과정을 통해 무엇이 작동하지 않는지에 대해 많은 것을 배울 수 있음.
  - 자신만의 데이터베이스를 만드는 것은 기존 솔루션에 대한 존중을 높이는 데 도움이 됨.
  - 디스크로부터 데이터를 빠르고 신뢰성 있게 전송하는 것이 어려운 일임.

- 일곱 번째 댓글 요약:
  - Bash 버전에서 원자성은 파일을 임시 파일로 복사한 다음 수정하고 `sync; mv; sync`를 사용하여 달성할 수 있음.

- 여덟 번째 댓글 요약:
  - 문서 API가 MongoDB와 유사하고, 리더가 없는 복제가 Cassandra와 유사하며, 스레드당 코어 아키텍처가 ScyllaDB와 유사한 매우 멋진 디자인임.
  - 이 모든 것이 Rust로 구현되었음.

- 아홉 번째 댓글 요약:
  - 'Database Internals'라는 책이 놀라울 정도로 훌륭하며, 내부에 대한 심층적인 탐구를 제공함.
  - 다른 비슷한 책이 있는지 물어봄.

- 열 번째 댓글 요약:
  - 'Database Design and Implementation'이라는 책도 자바로 작성된 많은 예제와 함께 매우 훌륭한 독서임.
  - 실제 연구를 위해서는 Andy (Pavlo), Viktor Leis, Thorsten Grust, Thomas Neumann 등의 작업을 추천함.
