Saya sedang menyiapkan sistem SaaS, di mana kami berencana untuk memberikan masing-masing pelanggan database mereka sendiri. Sistem sudah diatur sehingga kami dapat dengan mudah mengubah skala ke server tambahan jika bebannya terlalu besar; kami berharap memiliki ribuan, atau bahkan puluhan ribu pelanggan.
Pertanyaan
- Apakah ada batasan praktis pada jumlah micro-database yang dapat / harus Anda miliki pada satu SQL Server?
- Bisakah itu mempengaruhi kinerja server?
- Apakah lebih baik memiliki 10.000 basis data masing-masing 100 MB, atau satu basis data 1 TB?
Informasi tambahan
Ketika saya mengatakan "micro-databases", saya tidak benar-benar bermaksud "micro"; Maksud saya, kami menargetkan ribuan pelanggan, sehingga setiap basis data individual hanya akan menjadi seperseribu atau kurang dari total penyimpanan data. Pada kenyataannya, setiap basis data akan berada di sekitar tanda 100MB, tergantung pada seberapa banyak penggunaannya.
Alasan utama untuk menggunakan 10.000 basis data adalah untuk skalabilitas. Faktanya adalah, V1 dari sistem memiliki satu basis data, dan kami memiliki beberapa momen yang tidak nyaman ketika DB berusaha keras.
Itu menegangkan CPU, memori, I / O - semua hal di atas. Meskipun kami memperbaiki masalah itu, mereka membuat kami menyadari bahwa pada titik tertentu, bahkan dengan pengindeksan terbaik di dunia, jika kami sesukses yang kami harapkan, kami tidak dapat menempatkan semua data kami dalam satu tanda besar. 'database. Jadi untuk V2 kami sangat sibuk, sehingga kami dapat membagi beban antara beberapa server DB.
Saya telah menghabiskan tahun terakhir mengembangkan solusi ini. Ini satu lisensi per server, tetapi bagaimanapun juga sudah diurus karena kami menggunakan VM di Azure. Alasan pertanyaan yang muncul sekarang adalah karena sebelumnya kami hanya menawarkan ke lembaga besar dan mendirikan masing-masing sendiri. Pesanan bisnis kami berikutnya adalah model layanan mandiri di mana siapa pun yang memiliki browser dapat mendaftar dan membuat database sendiri. Database mereka akan jauh lebih kecil dan lebih banyak daripada institusi besar.
Kami mencoba Azure SQL Database Elastic Pools . Kinerja sangat mengecewakan, jadi kami kembali ke VM biasa.
sumber
Jadi ada Pro dan Kontra untuk kedua metode. Tanpa mengetahui lebih lanjut tentang aplikasi Anda atau layanan yang ingin Anda berikan, saya tidak akan dapat memberikan jawaban yang pasti, tetapi saya akan membuang beberapa pemikiran saya tentang masalah ini.
Kasus saya mengapa Anda harus menggunakan 1 Database untuk semua klien.
Pro
Perawatan mudah. Memiliki satu DB berarti Anda hanya perlu melakukan tugas pemeliharaan di satu lokasi alih-alih banyak. Bayangkan mimpi buruk menangani 1000 database berbeda untuk membuat cadangan. Bagaimana dengan memperbarui statistik pada 1000 DB atau membangun kembali indeks atau
DBCC CHECKDB
?Menyebarkan Kode. Katakanlah Anda memiliki masalah dengan prosedur tersimpan dalam kode aplikasi atau pelaporan Anda. Anda perlu membuat perubahan cepat ... Sekarang Anda harus menggunakan perubahan itu ke 1000+ DB. Tidak, terima kasih, saya lebih suka tidak.
Visibilitas mudah. Cukup gambarkan SSMS yang mencoba membuka 1000+ DB's (shudder) . Praktis akan membuat masalah tidak berguna dan membutuhkan waktu yang mengejutkan untuk membuka dan membuat SSMS. Ingatlah, itu jika Anda bisa membuat konvensi penamaan yang layak.
Cons
Keamanan. Akan lebih mudah untuk mencegah orang melihat data pelanggan lain jika Anda memilikinya sebagai DB terpisah. Namun ada beberapa hal yang sangat sederhana yang dapat Anda lakukan untuk mencegah hal ini terjadi.
Performa. Dapat dikatakan bahwa membatasi satu DB per pelanggan berarti bahwa server SQL harus memindai lebih sedikit data untuk mendapatkan informasi yang Anda tanyakan. Namun dengan struktur data yang tepat dan pengindeksan yang baik (dan kemungkinan partisi) Anda mungkin bisa menghilangkan ini sebagai masalah bersama jika dilakukan dengan hati-hati. Saya akan merekomendasikan memberikan setiap tabel yang berisi data spesifik pelanggan semacam petunjuk
CompanyID
untuk mengurangi overhead itu.Pada akhirnya saya berpikir bahwa taruhan terbaik Anda adalah memiliki satu DB untuk aplikasi Anda dan hanya membagi data pelanggan di dalam DB itu sendiri. Masalahnya itu akan memberi Anda apa-apa dibandingkan dengan mimpi buruk mengelola 1000+ database.
sumber
Spesifikasi Kapasitas Maksimum untuk SQL Server menyatakan bahwa ada batas 32.767.
Adapun apakah itu akan mempengaruhi kinerja, jawabannya adalah ya, tetapi cara itu akan mempengaruhi kinerja, dan apakah itu akan substansial, akan tergantung pada berbagai faktor.
Saya akan menggunakan satu basis data kecuali ada alasan yang bagus untuk membaginya menjadi 10.000 basis data. Satu cadangan atau 10.000 cadangan? Satu pemeriksaan integritas, atau 10.000? Mungkin ada alasan bagus untuk menggunakan 10.000 DB kecil, tetapi Anda belum memberikan detail yang cukup untuk menentukan itu. Pertanyaan yang Anda ajukan cukup luas, dan tidak ada cukup informasi bagi siapa pun untuk mengetahui apa jawaban terbaiknya.
sumber
Apa yang Anda bicarakan di sini adalah arsitektur multi-tenant vs multi-instance . Saya hanya membahas istilah-istilah ini karena Anda tidak menggunakannya dalam pertanyaan Anda, tetapi inilah yang Anda bicarakan disebut dan jika Anda cukup memasukkan "arsitektur multi-penyewa" ke Google, Anda akan menemukan banyak sumber daya dan diskusi tentang itu, seluruh buku telah ditulis di atasnya.
Beberapa sumber daya yang baik tentang SQL Server khusus di sini:
https://msdn.microsoft.com/en-us/library/ff966499.aspx
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-design-patterns-multi-tenancy-saas-applications
Saya akan dengan jawaban lain, karena saya akan cenderung kuat terhadap multi-tenant sebagai default, kecuali jika Anda memiliki alasan kuat untuk mendukung multi-instance.
Anda tidak perlu membaginya menjadi ribuan basis data klien individu untuk mengukur, ada banyak cara lain untuk melakukan itu, yang mungkin lebih disukai. Seperti pengelompokan, replikasi, sharding, partisi dll. Jangan menemukan kembali roda. Tidak ada yang melekat yang mengatakan bahwa Anda perlu membaginya sendiri secara manual pada tingkat pelanggan individu dan memang hal itu kemungkinan akan meningkatkan secara signifikan biaya penambahan setiap pelanggan baru.
Anda berbicara tentang "jutaan" pelanggan, pikirkan perangkat lunak berbasis cloud skala besar sebagai layanan, Gmail, apa pun, Anda tidak berpikir mereka membuat database yang sama sekali baru untuk setiap pendaftaran baru, sekarang bukan?
Mungkin ada alasan di mana Anda ingin memfasilitasi ini, misalnya, jika Anda menjual produk Anda ke pelanggan yang HARUS memilikinya di-rumah di infrastruktur mereka sendiri. Tetapi sebagai aturan SAAS umum, bersandar sebagai standar untuk arsitektur multi-penyewa.
sumber
Salah satu kelemahan yang saya dapat lihat pada saran database tunggal adalah berkaitan dengan mengembalikan data - jika Anda memiliki basis data per penyewa, Anda dapat mengembalikan data masing-masing klien secara mandiri (dan ke titik waktu tertentu). Jika semuanya ada dalam satu basis data, ini menjadi jauh lebih sulit (dan jauh lebih rentan terhadap kesalahan karena kemungkinan akan perlu dilakukan melalui pernyataan INSERT / UPDATE / DELETE).
sumber
Terima kasih untuk semua yang menjawab - sangat menghargai poin yang Anda berikan kepada saya untuk dipikirkan. Perasaan umum yang saya dapatkan adalah bahwa satu basis data lebih disukai, tetapi saya ingin menambahkan beberapa poin penyeimbang yang mendukung arsitektur sharded, dan mengatasi beberapa masalah yang disebutkan orang lain.
Motivasi untuk sharding
Seperti disebutkan dalam pertanyaan (diperbarui), kami bertujuan untuk penjualan besar-besaran di seluruh dunia, dengan jutaan pengguna. Dengan perangkat keras dan pengindeksan terbaik di dunia, satu server DB tidak akan mengambil beban, jadi kami harus dapat mendistribusikan di beberapa server. Dan begitu Anda harus mencari di server mana data pelanggan tertentu aktif, tidak banyak lagi pekerjaan untuk memberi mereka database khusus, yang membuat segalanya lebih sederhana dalam hal menjaga data orang tersegregasi dengan rapi.
Menanggapi Kekhawatiran
Saya akan senang mendengar balasan dari Anda di komentar jika Anda pikir saya kehilangan sesuatu!
sumber