Apakah itu ide yang baik untuk menggunakan satu database untuk 50.000+ toko?

10

Saya tahu Shopify hanya menggunakan satu database untuk semua toko. Tetapi bagaimana mereka bisa menangani database mereka dengan data sebesar itu? Apakah itu ide yang baik untuk menggunakan database tunggal untuk 50.000+ toko?

Farid Movsumov
sumber
11
RDBMS modern dapat menangani 100 miliaran baris. Ini benar-benar tidak masalah jika semuanya dirancang untuk skala & perangkat keras yang sesuai tersedia untuk menangani beban.
Philᵀᴹ

Jawaban:

23

Harap dicatat: Saya menjawab dari perspektif SQL Server, jadi saya menyebutkan beberapa konsep khusus untuk SQL Server, tapi saya percaya semua konsep ini memiliki padanan dalam platform RDBMS utama lainnya, dengan manfaat dan keterbatasan yang sama.

Saya juga mungkin akan terus mengedit jawaban ini karena saya memikirkan potensi pro / kontra lainnya.

Yah, itu benar-benar tergantung pada skema, volume, dll. Apa sebenarnya toko menyimpan? Apa bedanya menyimpan data sekitar 50.000 kucing atau 50.000 produk atau 50.000 kacang?

Ada beberapa alasan (selain dari aspek ukuran saja) mengapa Anda mungkin tidak ingin menyimpan data untuk 50.000 pelanggan yang berbeda dalam satu basis data, jika memang data dapat sepenuhnya dipisahkan oleh pelanggan (tidak termasuk tabel pencarian seperti kode pos atau tabel khusus aplikasi, yang bisa masuk ke satu, basis data pusat):

  • jika satu pelanggan melebihi aplikasi, tidak ada cara mudah untuk mengekstrak hanya data mereka dan memindahkannya ke contoh lain, server, dll untuk memperkecil, kecuali jika Anda merencanakan ke depan dan mempartisi pada sesuatu seperti CustomerIDdan memiliki 50.000 filegroup (Anda terbatas hingga 15.000 partisi , atau 1.000 jika Anda menggunakan SQL Server versi yang lebih lama, dan memiliki terlalu banyak filegroup dapat menjadi bencana ). Perhatikan juga bahwa mempartisi membutuhkan Edisi Perusahaan.

  • jika ternyata semua pelanggan Anda terlalu besar untuk hal ini, mengubah skala berarti mendapatkan perangkat keras baru dan memindahkan seluruh basis data di sana (dan berpotensi melakukan hal itu lagi di ujung jalan).

  • menghapus pelanggan bisa sama menyakitkannya, karena Anda harus menghapus beberapa% baris dari tabel yang sangat besar, dan itu tidak akan murah.

  • Anda mungkin akan memiliki distribusi data pelanggan yang luas (satu pelanggan dengan satu miliar baris, pelanggan lain dengan 5.000). Ini dapat menyebabkan hal-hal seperti mengendus parameter dan kinerja yang merugikan yang melibatkan kardinalitas dan kualitas paket (karena Anda kemungkinan akan menggunakan kembali paket yang sama untuk permintaan yang sama terhadap kumpulan data yang sangat berbeda).

  • semua pelanggan Anda tunduk pada rencana SLA dan HA / DR yang sama persis. Anda juga memiliki seluruh database dalam mode pemulihan penuh dengan cadangan log n-menit, atau Anda berada dalam keadaan sederhana dan mengandalkan backup + diff penuh. Jika Anda harus kembali karena kesalahan pelanggan, atau perlu memulihkan database ke titik waktu, itu mempengaruhi setiap pelanggan.

  • ada potensi kesalahan dalam pengambilan data - bug di mana klausa, misalnya, dapat menyebabkan satu pelanggan melihat data pelanggan lain, atau semua data pelanggan lainnya.

  • mungkin ada implikasi hukum (beberapa perusahaan akan memiliki persyaratan ketat di mana Anda tidak menempatkan data mereka di database yang sama dengan perusahaan lain, dan khususnya pesaing mereka).

  • jika keamanan data satu pelanggan penting, maka mencapai yang lebih mudah menggunakan pemisahan basis data daripada pemisahan dalam tabel.


Beberapa keuntungan memiliki masing-masing pelanggan dalam database terpisah (atau setidaknya memiliki beberapa basis data, masing-masing untuk sekelompok pelanggan):

  • dalam hal ukuran, ukurannya akan sama dengan disk.
  • scaling out lebih mudah, karena Anda bisa memindahkan database (atau banyak) ke server yang berbeda.
  • menghapus pelanggan dan semua datanya kira-kira sama dengan DROP DATABASE.
  • Anda menggunakan lebih banyak memori untuk paket (atau Anda memiliki lebih sedikit paket dalam cache per pelanggan), tetapi setidaknya paket itu relevan dengan data di database masing-masing dan kurang rentan terhadap masalah statistik / parameter mengendus parameter.
  • Anda dapat dengan mudah memiliki berbagai rencana SLA dan DR, menempatkan beberapa database secara penuh dan yang lainnya secara sederhana. Mengembalikan atau mengembalikan ke titik waktu hanya memengaruhi pelanggan itu.
  • Anda dapat dengan mudah menempatkan basis data yang berbeda (katakanlah, pelanggan prioritas tinggi Anda) pada I / O yang lebih cepat. Anda dapat melakukan ini dalam satu database dengan filegroup, tetapi itu jauh lebih sulit untuk dikelola (setidaknya IMHO).

Beberapa kekurangan:

  • Selain ukuran, Anda mungkin tidak ingin memiliki 50.000 database pada satu contoh SQL Server, jadi ini mungkin berarti scaling keluar ke beberapa server.
  • waktu startup naik karena ada beberapa overhead yang melekat dalam memulai setiap database.
  • aplikasi harus sedikit lebih pintar - alih-alih hanya memiliki CustomerID pada klausa mana, ia harus terhubung secara dinamis ke basis data CustomerID. Ini tidak sulit dengan tingkat menengah yang tepat tetapi merupakan perubahan.
  • ya, Anda memiliki banyak salinan dari tabel dan prosedur yang sama, tetapi kode dan skema identik di seluruh database, hanya datanya berbeda. Jadi menyebarkan perubahan kode / skema sekarang hanya satu lingkaran, bukan satu eksekusi.
  • pemeliharaan sedikit berbeda ketika Anda mengelola 50.000 database - sekali lagi ukuran keseluruhannya hampir sama tetapi prosesnya harus berubah - Anda tidak bisa hanya defrag / reindex / membuat cadangan semua 50.000 database sekaligus. Karena itu, pada pekerjaan saya sebelumnya, saya mengelola instance dengan 500-1.000 database identik, dan perbedaan antara mengelola 3 database identik dan 750 database identik hanyalah waktu yang dibutuhkan.
Aaron Bertrand
sumber
2
+1. Sekarang mari kita mulai membaca jawabannya :-).
Marian