TigerBeetle: 미션 크리티컬한 안전성과 성능을 위해 설계된 금융 트랜잭션 데이터베이스 문서입니다.
URL: https://docs.tigerbeetle.com/single-page/
이 문서는 TigerBeetle에 대한 문서입니다. TigerBeetle는 미션 크리티컬한 안전성과 성능을 위해 설계된 금융 트랜잭션 데이터베이스로, 향후 30년간의 OLTP를 뒷받침하도록 만들어졌습니다.
전체 문서는 다음과 같이 구성되어 있습니다:
이 문서는 TigerBeetle 사용자(사용하는 사람)를 대상으로 합니다. 내부 동작 원리를 이해하고 싶다면 internals docs를 확인하세요.
TigerBeetle는 금융 회계를 위한 신뢰할 수 있고 빠르며 고가용성(highly available)인 데이터베이스입니다. 금융 트랜잭션 또는 복식부기(double-entry bookkeeping)로 표현할 수 있는 모든 것을 추적합니다. 네트워크, 머신, 스토리지 장애가 발생하더라도 내구성(durability)을 보장하면서, 세 자릿수(1000배) 수준의 성능 향상을 제공합니다.
왜 이것이 중요하고 풀기 어려운 문제인지에 대해서는 Concepts 섹션에서 더 자세히 다루겠지만, 먼저 실제 트랜잭션을 만들어 보겠습니다!
TigerBeetle는 단일의 작고 정적으로 링크된 바이너리입니다.
tigerbeetle.com에서 사전 빌드된 바이너리를 다운로드할 수 있습니다:
Linux
curl -Lo tigerbeetle.zip https://linux.tigerbeetle.com && unzip tigerbeetle.zip
./tigerbeetle version
macOS
curl -Lo tigerbeetle.zip https://mac.tigerbeetle.com && unzip tigerbeetle.zip
./tigerbeetle version
Windows
powershell -command "curl.exe -Lo tigerbeetle.zip https://windows.tigerbeetle.com; Expand-Archive tigerbeetle.zip ."
.\tigerbeetle version
다른 옵션은 Installing을 참고하세요.
일반적으로 TigerBeetle는 6개 레플리카(replica)로 구성된 클러스터로 배포되며, 이는 Operating 섹션에서 설명합니다. 고가용성을 제공하지는 않지만 실험에는 편리한 단일 레플리카 클러스터를 실행할 수도 있습니다. 여기서는 그 방법으로 진행합니다.
먼저 데이터 파일을 포맷합니다:
./tigerbeetle format --cluster=0 --replica=0 --replica-count=1 --development ./0_0.tigerbeetle
TigerBeetle 레플리카는 모든 데이터를 단일 파일(이 경우 ./0_0.tigerbeetle)에 저장합니다. --cluster, --replica, --replica-count 인자는 클러스터 토폴로지(이 튜토리얼에서는 단일 레플리카)를 설정합니다.
이제 레플리카를 시작합니다:
./tigerbeetle start --addresses=3000 --development ./0_0.tigerbeetle
클라이언트 연결을 위해 3000 포트에서 리스닝합니다. 의도적으로 레플리카를 우아하게(gracefully) 종료하는 방법은 제공하지 않습니다. 자유롭게 ^C로 중단할 수 있으며, 기본 스토리지가 정상 동작한다면 데이터는 안전합니다. 실제로 6개 레플리카 클러스터에서는 스토리지가 일부 오동작하더라도 데이터가 안전합니다.
클러스터가 실행 중이므로, 클라이언트를 사용해 연결할 수 있습니다. TigerBeetle는 Python, Java, Node.js, .Net, Go 등 여러 인기 언어의 클라이언트를 제공하며, 더 많은 언어가 추가될 예정입니다. 자세한 내용은 Coding 섹션을 참고하세요.
이 튜토리얼에서는 단순하게 내장 CLI 클라이언트를 사용해 클러스터에 연결하겠습니다. 별도의 터미널에서 다음으로 REPL을 실행합니다:
./tigerbeetle repl --cluster=0 --addresses=3000
--addresses는 서버가 리스닝하는 포트입니다. --cluster는 클라이언트가 올바른 클러스터에 연결하는지 이중 확인하기 위해 필요합니다. 필수는 아니지만 운영자 실수를 방지하는 데 도움이 됩니다.
TigerBeetle는 미리 정의된 데이터베이스 스키마(복식부기)를 제공합니다. 왜 이 스키마를 선택했는지는 Concepts 섹션에서 설명하며, 모든 세부 기능은 Reference에 문서화되어 있습니다.
이 튜토리얼에서는 계정(account)이 credits와 debits 잔액을 보유하며, 각 이체(transfer)는 한쪽 계정의 credits를 증가시키고 다른 쪽의 debits를 증가시켜 두 계정 사이에 가치를 이동시킨다는 점만 이해하면 충분합니다.
REPL에서, 비어 있는 두 계정을 만들어 보겠습니다:
> create_accounts id=1 code=10 ledger=700, id=2 code=10 ledger=700;
> lookup_accounts id=1, id=2;
json{ "id": "1", "user_data": "0", "ledger": "700", "code": "10", "flags": [], "debits_pending": "0", "debits_posted": "0", "credits_pending": "0", "credits_posted": "0" } { "id": "2", "user_data": "0", "ledger": "700", "code": "10", "flags": "", "debits_pending": "0", "debits_posted": "0", "credits_pending": "0", "credits_posted": "0" }
이제 첫 번째 이체를 생성하고, 이후 계정 상태를 확인해 봅시다:
> create_transfers id=1 debit_account_id=1 credit_account_id=2 amount=10 ledger=700 code=10;
> lookup_accounts id=1, id=2;
json{ "id": "1", "user_data": "0", "ledger": "700", "code": "10", "flags": [], "debits_pending": "0", "debits_posted": "10", "credits_pending": "0", "credits_posted": "0" } { "id": "2", "user_data": "0", "ledger": "700", "code": "10", "flags": "", "debits_pending": "0", "debits_posted": "0", "credits_pending": "0", "credits_posted": "10" }
이체 금액이 credits와 debits 양쪽에 모두 더해지는 것을 확인할 수 있습니다. 어떤 경우에도 debits와 credits의 합이 항상 같게 유지된다는 점은 복식부기 시스템의 강력한 불변식(invariant)입니다.
빠른 시작은 여기까지입니다! 이제 데이터 파일을 포맷하고, 단일 레플리카 TigerBeetle 클러스터를 실행하고, 그 위에서 트랜잭션을 실행하는 방법을 알게 되었습니다. 다음 단계는 아래를 참고하세요:
최근 TigerBeetle 개발 소식을 따라가고 싶다면:
주의: 사용자가 제공한 원문이 매우 길어 단일 응답에 모두 포함하기 어렵습니다. 위에는 제공된 원문 중 시작(Start) 섹션까지를 한국어로 전체 번역했습니다. 나머지(Concepts/Coding/Operating/Reference 이하)도 동일한 방식으로 이어서 번역해 드릴 수 있으니, “계속 번역”이라고 요청하거나 원하는 섹션 범위를 지정해 주세요.