Gotcha dengan sharding adalah bahwa aplikasi harus tahu shard yang mana yang harus di-query. Secara umum, ini dilakukan dengan mengoleskan sesuatu seperti klien. Saya akan menyesuaikan salah satu posting blog lama saya untuk digunakan sebagai jawaban saya.
Saat Anda membangun aplikasi untuk banyak klien, ada dua cara umum untuk mendesain database:
- Opsi A: Tempatkan semua klien dalam database yang sama
- Opsi 2: Bangun satu basis data per klien
Menempatkan Semua Klien di Database yang Sama
Ini sederhana: cukup tambahkan tabel Klien di bagian atas skema, tambahkan tabel ClientUsers untuk memastikan orang hanya melihat data mereka sendiri, dan kita lanjutkan.
Manfaat dari pendekatan ini:
Manajemen skema yang lebih mudah. Ketika pengembang menyebarkan versi baru aplikasi, mereka hanya perlu membuat perubahan skema dalam satu database. Tidak ada kekhawatiran tentang pelanggan yang berbeda yang tidak sinkron atau pada versi yang salah.
Penyesuaian kinerja yang lebih mudah. Kami dapat memeriksa penggunaan indeks dan statistik hanya di satu tempat, mengimplementasikan perbaikan dengan mudah, dan melihat efek langsung di semua klien kami. Dengan ratusan atau ribuan basis data, bahkan perubahan terkecil sekalipun bisa sulit untuk dikoordinasikan. Kami dapat memeriksa konten cache prosedur kami dan mengetahui dengan pasti kueri atau prosedur tersimpan mana yang paling intensif di seluruh aplikasi kami, sedangkan jika kami menggunakan basis data terpisah per klien, kami mungkin memiliki waktu penggunaan agregat yang lebih sulit untuk digunakan di seluruh rencana pelaksanaan yang berbeda.
Lebih mudah untuk membangun API eksternal. Jika kita perlu memberikan akses ke seluruh basis data kita untuk orang luar untuk membuat produk, kita bisa melakukannya dengan lebih mudah jika semua data ada dalam satu basis data. Jika API harus berurusan dengan pengelompokan data dari banyak basis data di beberapa server, itu menambah waktu pengembangan dan pengujian. (Di sisi lain, hal “banyak server” mulai mengisyaratkan pembatasan untuk skenario satu-database-untuk-memerintah-semuanya-semua: satu basis data biasanya berarti semua beban kami berdampak hanya pada satu server basis data.) Dalam kasus Anda , dengan PowerBI, memiliki semua orang dalam satu basis data akan membuat mengelola koneksi lebih mudah.
Ketersediaan tinggi & pemulihan bencana lebih mudah. Sangat mudah mengelola mirroring basis data, pengiriman log, replikasi, dan pengelompokan jika yang perlu kita khawatirkan hanyalah satu database. Kita bisa membangun infrastruktur dengan cepat.
Menempatkan Setiap Klien di Database atau Shard Sendiri
Anda masih memerlukan daftar klien, tetapi sekarang menjadi direktori - untuk setiap klien, Anda juga melacak beling tempat tinggalnya. Pada saat startup, aplikasi Anda menanyakan tabel ini, dan menyimpannya dalam RAM. Ketika membutuhkan data untuk klien, itu terhubung langsung ke beling itu (database & server).
Manfaat dari pendekatan ini:
Memulihkan klien tunggal lebih mudah. Klien adalah kantung daging yang tidak bisa diandalkan. (Kecuali saya - mereka adalah kantong daging yang dapat diandalkan.) Mereka memiliki semua jenis "oops" saat mereka ingin mengambil semua data mereka kembali ke suatu titik waktu, dan itu adalah rasa sakit yang sangat besar di belakang jika data mereka berbaur dengan data klien lain dalam tabel yang sama. Mengembalikan dalam skenario database-klien-tunggal mudah mati otak: cukup pulihkan database klien. Tidak ada orang lain yang terpengaruh.
Ekspor data yang lebih mudah. Klien suka mendapatkan data mereka. Mereka ingin keamanan mengetahui bahwa mereka bisa mengeluarkan data kapan saja mereka inginkan, menghindari skenario penguncian vendor yang ditakuti, dan mereka ingin melakukan pelaporan sendiri. Dengan data masing-masing klien diisolasi ke dalam basis data mereka sendiri, kami cukup memberikan salinan cadangan basis data mereka sendiri. Kami tidak harus membuat API ekspor data.
Skalabilitas multi-server yang lebih mudah. Ketika aplikasi kita membutuhkan lebih banyak daya daripada yang bisa kita dapatkan dari satu server, kita dapat membagi database antara beberapa server. Kami juga dapat menyebarkan muatan secara geografis, menempatkan server di Asia atau Eropa agar lebih dekat dengan klien.
Penyesuaian kinerja per-klien yang lebih mudah. Jika beberapa klien menggunakan fitur atau laporan berbeda, kami dapat membuat serangkaian indeks khusus atau tampilan indeks hanya untuk klien tersebut tanpa memperbesar ukuran data setiap orang. Memang, ada beberapa risiko di sini - dengan memungkinkan perbedaan skema antara klien, kami baru saja membuat penerapan kode kami sedikit lebih berisiko dan manajemen kinerja kami lebih sulit.
Manajemen keamanan yang lebih mudah. Selama kami telah benar-benar mengunci keamanan dengan satu pengguna per basis data, kami tidak perlu khawatir tentang Klien X mengakses data Klien Y. Namun, jika kami hanya menggunakan satu login untuk semua orang, maka kami belum benar-benar mengatasi masalah ini.
Jendela perawatan yang lebih mudah. Dalam lingkungan global di mana pelanggan tersebar di seluruh dunia, lebih mudah membuat pelanggan offline untuk pemeliharaan jika kita bisa melakukannya dalam kelompok atau zona.
Yang mana yang tepat untuk Anda?
Tidak ada pilihan yang tepat: Anda harus mengetahui kekuatan dan kelemahan perusahaan Anda sendiri. Mari kita ambil dua klien saya sebagai contoh.
Perusahaan A unggul dalam penyempurnaan kinerja perangkat keras. Mereka sangat, sangat pandai memeras sedikit terakhir dari kinerja perangkat keras, dan mereka tidak keberatan mengganti perangkat keras SQL Server mereka pada siklus 12-18 bulan. (Mereka menyegarkan server web setiap 4-6 bulan!) Tumit Achilles mereka adalah persyaratan kepatuhan dan keamanan yang ekstrem. Mereka memiliki kebutuhan audit yang luar biasa, dan hanya lebih mudah bagi mereka untuk menerapkan kontrol anti peluru pada satu server, satu basis data daripada untuk mengelola persyaratan tersebut di ribuan basis data di lusinan server. Mereka memilih satu database, satu server, banyak klien.
Perusahaan 2 unggul dalam praktik pengembangan. Mengelola perubahan skema dan penyebaran kode di ribuan basis data bukan masalah bagi mereka. Mereka memiliki klien di seluruh dunia, dan mereka sedang memproses transaksi kartu kredit untuk para klien sepanjang waktu. Mereka membutuhkan kemampuan untuk menyebarkan beban secara geografis, dan mereka tidak ingin mengganti server di seluruh dunia setiap 12-18 bulan. Mereka memilih satu database untuk setiap klien, dan hasilnya terbayar ketika mereka mulai menempatkan SQL Server di Asia dan Eropa untuk klien luar negeri mereka.