Datomic: basis data sistem pencatatan untuk tujuan umum
# Latar belakang Datomic
- Datomic adalah basis data untuk tujuan umum bagi sistem pencatatan.
- Status basis data direpresentasikan sebagai triple
[entity, attribute, value] (EAV), yang disebut datom.
- Skema mengontrol tipe dan kardinalitas atribut.
- Ini adalah basis data temporal yang memodelkan waktu secara eksplisit.
- Setiap transaksi diidentifikasi oleh stempel waktu logis
t dan waktu dinding txInstant.
- Transaksi dapat menambahkan atau menghapus datom.
- Semua datom mempertahankan referensi transaksi.
- Basis data adalah sekumpulan tuple yang terus bertambah.
# Fitur Datomic
- Pengguna dapat meminta status snapshot basis data pada waktu logis atau waktu dinding.
- Seluruh riwayat basis data dapat dilihat.
- Dapat di-query melalui API bergaya Datalog, API traversal graf deklaratif, dan tipe data
Entity bergaya ODM.
- Ada dua versi: Datomic Pro dan Datomic Cloud.
# 1.1 Arsitektur
- Datomic Pro terdiri dari beberapa layanan yang saling bekerja sama.
- Transactor mengeksekusi transaksi tulis, memelihara indeks, dan menulis data ke penyimpanan.
- Peer adalah klien tebal yang mencakup pustaka JVM untuk mengirim transaksi, menjalankan query, dan meng-cache hasil.
- Client adalah klien tipis yang meneruskan transaksi dan query ke server peer.
- Setiap transaksi ditambahkan ke log dalam urutan waktu.
- Data disimpan sebagai tree yang persisten dan immutable di penyimpanan data seperti Cassandra atau DynamoDB.
- Urutan transaksi global dijamin menggunakan operasi Sequential CaS.
- Peer terhubung langsung ke penyimpanan dan transactor.
# 1.2 Model transaksi
- Datomic memiliki model transaksi yang unik.
- Ia memisahkan secara ketat jalur baca dan jalur tulis.
- Pembacaan memperoleh status basis data yang immutable.
- Transaksi tulis direpresentasikan sebagai daftar operasi yang terurut.
- Fungsi transaksi membaca status basis data dan mengembalikan sekumpulan operasi baru.
- Fungsi transaksi tidak mengembalikan nilai kepada pemanggil.
- Transaksi hanya mengembalikan efek.
- NuBank menggunakan Datomic untuk menyediakan layanan keuangan.
# 1.3 Konsistensi
- Mengiklankan transaksi ACID, serta secara jelas menjanjikan model konsistensi dan jaminan durabilitas.
- Transaksi disimpan sebagai satu penulisan atomik.
- Semua peer melihat transaksi yang telah selesai hingga titik waktu tertentu.
- Menjamin transaksi Serializable.
- Status terbaru dapat disinkronkan dengan memanggil d/sync.
- Dirancang sebagai sistem penulis tunggal, tetapi beberapa transactor dapat berjalan secara bersamaan.
# 2 Desain pengujian
- Suite pengujian Datomic dirancang menggunakan pustaka pengujian Jepsen.
- Datomic Pro 1.0.7075 dipasang pada klaster node Debian Bookworm.
- Tabel DynamoDB diprovisikan di AWS.
- Pengujian dijalankan pada berbagai node termasuk Transactor dan Peer.
- Operasi suite pengujian dilakukan melalui HTTP API.
- Berbagai kegagalan disuntikkan, termasuk partisi jaringan dan Garbage Collection.
- Layanan systemd digunakan untuk me-restart transactor.
# 2.1 Penambahan daftar
- Operasi penambahan daftar dirancang menggunakan pemeriksa transaksi Elle.
- Setiap daftar diidentifikasi dengan kunci primer.
- Transaksi dilakukan yang mencakup operasi baca dan tambah.
- Datomic menyimpan atribut multi-nilai sebagai set tak berurutan.
- Fungsi transaksi digunakan untuk merepresentasikan transaksi baca-tulis.
# 2.2 Penambahan daftar dengan CaS
- Fungsi db/cas digunakan untuk mengontrol pembaruan serentak pada atribut.
- Pola CaS digunakan untuk menjamin snapshot isolation.
- Setiap daftar dienkode sebagai string bernilai tunggal yang dipisahkan koma.
# 2.3 Konsistensi internal
- Operasi dirancang untuk mengukur konsistensi internal.
- Mencakup transaksi yang mengubah nilai atribut beberapa kali, atau menambahkan dan menghapus fakta.
- Melakukan operasi CaS beberapa kali.
# 2.4 Persetujuan
- Sebuah mesin status dirancang untuk mensimulasikan persetujuan dan penolakan.
- Fungsi persetujuan dan penolakan masing-masing memeriksa statusnya lalu membatalkan transaksi.
# 3 Hasil
- Tidak ditemukan perilaku yang melanggar klaim keselamatan inti Datomic.
- Transaksi tampak dieksekusi dalam urutan total.
- Transaksi baca yang menggunakan (d/sync conn) konsisten dengan urutan waktu nyata.
- Konsistensi internal sesuai dengan dokumentasi Datomic, tetapi berbeda dari perilaku basis data pada umumnya.
# 3.1 Konsistensi internal
- Sebagian besar basis data menyediakan semantik eksekusi serial di dalam transaksi.
- Datomic memperlakukan semua operasi dalam transaksi sebagai eksekusi serentak.
- Fungsi transaksi hanya mengamati status basis data pada saat transaksi dimulai.
- Jika terjadi konflik pada atribut berkardinalitas tunggal, transaksi dibatalkan.
# 3.2 Write skew virtual
- Karena fungsi transaksi dijalankan secara serentak, fungsi yang benar secara individual dapat menghasilkan hasil yang salah saat dijalankan bersama.
- Jika fungsi persetujuan dan penolakan dipanggil dalam transaksi yang sama, persetujuan dan penolakan dapat terjadi secara bersamaan.
- Hal ini sesuai dengan dokumentasi Datomic, tetapi bisa mengejutkan bagi pengguna.
# 3.3 Predikat entitas
- Predikat entitas dapat digunakan untuk menjamin invarian basis data.
- Menyediakan berbagai kendala termasuk tipe, keunikan, dan predikat arbitrer.
- Predikat entitas memeriksa seluruh status basis data untuk menentukan apakah transaksi akan diizinkan.
- Invarian dijamin dengan menambahkan predikat entitas ke fungsi persetujuan dan penolakan.
Opini GN⁺
- Datomic adalah basis data temporal yang sangat berguna untuk sistem pencatatan seperti layanan keuangan, karena memudahkan penelusuran status data di masa lalu.
- Model eksekusi serentak dari fungsi transaksi meningkatkan performa, tetapi mungkin tidak familier bagi pengguna.
- Melalui predikat entitas, kendala integritas data yang kompleks dapat diimplementasikan dengan mudah.
- Karena digunakan oleh layanan keuangan berskala besar seperti NuBank, stabilitas dan skalabilitasnya telah terbukti.
- Model transaksi unik Datomic menuntut cara berpikir yang berbeda dari basis data tradisional, sehingga mungkin memiliki kurva pembelajaran.
1 komentar
Komentar Hacker News
Ringkasan kumpulan komentar Hacker News
Diskusi menarik dan perbaikan dokumentasi
Memahami perilaku transaksi Datomic
Nilai laporan Datomic
Asal-usul nama Jepsen
Membantu menulis program Clojure
Membangun datastore mirip Datomic
Model data Datomic
Klarifikasi dokumentasi Datomic
Kelebihan desain single-thread
Karakteristik transaksi Datomic