8 menit

Distributed SQL: Kapan Menggunakan Spanner, CockroachDB, YugabyteDB

Pelajari kapan distributed SQL layak menanggung biayanya, perbandingan Spanner, CockroachDB, dan YugabyteDB, serta cara merencanakan beban kerja multi-region dengan aman.

Distributed SQL: Kapan Menggunakan Spanner, CockroachDB, YugabyteDB

Arti distributed SQL

Distributed SQL adalah arsitektur database relasional yang menyebarkan data dan pemrosesan transaksi ke banyak mesin, tetapi menyajikannya sebagai satu database SQL logis bagi aplikasi. Sistem ini tetap menyediakan tabel, join, indeks, constraint, dan transaksi ACID, lalu menambahkan partisi otomatis, replikasi, serta pemulihan kegagalan.

Sebuah sistem umumnya termasuk kategori ini bila memiliki:

  • Skema relasional dan antarmuka kueri SQL
  • Penskalaan horizontal di seluruh node database
  • Konsistensi transaksional lintas partisi
  • Replikasi dan failover otomatis
  • Operasi terkoordinasi sebagai satu database logis

Definisi ini penting. Menambahkan read replica ke PostgreSQL atau MySQL belum menjadikannya distributed SQL. Primary dengan replika tetap mengirim penulisan melalui satu server utama. Sharding yang dikelola aplikasi memang menyebarkan penulisan, tetapi aplikasi harus menentukan lokasi catatan dan perilaku operasi lintas shard. Distributed SQL memindahkan banyak tanggung jawab itu ke database.

Posisi di antara RDBMS konvensional dan NoSQL

Distributed SQL menggabungkan model pemrograman relasional dari RDBMS biasa dengan desain scale-out dari penyimpanan data terdistribusi. PostgreSQL dan MySQL tradisional bekerja baik selama satu primary dapat menangani penulisan dan kegagalan regional tidak menuntut penulisan terus berjalan di lokasi lain. Read replica, cache, connection pool, dan indeks yang lebih baik dapat memperpanjang model ini selama bertahun-tahun.

Banyak database NoSQL memudahkan distribusi dengan membatasi join, transaksi, atau jaminan konsistensi. Pilihan itu tetap masuk akal untuk event stream besar, cache sementara, dan catatan yang jarang terlibat dalam transaksi multi-baris. Klaster relasional memerlukan koordinasi lebih besar karena aplikasi mengharapkan constraint dan transaksi tetap valid setelah data dibagi ke banyak node.

Perbedaan praktisnya terletak pada pemilik kompleksitas. Pada sharding manual, tim aplikasi membuat routing, menyeimbangkan ulang data, mengoordinasikan perubahan skema, serta menangani operasi yang menyentuh beberapa shard. Pada distributed SQL, database menyediakan mekanisme itu, walaupun engineer tetap harus merancang skema dan kueri untuk sistem berbasis jaringan.

Masalah yang ingin diselesaikan

Distributed SQL dirancang untuk aplikasi yang kebutuhan ketersediaan, penempatan geografis, atau pertumbuhan penulisannya sudah melampaui arsitektur single-primary. Contohnya SaaS global, sistem reservasi yang tidak boleh menjual melebihi kapasitas, dan buku besar keuangan yang invariant-nya harus bertahan saat node gagal.

Sistem ini dapat menghilangkan kebutuhan sharding di tingkat aplikasi, mengurangi ketergantungan pada satu lokasi tulis, dan menempatkan data dekat pengguna atau di yurisdiksi yang disetujui. Namun ada harga yang dibayar: replika lebih banyak, trafik jaringan lebih besar, koordinasi lebih sering, serta mode kegagalan yang tidak ada pada satu server.

Database relasional terkelola biasa tetap menjadi pilihan awal yang lebih baik jika beban kerja nyaman dalam satu region. Distributed SQL layak ketika sharding kustom, failover regional, atau kontrol data geografis akan berkembang menjadi sistem rekayasa besar tersendiri.

Cara kerja distributed SQL

Distributed SQL membagi data menjadi partisi yang direplikasi lalu mengoordinasikan perubahan melalui konsensus dan protokol transaksi terdistribusi. SQL menyembunyikan banyak mekanisme ini, tetapi perilakunya tetap memengaruhi latensi, throughput, rancangan skema, dan respons insiden.

Partisi menentukan lokasi catatan

Klaster membagi tabel logis menjadi unit kecil yang dapat berpindah antar-node secara mandiri. Spanner menyebutnya split, CockroachDB memakai range, dan YugabyteDB memakai tablet. Setiap unit mencakup sebagian keyspace tabel atau indeks.

Batas partisi dapat mengikuti range, hash, atau aturan geografis eksplisit. Range yang diurutkan berdasarkan pengenal pelanggan memudahkan pemindaian catatan terkait, tetapi pengenal yang terus meningkat dapat mengarahkan penulisan baru ke satu partisi. Distribusi hash lebih merata, meski pemindaian berurutan dan penempatan tenant menjadi lebih sulit. Banyak skema produksi menggabungkan pengenal tenant dengan nilai lain agar data terkait tetap mudah diakses tanpa memusatkan semua penulisan.

Indeks sekunder juga membutuhkan penyimpanan terdistribusi. Satu penulisan baris dapat memperbarui tabel dasar dan beberapa entri indeks di partisi berbeda. Indeks yang murah pada satu server dapat menambah kerja konsensus dan trafik jaringan dalam klaster.

Replikasi dan konsensus melindungi setiap partisi

Setiap partisi biasanya memiliki beberapa replika, dan grup konsensus menentukan urutan perubahan yang diterima. CockroachDB dan YugabyteDB menggunakan replikasi berbasis Raft. Spanner menggunakan replikasi berbasis Paxos bersama infrastruktur waktunya.

Leader atau leaseholder mengoordinasikan penulisan untuk grup replika. Perubahan dicatat pada cukup replika untuk membentuk kuorum sebelum dianggap committed. Jika sebuah node hilang, anggota yang tersisa dapat memilih atau menetapkan koordinator lain selama kuorum tetap tersedia.

Kuorum adalah persyaratan matematis, bukan janji bahwa semua kegagalan aman. Grup dengan tiga replika umumnya dapat menoleransi satu replika tidak tersedia. Jika dua anggota hilang, satu salinan tersisa tidak dapat menerima penulisan dengan aman karena tidak dapat membuktikan bahwa mayoritas lain belum membuat kemajuan di tempat lain. Penempatan di berbagai domain kegagalan sama pentingnya dengan jumlah replika.

Transaksi terdistribusi mengoordinasikan beberapa partisi

Transaksi yang menyentuh satu partisi sering selesai dengan koordinasi terbatas. Transaksi yang melibatkan beberapa partisi memerlukan satu keputusan commit agar semua peserta menerapkan penulisannya atau membatalkannya.

Protokol tepatnya berbeda per produk, tetapi biasanya meliputi membaca atau mengunci versi terkait, memvalidasi perubahan bersamaan, mereplikasi intent atau catatan sementara, lalu menyelesaikan commit. Transaksi panjang memperbesar peluang konflik. Batch besar dapat melibatkan banyak grup konsensus dan memicu lonjakan latensi meski setiap pernyataan terlihat sederhana.

Karena itu, rancang transaksi dengan mempertimbangkan jaringan. Kelompokkan baris terkait di bawah awalan partisi yang cocok bila database mendukungnya. Buat transaksi singkat, jangan menunggu layanan eksternal saat transaksi terbuka, dan jangan memasukkan ribuan catatan tak terkait ke satu unit atomik tanpa mengukur dampaknya.

Waktu dan urutan memerlukan mekanisme khusus

Node terdistribusi tidak berbagi jam dinding yang benar-benar sinkron, sehingga tiap produk membutuhkan cara untuk mengurutkan transaksi. Spanner memakai batas ketidakpastian TrueTime dan commit waiting untuk memberi konsistensi eksternal. Sistem lain dapat menggabungkan jam fisik dengan komponen logis, pelacakan dependensi, dan protokol transaksi.

Koordinasi waktu memengaruhi eksekusi serializable, follower read, dan snapshot. Gunakan timestamp transaksi dari database, bukan berasumsi bahwa timestamp dari server aplikasi terpisah membentuk urutan global yang andal.

Lokalitas mengatur jalur jaringan

Konfigurasi lokalitas menentukan lokasi replika dan region mana yang mengoordinasikan penulisan sebuah catatan. Pembacaan dapat cepat bila replika yang sesuai berada dekat pemanggil. Penulisan dengan urutan kuat tetap harus mencapai replika yang diperlukan untuk kuorum, sehingga latensinya mengikuti topologi yang dipilih.

Penempatan yang baik mengikuti beban kerja. Jika mayoritas penulisan tenant UE berasal dari Eropa, menempatkan koordinator tulis tenant itu di sana menghindari perjalanan antarbenua di awal setiap transaksi. Catatan yang dibagikan secara global, misalnya satu penghitung yang diperbarui semua region, tidak dapat lokal bagi setiap penulis dan dapat menjadi titik contention.

Kapan distributed SQL menjadi pilihan tepat

Distributed SQL tepat ketika ketahanan geografis, kapasitas tulis horizontal, atau ketepatan lintas partisi cukup penting untuk membenarkan biaya koordinasi terus-menerus. Perusahaan besar tidak otomatis membutuhkannya, dan produk kecil dapat membutuhkannya bila janji bisnis mencakup ketersediaan regional yang ketat.

Kondisi yang layak dievaluasi

Evaluasi serius tepat dilakukan bila beberapa kondisi ini berlaku:

  • Layanan harus tetap berjalan saat zona atau region mengalami gangguan
  • Kebutuhan tulis mendekati batas praktis satu database primary
  • Sharding manual akan menyita banyak waktu rekayasa aplikasi
  • Transaksi harus tetap benar lintas node atau lokasi
  • Catatan memerlukan penempatan geografis yang dapat ditegakkan

Dukung kondisi tersebut dengan angka. Tentukan recovery time objective, recovery point objective, latensi transaksi, laju tulis puncak, dan domain kegagalan. Permintaan global scale yang samar belum cukup untuk memilih arsitektur.

Pengguna regional saja bukan alasan penentu. Aplikasi kaya konten dapat menempatkan web server dan cache dekat pengguna sambil mempertahankan satu region database. Read replica dapat melayani penjelajahan regional bila hasil yang sedikit lama masih dapat diterima. Alasannya lebih kuat ketika pengguna di beberapa lokasi harus melakukan penulisan berlatensi rendah pada data terkait.

Kondisi yang lebih cocok dengan database sederhana

Layanan relasional konvensional biasanya lebih baik bila trafik sedang, penulisan berasal dari satu region, dan pemulihan dapat melibatkan promosi database terencana. Pilihan ini menawarkan tooling matang, kompatibilitas extension luas, debugging yang familier, dan biaya infrastruktur lebih kecil.

Kebutuhan latensi sangat ketat juga dapat mengarah ke satu primary regional. Penulisan lokal yang tahan lama dapat selesai jauh lebih cepat daripada penulisan kuorum lintas region. Sistem yang berat analitik biasanya perlu memisahkan transaksi operasional dari pemindaian panjang, bukan mengharapkan satu klaster unggul pada keduanya.

Kapasitas tim juga penting. Layanan terkelola mengurangi pekerjaan hardware, patching, dan control plane, tetapi tidak menghapus contention skema, retry transaksi, perencanaan kueri, manajemen kapasitas, atau penanganan insiden di sisi aplikasi. Bila tim tidak punya waktu menguji perilaku kegagalan, database terdistribusi dapat meningkatkan risiko.

Ambang keputusan berdasarkan alternatif

Alasan terkuat muncul ketika alternatifnya sudah rumit. Jika engineer akan membangun routing tenant, peta shard, aturan transaksi lintas shard, prosedur promosi regional, dan tooling migrasi terpisah, database yang menyediakan fungsi-fungsi itu patut dievaluasi serius.

Jika alternatifnya hanya satu PostgreSQL terkelola dengan read replica dan backup yang teruji, migrasi memerlukan bukti jelas. Benchmark sistem yang ada terlebih dahulu. CPU jenuh bisa disebabkan kueri tidak efisien, manajemen koneksi buruk, indeks berlebihan, atau cache yang kurang, bukan kebutuhan penulisan horizontal.

Konsistensi, ketersediaan, dan latensi

Distributed SQL biasanya menjaga konsistensi transaksional saat gagal dengan menolak operasi yang tidak dapat mencapai kuorum. Ini melindungi state yang telah committed, tetapi sebagian permintaan dapat gagal atau menunggu selama partisi jaringan.

CAP menjelaskan perilaku saat gagal

Teorema CAP berlaku ketika komunikasi antarbagian klaster terputus. Untuk data yang terdampak, sistem tidak dapat menjamin konsistensi linearizable dan respons sukses dari setiap sisi yang terisolasi. Database yang berorientasi pada konsistensi mengizinkan sisi berkuorum untuk melanjutkan dan menolak penulisan yang tidak aman di tempat lain.

CAP tidak menjelaskan latensi dalam operasi normal. Saat semua tautan berfungsi pun replika tetap harus berkomunikasi. Keputusan rekayasa mencakup perilaku saat partisi dan tingkat koordinasi yang dapat diterima aplikasi dalam kondisi sehat.

Aplikasi harus menangani hasil tidak tersedia secara eksplisit. Timeout, error transaksi yang dapat dicoba ulang, dan hilangnya region tulis sementara adalah kemungkinan normal. Mengembalikan sukses dari dua region yang terisolasi akan lebih buruk untuk saldo atau reservasi karena rekonsiliasi mungkin tidak memiliki jawaban otomatis yang valid.

Pembacaan kuat dan pembacaan sengaja lama berbeda

Pembacaan kuat melihat state database yang konsisten dengan jaminan urutan yang diminta. Sejumlah produk juga menyediakan follower read atau bounded-staleness read yang menukar kesegaran dengan latensi lebih rendah dan beban lebih kecil pada koordinator tulis.

Pilihan ini harus mengikuti data yang dibaca. Deskripsi produk sering dapat memakai replika yang sedikit lama. Kata sandi yang baru diubah, saldo akun saat ini, atau stok tersisa perlu memakai jalur strong atau session-consistent yang sesuai. Jangan menandai semua pembacaan sebagai stale demi kecepatan lalu membangun ulang ketepatan di kode layanan.

Uji read-your-writes dengan driver dan lapisan routing yang dipakai. Setelah pembaruan, permintaan berikutnya mungkin mencapai server aplikasi atau endpoint database lain. Token sesi, batas transaksi, atau pengaturan pembacaan kuat mungkin diperlukan agar pengguna melihat perubahan yang diterima.

Isolasi mengatur hasil bersamaan

Isolasi transaksi menentukan anomali apa yang dapat muncul dari transaksi bersamaan. Serializable isolation berusaha membuat transaksi yang selesai tampak seolah berjalan satu per satu, meski database mengeksekusinya bersamaan.

Eksekusi serializable dapat membatalkan satu peserta bila operasi bersamaan tidak dapat diurutkan dengan aman. Pembatalan itu melindungi dari hasil yang salah, bukan tanda korupsi database. Aplikasi perlu retry terbatas untuk seluruh transaksi, termasuk setiap pembacaan yang memengaruhi penulisannya.

Retry harus idempoten di luar database. Jika kode mengirim email atau memanggil penyedia pembayaran sebelum transaksi pasti committed, retry dapat mengulangi efek samping. Catat event outbox dalam transaksi database, commit, lalu biarkan worker terpisah mengirim aksi eksternal.

Jarak memberi batas bawah pada latensi tulis

Transaksi lintas region tidak dapat selesai lebih cepat dari pesan yang diperlukan protokolnya. Waktu bolak-balik 80 milidetik antara anggota kuorum menyumbang waktu nyata sebelum eksekusi kueri, pemeliharaan indeks, pekerjaan aplikasi, dan antrean dihitung.

Pola mahal sering berupa beberapa transaksi berurutan dalam satu aksi pengguna. Bila checkout menjalankan insert pesanan, reservasi inventaris, pembaruan status pembayaran, dan audit sebagai empat commit yang memblokir, biaya jaringan menumpuk. Menggabungkan perubahan database yang memiliki satu hasil atomik dapat menghapus perjalanan tambahan, sedangkan panggilan pembayaran eksternal harus tetap di luar transaksi terbuka.

Ukur latensi persentil, bukan rata-rata. Perpindahan leader, contention, storage stall, dan retry terlihat di ekor distribusi. Desain yang memenuhi target median tetapi gagal pada persentil ke-99 saat rebalancing biasa tetap dapat memunculkan kegagalan yang terasa pengguna.

Perbandingan Spanner, CockroachDB, dan YugabyteDB

Spanner, CockroachDB, dan YugabyteDB menyelesaikan masalah distribusi serupa, tetapi berbeda dalam model deployment, kompatibilitas, implementasi transaksi, dan asumsi operasional. Pilih berdasarkan pengujian perilaku aplikasi, bukan sekadar label SQL.

AreaGoogle SpannerCockroachDBYugabyteDB
Antarmuka SQL utamaGoogleSQL atau dialek PostgreSQLSQL kompatibel PostgreSQL melalui wire protocol PostgreSQLYSQL kompatibel PostgreSQL, serta YCQL bergaya Cassandra
Dasar replikasiGrup Paxos dengan pengurutan berbasis TrueTimeReplikasi Raft di seluruh rangeReplikasi Raft di seluruh tablet
Penyediaan umumDatabase Google Cloud terkelolaLayanan cloud terkelola atau deployment self-managedLayanan cloud terkelola atau deployment self-managed
Risiko portabilitasDialek dan perilaku khusus platformKesenjangan fitur, extension, dan semantik PostgreSQLPerbedaan versi dan fitur antara YSQL dan PostgreSQL
Kasus evaluasi alamiSistem Google Cloud yang membutuhkan penempatan transaksi globalTim yang menginginkan pengembangan berorientasi PostgreSQL dengan operasi terdistribusiTim yang menginginkan akses berorientasi PostgreSQL atau pilihan API SQL dan bergaya Cassandra

Spanner cocok untuk strategi Google Cloud terkelola

Spanner cocok bagi organisasi yang siap memakai database Google Cloud terkelola dan merancang berdasarkan dialek, topologi, serta model operasinya. TrueTime mendukung transaksi yang konsisten secara eksternal, artinya transaksi committed menghormati urutan waktu nyata dalam semantik yang didokumentasikan.

Dialek PostgreSQL dapat mengurangi perbedaan sintaks, tetapi bukan kesetaraan PostgreSQL penuh. Extension, fungsi administratif, katalog sistem, tipe data, driver, dan asumsi ORM tetap perlu diverifikasi. Inventarisasi semua ketergantungan database sebelum menganggap aplikasi yang ada portabel.

Spanner patut diperhatikan saat sistem yang diinginkan sudah bergantung pada identitas, jaringan, observabilitas, dan kontrol regional Google Cloud. Model terkelola menghapus administrasi node database, tetapi desain skema, tuning kueri, kuota, pengelolaan biaya, dan pemulihan aplikasi tetap menjadi tanggung jawab pelanggan.

CockroachDB cocok untuk aplikasi terdistribusi berorientasi PostgreSQL

CockroachDB cocok untuk tim yang menginginkan akses aplikasi bergaya PostgreSQL sambil menyebarkan data transaksional ke seluruh range. Secara default sistem ini memakai serializable isolation, sehingga aplikasi harus dapat me-retry transaksi yang ditolak karena contention atau konflik pengurutan.

Uji kompatibilitas pada lapisan migrasi, driver, dan ORM. Extension PostgreSQL dan perilaku khusus mungkin tidak tersedia atau berbeda. Kueri yang mengandalkan execution plan satu node juga dapat berubah setelah tabel dan indeks dibagi ke range.

Perpindahan range dan rebalancing otomatis memudahkan perubahan kapasitas, tetapi pilihan primary key yang buruk tetap dapat menghasilkan hot range. Abstraksi multi-region membantu menyatakan lokalitas tabel, tetapi developer harus menentukan catatan mana yang regional, mana yang global, dan di mana penulisan dikoordinasikan.

YugabyteDB cocok untuk kebutuhan YSQL dan API campuran

YugabyteDB cocok untuk aplikasi yang menghargai antarmuka relasional kompatibel PostgreSQL dan mungkin mendapat manfaat dari API terpisah yang kompatibel Cassandra. YSQL menyediakan tabel relasional dan transaksi terdistribusi, sedangkan YCQL mengikuti model data berbeda dan bukan jalur lain untuk setiap operasi YSQL.

Lapisan penyimpanannya menyebarkan data melalui tablet. Desain tabel, pemisahan tablet, penempatan indeks, dan cakupan transaksi memengaruhi penyebaran kerja di klaster. Aplikasi PostgreSQL tetap perlu menguji kompatibilitas extension, fungsi, tooling, dan perilaku planner.

Beragam pendekatan deployment dapat sesuai dengan kebijakan infrastruktur yang menuntut kontrol penempatan. Pada self-managed, kontrol itu memindahkan tanggung jawab operasional ke pelanggan: upgrade, prosedur perbaikan, kapasitas, observabilitas, sertifikat, backup, dan pengujian kegagalan semuanya perlu pemilik.

Uji produk yang berguna memakai bukti aplikasi

Jalankan beban kerja representatif yang sama pada tiap produk yang layak. Uji pembuatan skema, migrasi, SQL dari ORM, retry transaksi, restore backup, failover, event penskalaan, dan kueri dengan volume tertinggi.

Jangan membandingkan hanya transaksi per detik puncak. Catat latensi p50, p95, dan p99, tingkat konflik dan retry, byte yang berpindah antarregion, amplifikasi penyimpanan, waktu restore, serta upaya operator saat insiden simulasi. Pilihan terbaik memenuhi target ketepatan dan pemulihan dengan biaya serta beban operasional yang dapat diterima.

SaaS global dengan pengguna regional

Rancang Retry yang Lebih Aman
Buat alur pembayaran atau provisioning yang idempoten dengan constraint dan transaksi dalam hitungan menit.

Aplikasi SaaS global mendapat manfaat dari distributed SQL ketika tenant membutuhkan penempatan data regional dan akses transaksional tanpa stack database terpisah untuk setiap geografi. Desain paling efektif saat tenancy jelas dalam skema dan sebagian besar transaksi tetap berada dalam satu tenant.

Lokalitas tenant harus mengikuti kontrak dan trafik

Pengenal tenant dapat mengarahkan penempatan agar catatan Eropa tetap berada di lokasi Eropa yang disetujui, sementara catatan pelanggan lain berada di negara atau region dalam kontraknya. Ini mempertahankan satu skema logis sambil memungkinkan kebijakan fisik yang berbeda.

Aturan penempatan harus mencakup lebih dari tabel dasar. Entri indeks, change stream, data sementara, backup, dan data ekspor dapat memuat informasi yang diatur. Kebijakan yang mengunci baris tetapi mengirim indeks sekunder global ke lokasi lain dapat melanggar batas yang dimaksud.

Isolasi tenant juga memengaruhi kinerja. Tenant besar dapat membebani partisi bersama atau mendominasi node. Hashing atau subpartisi di dalam tenant mungkin diperlukan, tetapi harus tetap menjaga akses yang efisien untuk transaksi dalam cakupan tenant.

Pembacaan regional memerlukan kebijakan kesegaran eksplisit

Dashboard yang berat pembacaan dapat memakai replika terdekat jika data yang sedikit terlambat dapat diterima. Perubahan akun, keputusan otorisasi, dan layar konfirmasi pascatransaksi memerlukan perilaku lebih kuat. Klasifikasikan jalur kueri menurut kebutuhan kesegaran, bukan memakai satu pengaturan global.

Penempatan tulis sebaiknya mengikuti penulis normal tiap tenant. Jika staf pelanggan terutama bekerja di Singapura, mengoordinasikan penulisannya di benua lain menciptakan latensi yang dapat dihindari. Prosedur migrasi tenant harus memperbarui penempatan tanpa kehilangan penulisan, melanggar residensi, atau membiarkan cache aplikasi menunjuk lokasi lama.

Kode aplikasi global harus tahan terhadap perpindahan

Leader berpindah, node restart, dan routing berubah saat pemeliharaan. Driver memerlukan timeout, kebijakan retry, pembaruan koneksi, dan logika restart transaksi yang masuk akal. Gunakan jitter dan batas retry agar klaster yang sedang terbebani tidak menerima gelombang permintaan ulang yang serentak.

Pisahkan pemantauan latensi pengguna menurut region dan kelas tenant. Rata-rata global dapat menyembunyikan kelompok pelanggan jauh yang membayar beberapa perjalanan jaringan tambahan. Trace identifier yang menghubungkan span API dengan pernyataan database memudahkan menemukan kesalahan lokalitas.

Alur keuangan dan buku besar

Alur keuangan mendapat manfaat saat constraint dan transaksi database menegakkan invariant buku besar di tengah kegagalan dan permintaan bersamaan. Distribusi tidak otomatis membuat akuntansi benar, sehingga skema harus menyandikan aturan yang tidak boleh dilanggar.

Buku besar harus menyimpan urutan entri yang dapat diaudit

Buku besar berorientasi append mencatat setiap pergerakan sebagai entri, bukan terus mengganti satu nilai saldo tanpa riwayat. Setiap posting perlu pengenal transaksi stabil, akun, jumlah, mata uang, timestamp bisnis, dan metadata pembuatan. Aturan double-entry perlu diperiksa sebelum commit agar debit dan kredit seimbang untuk unit posting.

Saldo cache dapat mempercepat pembacaan, tetapi harus berubah dalam transaksi yang sama dengan entri atau diperlakukan jelas sebagai data turunan. Pekerjaan rekonsiliasi perlu membandingkan total turunan dengan entri sumber dan melaporkan selisih tanpa diam-diam menulis ulang riwayat.

Urutan global jarang diperlukan untuk setiap akun. Transaksi yang memengaruhi satu akun atau pasangan transfer perlu urutan konsisten, sedangkan akun tak terkait dapat berjalan bersamaan. Merancang menurut batas itu mengurangi contention dibanding satu sequence atau baris settlement global.

Idempotensi membuat retry aman

API pembayaran, antrean, dan webhook melakukan retry setelah timeout, sehingga setiap operasi bisnis memerlukan idempotency key yang stabil. Tegakkan keunikan dalam cakupan yang tepat, misalnya satu merchant atau akun, lalu buat catatan pembayaran dan entri buku besar dalam satu transaksi database.

CREATE TABLE payment_attempts (
    account_id UUID NOT NULL,
    idempotency_key TEXT NOT NULL,
    provider_reference TEXT,
    status TEXT NOT NULL,
    created_at TIMESTAMPTZ NOT NULL,
    PRIMARY KEY (account_id, idempotency_key)
);

Jika dua worker mengirim operasi yang sama, unique constraint menentukan insert yang berhasil. Worker yang kalah harus membaca catatan yang ada dan mengembalikan hasilnya. Jangan membuat tagihan penyedia kedua hanya karena transaksi database di-retry.

Panggilan eksternal memerlukan batas transaksi

Database tidak dapat commit secara atomik dengan penyedia pembayaran yang tidak terkait kecuali keduanya mengikuti protokol koordinasi khusus, yang umumnya tidak dilakukan API publik. Letakkan panggilan jaringan di luar transaksi database dan modelkan alur dengan state eksplisit seperti pending, authorized, captured, failed, dan reversed.

Transactional outbox dapat menerbitkan perubahan yang telah committed ke worker downstream. Konsumen harus melakukan deduplikasi berdasarkan pengenal event karena pengiriman pesan dapat terjadi lebih dari sekali. Pendekatan ini memberi pemrosesan yang dapat dipulihkan tanpa mengklaim satu transaksi yang mustahil di semua layanan.

Akun panas memerlukan desain khusus beban kerja

Payroll, settlement marketplace, dan merchant besar dapat memusatkan penulisan pada satu akun. Menambah node tidak membagi satu baris yang saling berkonflik. Pilihannya mencakup partisi entri immutable, akumulator per periode, antrean posting untuk satu akun, atau hierarki subakun yang didefinisikan dengan hati-hati.

Uji distribusi skew yang nyata. Trafik sintetis seragam dapat membuat klaster tampak siap, sementara satu merchant produksi menimbulkan konflik serializable berulang. Ketepatan tetap utama, tetapi model data perlu membuka concurrency yang aman bila aturan akuntansi mengizinkannya.

Inventaris, pemesanan, dan reservasi

Sistem inventaris dan pemesanan membutuhkan transaksi alokasi yang otoritatif ketika banyak pengguna dapat mengklaim item langka yang sama. Pembacaan ketersediaan yang cepat membantu penjelajahan, tetapi hanya jalur commit yang dapat menentukan siapa menerima unit terakhir.

Penulisan kondisional mencegah penjualan berlebih

Pembaruan kondisional dapat mencadangkan stok hanya jika jumlahnya cukup. Jumlah baris yang terpengaruh memberi tahu aplikasi apakah alokasi berhasil.

UPDATE inventory
SET available = available - 1
WHERE sku = $1
  AND available > 0;

Pernyataan ini harus berada dalam transaksi yang sama dengan catatan reservasi. Membaca ketersediaan lebih dulu lalu menguranginya kemudian menciptakan race, kecuali isolation level dan penanganan predicate melindungi keputusan tersebut. Constraint database harus menolak jumlah negatif sebagai lapisan pengaman tambahan.

Untuk kursi yang ditetapkan, unique constraint pada pengenal pertunjukan dan kursi menghasilkan satu reservasi pemenang. Inventaris hotel sering dimodelkan menurut room-night atau tanggal pool inventaris agar masa inap yang tumpang tindih tidak dapat mengklaim kapasitas sama. Unit contention yang tepat berasal dari aturan bisnis.

Hold memisahkan alokasi dari pembayaran

Hold sementara mencadangkan inventaris selama pembayaran atau konfirmasi pengguna berlangsung. Simpan waktu kedaluwarsa dan statusnya, lalu ubah menjadi reservasi terkonfirmasi melalui transaksi kondisional. Worker kedaluwarsa hanya boleh melepas hold yang masih aktif karena konfirmasi dan kedaluwarsa dapat berlomba.

Penundaan jam dinding saja tidak menjamin pelepasan. Worker dapat berhenti, antrean dapat terlambat, dan region dapat gagal. Kueri yang menghitung inventaris yang dapat dijual harus memperhitungkan status kedaluwarsa secara konsisten, sedangkan pekerjaan perbaikan mengambil kembali hold yang terlewat.

Durasi hold adalah keputusan produk dan kapasitas. Hold sepuluh menit mungkin masuk akal untuk checkout, tetapi dapat mengunci porsi besar inventaris langka saat ramai. Ukur tingkat abandonment dan waktu penyelesaian pembayaran sebelum menentukannya.

Contention ekstrem tidak berskala secara linear

Ribuan pembeli yang bersaing untuk satu baris tidak dapat diparalelkan dengan menambah replika. Setiap pengurangan yang berhasil harus diurutkan terhadap yang lain. Admission control, antrean, bucket stok, atau kuota regional yang dialokasikan sebelumnya dapat melindungi database saat rilis.

Kuota regional mengurangi koordinasi tetapi mengubah semantik. Jika Eropa memiliki unit tak terpakai sementara region lain kehabisan, sistem memerlukan cara aman untuk memindahkan kuota atau menerima ketidakseimbangan sementara. Gunakan pola ini hanya bila bisnis dapat mendefinisikan rekonsiliasi kapasitas regional.

Ketersediaan tinggi dan pemulihan bencana

Bangun PoC dengan Cepat
Siapkan aplikasi awal React + Go dan ubah PoC distributed SQL menjadi produk yang bisa diuji.

Distributed SQL dapat menjaga layanan saat kegagalan infrastruktur tertentu bila penempatan replika, kapasitas cadangan, dan perilaku aplikasi sesuai dengan sasaran layanan yang jelas. Replikasi saja belum menjamin hasil itu.

SLO harus menyebut domain kegagalan

Target uptime memerlukan beban kerja dan skenario kegagalan. Tentukan apakah layanan harus bertahan terhadap satu node, satu availability zone, atau satu region penuh. Nyatakan tingkat error dan latensi yang dapat diterima selama kejadian, bukan hanya setelah pulih.

Klaster tiga replika dalam satu gedung memiliki profil risiko berbeda dari tiga replika di zona independen. Topologi multi-region melindungi dari kejadian lebih luas, tetapi memperpanjang jalur kuorum dan membutuhkan kapasitas tersisa yang cukup untuk menyerap trafik setelah satu lokasi hilang.

Recovery time objective menentukan seberapa cepat layanan harus kembali. Recovery point objective menentukan seberapa banyak data committed yang boleh hilang. Replikasi kuorum sinkron dapat mendukung sasaran tanpa kehilangan data committed untuk kegagalan yang tercakup, tetapi hanya selama replika dan jalur aplikasi yang dibutuhkan bekerja sesuai rancangan.

Failover menciptakan peristiwa yang terlihat aplikasi

Perubahan leader dapat mengganggu transaksi berjalan, menutup koneksi, dan menaikkan latensi. Aplikasi harus membedakan hasil database yang dapat dicoba ulang dari error bisnis permanen. Transaksi gagal perlu dimulai ulang sebagai satu unit, bukan hanya mengulang pernyataan terakhir.

Connection pool dapat menyimpan endpoint mati setelah kegagalan. Health check, perilaku DNS, load balancer, validasi sertifikat, dan penemuan topologi driver perlu masuk rencana uji. Database dapat sehat sementara aplikasi tetap tidak dapat menemukannya.

Kapasitas setelah kegagalan perlu dihitung secara eksplisit. Jika tiga region biasanya berjalan mendekati 70 persen utilisasi, hilangnya satu region tidak menyisakan ruang untuk bagiannya. Headroom memang berbiaya, tetapi topologi tanpa kapasitas failover tidak memenuhi sasarannya.

Game day memvalidasi rancangan

Latihan kegagalan perlu mematikan satu node, mengisolasi zona, mengganggu konektivitas regional, dan menghapus satu endpoint aplikasi. Ukur durasi error, tingkat retry transaksi, persentil latensi, pertumbuhan antrean, dan respons operator.

Jalankan latihan ini setelah perubahan topologi, driver, atau skema yang berarti. Prosedur yang terbukti dengan trafik tahun lalu dapat gagal setelah volume data berlipat atau satu tenant menjadi dominan. Otomatiskan bagian yang aman agar bukti tidak bergantung pada satu kegiatan manual tahunan.

Replikasi bukan backup

Replika menyalin penghapusan tidak sengaja, migrasi rusak, dan penulisan aplikasi berbahaya dengan setia. Backup dan point-in-time recovery melindungi dari kerusakan logis yang tidak dapat dideteksi replikasi.

Latihan restore harus membangun lingkungan bersih terpisah, memverifikasi checksum atau invariant aplikasi, dan mengukur total waktu pemulihan. Sertakan kunci enkripsi, kebijakan akses, versi skema, dan konfigurasi yang bergantung. Backup yang ada tetapi tidak dapat dipulihkan dalam sasaran bukan sistem pemulihan yang memadai.

Residensi data dan arsitektur berbasis kepatuhan

Distributed SQL dapat menempatkan tenant atau kelompok catatan di region yang disetujui, tetapi kepatuhan bergantung pada setiap salinan, jalur akses, dan proses operasional. Lokalitas database hanyalah satu kontrol dalam program yang lebih luas.

Aturan residensi perlu definisi tepat

Persyaratan bahwa data harus tetap berada di suatu negara dapat merujuk pada penyimpanan, pemrosesan, akses dukungan, backup, kunci enkripsi, atau semuanya. Setiap penafsiran menghasilkan topologi berbeda. Penasihat hukum dan auditor perlu menerjemahkan regulasi serta kontrak menjadi kontrol teknis yang dapat diuji.

Tim memerlukan inventaris field yang diatur dan data turunannya. Log, trace, indeks pencarian, ekspor analitik, lampiran dukungan, dan antrean pesan dapat memuat informasi pribadi yang sama dengan tabel utama. Membatasi database sambil mengekspor payload mentah secara global tidak memenuhi kebijakan yang dimaksud.

Minimalisasi data dapat menyederhanakan rancangan. Jika layanan global hanya membutuhkan pengenal akun dan status agregat, simpan detail sensitif di region yang disetujui dan tampilkan representasi sekecil yang diizinkan di tempat lain.

Kebijakan penempatan harus mencakup operasi sepanjang siklus hidup

Kebijakan harus menyatakan lokasi replika aktif, replika sementara, backup, snapshot, catatan perubahan, dan lingkungan restore yang diizinkan. Rebalancing dan pemeliharaan harus mematuhi batas yang sama. Prosedur darurat tidak boleh menyalin data yang diatur ke region yang tidak disetujui demi kemudahan.

Kontrol akses memerlukan batas geografis dan organisasi. Identitas layanan hanya boleh memperoleh tabel serta operasi yang diperlukan. Akses produksi manusia perlu dicatat, dibatasi waktu bila memungkinkan, dan ditinjau. Kunci enkripsi yang terikat region dapat menambah kontrol, tetapi ketersediaan kunci dan pemulihan bencana juga perlu dirancang.

Relokasi tenant memerlukan alur terdokumentasi. Perubahan kontrak, migrasi pelanggan, atau restrukturisasi perusahaan dapat menuntut perpindahan catatan antaryurisdiksi. Prosesnya harus menjelaskan kapan salinan lama hilang, bagaimana backup berakhir masa simpannya, dan bukti apa yang menunjukkan penyelesaian.

Pelaporan global mungkin memerlukan dataset turunan

Dashboard global dapat berbenturan dengan penempatan ketat bila memindai data pelanggan mentah lintas region. Pemrosesan regional dapat menghitung agregat yang diizinkan secara lokal, lalu menerbitkan hasil non-sensitif ke penyimpanan pelaporan pusat.

Aturan agregasi harus mencegah rekonstruksi catatan yang dibatasi. Kelompok kecil, field teks bebas, dan dimensi terperinci dapat mengungkap informasi pribadi meski pengenal langsung dihapus. Karena itu, tata kelola analitik perlu masuk tinjauan arsitektur, bukan ditunda ke proyek pelaporan lain.

Beban kerja operasional dan analitik sering layak dipisahkan. Database transaksional melindungi state produk saat ini, sedangkan pipeline per region menghasilkan dataset yang diatur untuk laporan. Pemisahan ini menjauhkan pemindaian analitik panjang dari transaksi yang sensitif terhadap latensi.

Perencanaan biaya dan kinerja

Simulasikan Konflik Inventaris
Bangun aplikasi pemesanan minimal dan uji contention, hot key, serta perilaku konsistensi.

Distributed SQL lebih mahal daripada database dasar satu region karena menjaga kapasitas redundan dan mengoordinasikan kerja lewat jaringan. Investasi ini tetap dapat masuk akal bila menggantikan pekerjaan sharding mahal atau mencegah kerugian yang melampaui premi operasional.

Compute dan penyimpanan mencakup overhead replikasi

Dataset logis 2 TB dengan tiga replika penuh dimulai dari sekitar 6 TB data tereplikasi sebelum indeks sekunder, ruang compaction sementara, backup, dan metadata. Tagihan serta kompresi aktual berbeda per produk, jadi gunakan penyimpanan fisik terukur, bukan ukuran tabel logis saja.

Compute harus menangani kerja normal, pemrosesan konsensus, rebalancing, aktivitas backup, dan headroom kegagalan. Node bukan unit throughput yang saling menggantikan ketika satu partisi panas. Menambah kapasitas hanya membantu bila beban kerja dapat tersebar.

Indeks melipatgandakan kerja tulis dan penyimpanan. Tinjau setiap indeks sekunder berdasarkan nilai kueri, frekuensi pembaruan, dan penempatan geografis. Indeks yang tidak dipakai memboroskan disk dan membuat setiap penulisan terkait lebih mahal.

Biaya jaringan dapat menjadi signifikan

Replikasi mengirim penulisan antar lokasi replika. Kueri lintas region, change feed, backup, dan trafik aplikasi menambah transfer. Trafik aktif di beberapa region dapat menghasilkan tagihan yang tidak terlihat pada benchmark satu region.

Perkirakan byte per transaksi, faktor replikasi, laju tulis, amplifikasi indeks, dan arah transfer. Lalu uji dengan data penagihan penyedia selama run beban yang representatif. Jumlah permintaan saja tidak menangkap payload besar dan perpindahan latar belakang.

Kesalahan lokalitas menaikkan biaya sekaligus latensi. Layanan di satu region dapat berulang kali mengkueri koordinator di region lain karena pemilihan endpoint atau penempatan tenant. Distributed tracing dan rincian biaya per region dapat mengungkap pola ini.

Perjalanan pengguna memperlihatkan latensi yang menumpuk

Modelkan aksi pengguna lengkap, bukan pernyataan terpisah. Untuk checkout, hitung setiap commit database berurutan, strong read, panggilan API eksternal, dan handoff antrean. Terapkan round-trip regional terukur serta persentil eksekusi kueri pada jalur kritis.

Misalkan satu perjalanan berisi dua penulisan kuorum berurutan, masing-masing menambah koordinasi jaringan 90 milidetik. Itu menyumbang sekitar 180 milidetik sebelum pemrosesan aplikasi. Menggabungkan perubahan dengan satu keputusan atomik dapat menghapus satu commit, sedangkan membaca data independen secara paralel dapat mempersingkat jalur.

Load test perlu memakai contention dan ukuran payload realistis. Benchmark dengan pengenal acak dapat tersebar sempurna walaupun penulisan produksi menargetkan beberapa tenant populer. Sertakan perpindahan leader dan rebalancing agar latensi ekor mencerminkan operasi klaster biasa.

Bandingkan total kepemilikan dengan alternatif realistis

Perbandingan yang relevan bukan distributed SQL melawan database imajiner tanpa biaya operasi. Bandingkan dengan alternatif tertentu: PostgreSQL terkelola, replika, layanan sharding, pemulihan regional, routing aplikasi, dan engineer yang dibutuhkan untuk memeliharanya.

Sertakan pekerjaan migrasi, pelatihan, observabilitas, respons insiden, paket dukungan, dan biaya keluar. Operasi terkelola dapat mengurangi tenaga infrastruktur, sedangkan self-management dapat memenuhi kebutuhan kontrol dengan biaya staf yang lebih besar.

Model keuangan sederhana dapat membandingkan premi platform tahunan dengan kerugian outage yang diharapkan, pekerjaan engineering yang tertunda, risiko kepatuhan, dan pendapatan yang terdampak latensi regional. Gunakan rentang untuk input yang tidak pasti dan cari asumsi yang mengubah keputusan. Jika hasilnya bergantung pada perkiraan outage yang tidak masuk akal besar, sistem sederhana kemungkinan tetap lebih tepat.

Pola desain skema dan aplikasi

Skema distributed SQL berkinerja baik ketika jalur aksesnya menyebarkan kerja independen sambil menjaga transaksi terkait tetap berdekatan. Memindahkan skema satu node tanpa perubahan dapat mempertahankan ketepatan tetapi menghasilkan latensi buruk atau contention berat.

Primary key memengaruhi distribusi

Primary key yang terus meningkat dapat mengarahkan baris baru ke ujung satu range. Pengenal acak menyebarkan insert, tetapi distribusi yang sepenuhnya acak dapat membuat pemindaian tenant atau penempatan regional mahal. Composite key sering menyeimbangkan tujuan ini dengan memulai dari pengenal tenant atau bucket lalu mempertahankan nilai yang dapat diurutkan di dalam kelompok.

Pilih awalan berdasarkan batas transaksi. Jika hampir setiap operasi berada dalam cakupan tenant, pengelompokan menurut tenant dapat mengurangi kerja terdistribusi. Tenant yang sangat besar mungkin membutuhkan bucket dalam namespace-nya agar beberapa partisi dapat menerima penulisan bersamaan.

Mengubah primary key setelah tabel membesar dapat memerlukan penulisan ulang data besar. Uji layout kandidat dengan skew realistis sebelum migrasi. Periksa panas partisi, fan-out transaksi, lokalitas indeks, dan perilaku pemindaian, bukan hanya total throughput.

Contention memerlukan perancangan ulang sebelum kapasitas

Penghitung global, baris konfigurasi tunggal, atau satu saldo merchant dapat menserialkan permintaan yang sebenarnya independen. Node tambahan tidak dapat menghapus kebutuhan logis bahwa setiap transaksi memperbarui nilai yang sama.

Ganti penghitung global yang tepat dengan penghitung terpartisi bila agregasi sementara dapat diterima. Versikan konfigurasi alih-alih memperbarui satu baris sangat sering. Untuk state moneter, pertahankan invariant akuntansi dan cari concurrency pada entri append-only atau subakun independen tanpa melemahkan ketepatan.

Transaksi read-modify-write yang panjang memperburuk konflik. Baca set terkecil yang diperlukan, hindari interaksi pengguna dalam transaksi, dan segera commit. Jika pekerjaan bisnis memerlukan menit, representasikan sebagai state machine di beberapa transaksi pendek.

Perilaku retry adalah bagian dari kontrak aplikasi

Driver dapat me-retry pernyataan individual atau menampilkan error yang dapat dicoba ulang ke kode aplikasi. Pahami lapisan mana yang memiliki seluruh replay transaksi. Replay parsial dapat memakai keputusan usang atau melewatkan pembacaan sebelumnya.

Loop retry perlu batas percobaan maksimum, backoff acak, dan instrumentasi. Catat jenis konflik, operasi terdampak, jumlah percobaan, dan hasil akhir. Retry tanpa batas mengubah contention menjadi latensi tersembunyi dan dapat membebani klaster.

Permintaan bisnis memerlukan pengenal stabil agar respons klien yang tidak pasti dapat diperiksa dengan aman. Jika database sudah commit tetapi respons hilang, klien harus mengkueri operasi yang telah dibuat, bukan mengirim operasi baru dengan makna berbeda.

Perubahan skema perlu latihan pada skala produksi

Perubahan skema terdistribusi dapat memperbarui metadata dengan cepat saat backfill dan pembuatan indeks berlanjut di latar belakang. Pekerjaan itu memakai penyimpanan, jaringan, dan CPU, serta dapat berinteraksi dengan penulisan langsung.

Gunakan migrasi expand-and-contract. Tambahkan field atau tabel yang kompatibel terlebih dahulu, deploy kode yang dapat bekerja dengan kedua bentuk, lakukan backfill dalam batch terkendali, alihkan pembacaan, lalu hapus bentuk lama setelah verifikasi. Rencana rollback perlu memperhitungkan data yang ditulis versi baru.

Uji migrasi besar dengan volume dan topologi regional mirip produksi. Perubahan yang cepat di staging kecil dapat memakan waktu berjam-jam di produksi dan bersaing dengan trafik pelanggan. Pantau kemajuan, kontrol jeda, headroom disk, dan perilaku retry sebelum memulai.

Checklist adopsi dan proof of concept

Proof of concept yang berguna menguji satu beban kerja representatif terhadap target ketepatan, latensi, ketahanan, dan biaya yang eksplisit. Benchmark generik tidak dapat menentukan apakah skema serta aplikasi tertentu akan berperilaku baik.

Pilih beban kerja dengan batasan nyata

Pilih alur seperti memesan barang langka, mencatat transfer buku besar, atau menyediakan tenant di region yang diwajibkan. Pakai kembali skema, kueri, batas transaksi, ukuran payload, dan skew trafik bergaya produksi.

Tentukan sukses sebelum pengujian:

  • Hasil benar saat concurrency dan retry
  • Latensi p50, p95, dan p99 menurut region
  • Throughput puncak berkelanjutan dengan headroom kegagalan
  • Perilaku pemulihan saat node dan region gagal
  • Biaya compute, penyimpanan, dan jaringan terukur

Margin keselamatan harus berasal dari pertumbuhan yang diharapkan dan kapasitas saat gagal, bukan pengali sembarang. Jika kehilangan satu region termasuk cakupan, lokasi tersisa harus mampu menangani beban yang dialihkan selama pengujian.

Bangun permukaan aplikasi yang realistis

API dan antarmuka pengguna kecil mengungkap urutan transaksi, perilaku driver, serta latensi yang dirasakan pengguna yang mungkin tidak terlihat oleh alat database saja. Koder.ai dapat membuat antarmuka React, backend Go, dan baseline PostgreSQL melalui chat. Mode perencanaannya membantu mendefinisikan alur sebelum pembuatan, dan ekspor kode sumber memungkinkan engineer menyesuaikan data layer untuk database kandidat.

Gunakan aplikasi yang dibuat sebagai scaffolding pengujian, bukan bukti kompatibilitas database. Jalankan migrasi, periksa SQL yang dibuat, konfigurasikan driver resmi, dan terapkan retry transaksi dengan sengaja. Snapshot dan rollback Koder.ai dapat melindungi iterasi aplikasi, tetapi tidak menggantikan backup database atau latihan restore.

Koder.ai juga mendukung deployment dan hosting, sehingga instance aplikasi uji dapat ditempatkan dekat region database. Ini memungkinkan pengukuran seluruh jalur permintaan, bukan mengirim seluruh benchmark dari satu lokasi. Gunakan data sintetis kecuali lingkungan memiliki kontrol yang diperlukan untuk catatan produksi.

Uji operasi normal dan kegagalan

Pengujian perlu mencakup trafik stabil, lonjakan, partisi panas, kueri berjalan lama, perubahan skema, pekerjaan backup, dan penggantian node. Setelah itu, ganggu konektivitas dan hilangkan domain kegagalan dalam lingkungan uji yang disetujui.

Tangkap abort transaksi, percobaan retry, respons tidak tersedia, perpindahan leader, kedalaman antrean, penggunaan disk, dan transfer regional. Catat tindakan operator yang diperlukan. Pemulihan otomatis yang membutuhkan langkah manual tak terdokumentasi belum siap untuk produksi.

Restore backup ke lingkungan terpisah dan verifikasi invariant aplikasi. Untuk inventaris, pastikan alokasi tidak melebihi stok. Untuk buku besar, hitung ulang saldo dan verifikasi posting seimbang. Untuk tenancy SaaS, pastikan kebijakan penempatan dan akses tetap ada setelah restore.

Validasi kompatibilitas sebelum migrasi

Inventarisasi extension database, stored procedure, trigger, tipe data, asumsi isolasi, fitur ORM, kueri pelaporan, alat backup, dan skrip administratif. Klasifikasikan setiap item sebagai kompatibel, dapat diganti, atau penghambat.

Jalankan migrasi representatif pada salinan berukuran penuh atau dataset buatan. Ukur durasi backfill, lag change-data-capture, biaya dual-running, dan waktu cutover. Jika migrasi menggunakan dual write, tentukan cara mendeteksi selisih dan sistem mana yang otoritatif pada tiap fase.

Shadow read dapat membandingkan hasil tanpa mengubah state produksi. Perhitungkan perbedaan waktu dan kueri yang memang stale agar perbandingan tidak menandai variasi yang diharapkan sebagai korupsi. Setiap perbedaan yang tidak dapat dijelaskan pada data transaksional harus diselesaikan sebelum cutover.

Tinjau kesiapan produksi

Tinjauan produksi harus menetapkan pemilik untuk operasi database, retry aplikasi, keamanan, kebijakan residensi, biaya, dan respons insiden. Sertakan dashboard, alert, runbook, ambang kapasitas, bukti restore, serta titik keputusan rollback.

Keputusan akhir tetap dapat berupa bertahan di PostgreSQL atau MySQL. Proof of concept berhasil ketika menghasilkan bukti andal, bahkan jika bukti itu menunjukkan pilihan terdistribusi lebih mahal daripada kebutuhan saat ini. Bila kebutuhan memang mendukung adopsi, migrasikan bertahap, ukur setiap tahap, dan pertahankan jalur kembali yang teruji sampai sistem baru membuktikan dirinya di bawah beban nyata.

Pertanyaan umum

Apa arti database “distributed SQL” secara sederhana?

Database distributed SQL menyediakan antarmuka relasional dan SQL, seperti tabel, join, constraint, serta transaksi, tetapi berjalan sebagai klaster di banyak mesin, sering kali lintas region, sambil tetap terlihat sebagai satu database logis.

Dalam praktiknya, sistem ini berusaha menggabungkan:

  • Perilaku SQL/ACID yang familier
  • Skala horizontal dengan menambah node
  • Ketersediaan tinggi dan toleransi kegagalan tanpa sharding manual
Apa bedanya distributed SQL dengan setup PostgreSQL/MySQL tradisional?

RDBMS satu node atau primary/replica biasanya lebih sederhana, lebih murah, dan lebih cepat untuk OLTP satu region.

Distributed SQL menarik ketika pilihannya adalah:

  • Sharding yang dikelola aplikasi
  • Failover multi-region yang rumit
  • Kebutuhan konsistensi kuat lintas zona atau region
  • Kebutuhan residensi data dengan satu model operasional
Mengapa sistem distributed SQL memakai protokol konsensus seperti Raft atau Paxos?

Sebagian besar sistem mengandalkan dua gagasan utama:

  • Replikasi: setiap shard atau partisi data disimpan di beberapa node.
  • Konsensus seperti Raft atau Paxos: replika menyepakati urutan penulisan, dan commit biasanya membutuhkan pengakuan dari mayoritas.

Inilah yang memungkinkan konsistensi kuat saat node gagal, tetapi menambah biaya koordinasi jaringan.

Bagaimana data dipartisi dan ditempatkan di node atau region?

Tabel dibagi menjadi bagian lebih kecil, sering disebut partisi/shard, atau nama khusus vendor seperti range, tablet, dan split. Setiap partisi:

  • Memiliki grup replika sendiri
  • Dapat ditempatkan di node atau region tertentu
  • Dapat berpindah saat klaster melakukan penyeimbangan ulang

Biasanya Anda memengaruhi penempatan lewat kebijakan agar data yang sibuk dan penulis utama tetap dekat, sehingga perjalanan lintas jaringan berkurang.

Mengapa transaksi distributed SQL bisa lebih lambat, terutama lintas region?

Transaksi terdistribusi sering menyentuh beberapa partisi, yang mungkin berada di node atau region berbeda. Commit yang aman dapat membutuhkan:

  • Lock atau validasi pada beberapa peserta
  • Pengakuan replikasi dari kuorum
  • Keputusan commit yang terkoordinasi

Perjalanan bolak-balik jaringan tambahan inilah alasan utama latensi tulis dapat naik, terutama saat konsensus melintasi region.

Apa tanda paling jelas bahwa saya benar-benar membutuhkan distributed SQL?

Pertimbangkan distributed SQL bila setidaknya dua hal berikut benar:

  • Anda memiliki pengguna penting di beberapa region dan membutuhkan data yang konsisten
  • Anda memerlukan failover otomatis lintas zona atau region dengan RTO/RPO ketat
  • Penskalaan vertikal tidak lagi cukup untuk penulisan
  • Anda memerlukan konsistensi kuat untuk transaksi inti, seperti uang, inventaris, atau reservasi
  • Kepatuhan mengharuskan penempatan data secara geografis

Jika beban kerja muat dalam satu region dengan replika atau cache, RDBMS konvensional sering menjadi pilihan awal yang lebih baik.

Apa manfaat konsistensi kuat, dan apa biayanya?

Konsistensi kuat berarti setelah transaksi di-commit, pembacaan tidak akan melihat data yang lebih lama.

Dari sisi produk, ini membantu mencegah:

  • Pengeluaran ganda atau saldo yang salah
  • Penjualan unit terakhir secara berlebihan
  • Dua pengguna memesan kursi yang sama

Konsekuensinya, saat terjadi partisi jaringan, sistem yang sangat konsisten dapat menunggu atau menolak sebagian operasi daripada menerima dua versi kebenaran yang berbeda.

Bagaimana menangani retry secara aman dengan idempotensi di distributed SQL?

Andalkan constraint database dan transaksi:

  • Simpan idempotency_key atau sejenisnya per permintaan atau percobaan
  • Tambahkan unique constraint seperti (account_id, idempotency_key)
  • Dalam satu transaksi, tulis catatan bisnis beserta baris buku besar atau outbox

Dengan begitu, retry menjadi operasi tanpa perubahan tambahan, bukan duplikasi. Ini penting untuk pembayaran, provisioning, dan pemrosesan ulang pekerjaan latar belakang.

Bagaimana memilih antara Spanner, CockroachDB, dan YugabyteDB?

Pemisahan praktisnya:

  • Spanner: umumnya dikelola di GCP, kuat untuk rancangan multi-region, dan pilihan dialek SQL memengaruhi portabilitas.
  • CockroachDB: pengalaman dan wire protocol mirip PostgreSQL, tersedia terkelola atau self-hosted, tetapi tidak 100% kompatibel dengan PostgreSQL.
  • YugabyteDB: API SQL kompatibel PostgreSQL melalui YSQL serta API bergaya Cassandra opsional melalui YCQL, tersedia terkelola atau self-hosted.

Sebelum memilih, uji ORM, migrasi, dan extension PostgreSQL yang benar-benar Anda gunakan. Jangan menganggapnya sebagai pengganti langsung.

Seperti apa rencana proof of concept yang baik sebelum berkomitmen pada distributed SQL?

Mulailah dengan PoC terfokus untuk satu alur penting, misalnya checkout, pemesanan, atau pencatatan buku besar. Validasi:

  • Ketepatan hasil, tanpa pemesanan ganda atau pembaruan hilang
  • Latensi p50/p95 untuk kueri utama, termasuk target lintas region
  • Perilaku saat gagal, seperti node, zona, dan bila relevan region hilang
  • Dasar operasional, termasuk pemantauan, backup, dan latihan restore

Jika perlu bantuan menentukan biaya atau paket, lihat pricing. Untuk catatan implementasi terkait, lihat blog.

Related posts