Apakah ada batasan jumlah database yang dapat Anda letakkan di satu SQL server?

43

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.

Shaul Behr
sumber

Jawaban:

80

Saya telah bekerja pada SQL Server dengan 8 hingga 10 ribu database dalam satu contoh. Itu tidak cantik.

Restart server dapat memakan waktu hingga satu jam atau lebih. Pikirkan tentang proses pemulihan untuk 10.000 basis data.

Anda tidak bisa menggunakan SQL Server Management Studio untuk menemukan secara andal database di Object Explorer.

Cadangan adalah mimpi buruk, karena agar cadangan bermanfaat, Anda harus memiliki solusi pemulihan bencana yang bisa diterapkan. Semoga tim Anda hebat dalam menulis semuanya .

Anda mulai melakukan hal-hal seperti menamai basis data dengan angka, seperti M01022, dan T9945. Mencoba memastikan Anda bekerja di basis data yang benar, misal M001022alih-alih M01022, dapat menjengkelkan.

Mengalokasikan memori untuk banyak basis data bisa sangat menyiksa; SQL Server akhirnya melakukan banyak I / O, yang dapat menjadi hambatan nyata pada kinerja. Pertimbangkan sistem yang mencatat perincian penggunaan karbon di 4 tabel untuk 10.000 perusahaan. Jika Anda melakukannya dalam satu database, Anda hanya perlu 4 tabel; jika Anda melakukannya dalam 10.000 database, tiba-tiba Anda membutuhkan 40.000 tabel dalam memori. Overhead berurusan dengan jumlah tabel dalam memori sangat besar. Kueri apa pun yang Anda desain yang akan dijalankan terhadap tabel-tabel itu akan memerlukan setidaknya 10.000 paket dalam cache paket jika ada 10.000 basis data yang digunakan.

Daftar di atas hanyalah contoh kecil dari masalah yang harus Anda rencanakan ketika beroperasi pada skala semacam itu.

Anda mungkin akan mengalami hal-hal seperti Layanan SQL Server yang membutuhkan waktu sangat lama untuk memulai, yang dapat menyebabkan kesalahan Pengontrol Layanan. Anda dapat meningkatkan sendiri waktu startup layanan, membuat entri registri berikut:

Subkunci: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control
Nama: ServicesPipeTimeout
Ketik: REG_DWORD
Data: Jumlah milidetik sebelum batas waktu terjadi selama layanan startup

Misalnya, untuk menunggu 600 detik (10 menit) sebelum layanan habis, ketik 600000.


Sejak menulis jawaban saya, saya menyadari pertanyaannya adalah berbicara tentang Azure. Mungkin melakukan ini pada SQL Database tidak terlalu bermasalah; mungkin itu lebih bermasalah. Secara pribadi, saya mungkin akan mendesain sistem menggunakan database tunggal, mungkin sharded secara vertikal di beberapa server, tetapi tentu saja tidak satu-database-per-pelanggan.

Max Vernon
sumber
3
Barang bagus. Poster mungkin mempertimbangkan metode menggunakan banyak basis data, tetapi banyak pelanggan per basis data sehingga mereka dapat membatasi jumlah basis data, tetapi masih dapat menskalakan ke beberapa server.
Tony Hinkle
5
Saat ini saya mengelola sebuah instance dengan jumlah DB dalam 4 angka tinggi dan dapat menggema hampir semua ini. Masalah lain yang muncul karena beroperasi pada skala ini adalah ketidakmampuan untuk cache rencana eksekusi untuk jangka waktu yang lama. Hasilnya adalah banyak CPU membakar rencana kompilasi ulang kueri.
alroc
19

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 CompanyIDuntuk 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.

Zane
sumber
17

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.

Tony Hinkle
sumber
7

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.

Ivan McA
sumber
7

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).

Darshan
sumber
+1 - Ini adalah salah satu dari sedikit manfaat yang sangat diinginkan karena memiliki satu basis data per penyewa.
Max Vernon
6

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

  • Memulai ulang server membutuhkan waktu lama: OK, tetapi dalam operasi normal kami tidak bermaksud memulai ulang server apa pun. Sistem akhirnya harus online 24/7, jadi jika kita akan memiliki waktu henti, itu harus dijadwalkan.
  • Pencadangan / pemulihan bencana: Kami menggunakan CloudBerry, yang mengotomatiskan segalanya. Bukan masalah.
  • Memberi nama basis data / menempatkannya di SSMS: Konvensi penamaan itu mudah, hanya berdasarkan nama pelanggan. Tambahkan digit serial jika nama dibagikan.
  • Pemeliharaan: Jika setiap database sekecil yang saya bayangkan, seharusnya tidak perlu membangun kembali indeks secara manual.
  • Menyebarkan kode: Kami menggunakan Entity Framework, sehingga setiap perubahan skema akan secara otomatis diluncurkan ke setiap database dengan rilis baru. Memang benar, bahwa jika kita menemukan masalah kinerja dalam produksi yang dapat diperbaiki dengan tweak indeks sederhana, tidak mudah untuk mendorongnya ke sana. Di sisi lain, dengan masing-masing database menjadi sangat kecil, tidak mungkin ada masalah kinerja showstopper pada pecahan produksi. Dan basis data umum tetap menjadi DB tunggal, yang tidak terkait dengan masalah ini.

Saya akan senang mendengar balasan dari Anda di komentar jika Anda pikir saya kehilangan sesuatu!

Shaul Behr
sumber
3
Jika Anda melihat 24/7 setiap saat maka Anda perlu melihat pengelompokan basis data Anda. Hanya menerapkan tambalan akan menghasilkan setidaknya beberapa downtime. Tidak yakin bagaimana ini berlaku untuk solusi berbasis cloud seperti Azure, saya harap ini dapat membantu Anda.
Jay Zelos
Saya percaya bahwa menggunakan teknologi DB saat ini, hampir semua alasan untuk 'sharding' tidak lagi berlaku. Saya percaya Anda akan menyesalinya di jalan atau bahkan mungkin tidak menyadari betapa buruknya Anda pergi secara komparatif dan karena itu tidak menyesalinya karena ketidaktahuan. Saya setuju dengan jawaban Max dan tidak bisa menjelaskannya lebih baik.
Joe