5P by neo 7달전 | favorite | 댓글 1개

bashdb의 기본

  • 가장 간단한 데이터베이스 프로그램인 bashdb는 두 개의 bash 함수로 구성됨.
  • db_set 함수는 데이터를 파일에 추가하고, db_get 함수는 데이터를 검색함.
  • bashdb의 문제점으로 내구성, 원자성, 고립성, 성능 등이 있음.

bashdb를 ACID로 개선하기

  • ACID는 원자성, 일관성, 고립성, 내구성을 의미하는 데이터베이스 트랜잭션의 속성임.
  • bashdb의 내구성을 개선하기 위해 db_setsync 명령어를 추가함.
  • 고립성을 위해 flock 프로그램을 사용하여 파일 잠금을 추가함.

내구성

  • fsyncfdatasync는 쓰기 버퍼를 디스크에 플러시하는 시스템 호출임.
  • 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를 사용하여 달성할 수 있음.
  • 여덟 번째 댓글 요약:

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

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

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