Latar Belakang :
Saya telah membuat aplikasi web yang ingin saya ukur dengan cukup baik. Saya tahu saya bukan Google atau Twitter, tetapi aplikasi saya menggunakan jumlah data yang cukup besar untuk setiap pengguna dan karenanya memiliki persyaratan data yang cukup tinggi. Saya ingin siap untuk mengukur dengan cukup baik tanpa harus merancang ulang semuanya nanti.
Saya menganggap diri saya seorang pengembang perangkat lunak, bukan ahli basis data. Itu sebabnya saya memposting di sini. Semoga seseorang dengan keahlian database yang lebih banyak dapat memberi saya saran.
Dengan jumlah pengguna yang relatif besar, tetapi tidak seperti angka Facebook, saya berharap memiliki DB yang terlihat seperti ini:
Satu "Big table":
- 250 juta catatan
- 20 kolom
- Sekitar 100 GB data
- Memiliki kunci asing bigint (20) yang diindeks
- Memiliki kolom string_id varchar (500) yang diindeks
- Memiliki kolom "nilai" int (11)
4 tabel lainnya:
- 10 juta catatan masing-masing
- Masing-masing sekitar 2 - 4 GB data
- masing-masing tabel ini memiliki 4 - 8 kolom
- satu kolom adalah datetime date_created
- satu kolom adalah kolom string_id varchar (500)
- satu atau dua kolom dari masing-masing tabel ini akan dipilih dalam gabungan
Salah satu tabel ini digunakan untuk menyimpan rata-rata - skemanya adalah bigint (20) id, varchar (20) string_id, datetime date_created, float average_value
Apa yang ingin saya lakukan - dua pertanyaan yang relatif mahal:
Hitung nilai rata-rata baru:
- Menggunakan kunci asing, pilih hingga beberapa juta catatan terpisah dari tabel besar.
- Hitung rata-rata baru, kelompokkan dengan string_id.
- Masukkan hasil ke dalam tabel rata-rata.
- Seperti yang saat ini dibangun, permintaan ini menggunakan dua gabungan.
Buat catatan yang tidak dinormalisasi dan hanya-baca untuk melayani pengguna:
- Gunakan kunci asing untuk memilih di mana saja dari 1.000-40.000 catatan dari tabel besar.
- Bergabung dengan masing-masing dari empat tabel lainnya pada catatan terbaru dengan kolom id string.
- Masukkan hasilnya ke dalam tabel yang tidak dinormalisasi.
- Catatan-catatan ini untuk digunakan oleh front-end untuk menampilkan informasi kepada pengguna.
- Saat ini dibangun, permintaan ini menggunakan empat bergabung.
Saya berencana untuk menjalankan masing-masing pertanyaan mahal ini pada database back-end batch yang akan mendorong hasilnya ke server DB front-end real-time yang menangani permintaan dari pengguna. Kueri ini akan dijalankan secara berkala. Saya belum memutuskan seberapa sering. Permintaan rata-rata dapat dilakukan mungkin sekali sehari. Permintaan de-normalisasi harus lebih sering - mungkin setiap beberapa menit.
Setiap pertanyaan ini saat ini berjalan dalam beberapa detik di MySQL pada mesin yang sangat low-end dengan dataset dengan catatan 100 ribu dalam "tabel besar." Saya prihatin dengan kemampuan saya untuk mengukur dan biaya penskalaan.
Pertanyaan :
- Apakah pendekatan ini terdengar masuk akal? Apakah ada yang salah dengan perspektif besar?
- Apakah RDBMS alat yang tepat, atau haruskah saya melihat solusi "data besar" lainnya seperti sesuatu dalam keluarga Hadoop? Kecenderungan saya adalah menggunakan RDBMS karena data terstruktur dan cocok dengan model relasional. Namun pada titik tertentu, menurut pemahaman saya bahwa saya mungkin tidak lagi dapat menggunakan RDBMS. Benarkah itu? Kapan saklar ini dibutuhkan?
- Apakah ini akan berhasil? Bisakah pertanyaan ini dijalankan dalam jumlah waktu yang wajar? Saya bisa menunggu beberapa jam untuk kueri # 1, tetapi kueri # 2 akan selesai dalam hitungan menit.
- Apa yang harus saya pertimbangkan dari perspektif perangkat keras? Seperti apa kemungkinan bottleneck RAM dan CPU saya? Saya menganggap menjaga indeks dalam RAM adalah penting. Apakah ada hal lain yang harus saya pertimbangkan?
- Pada titik tertentu saya mungkin harus mempartisi data saya dan menggunakan beberapa server. Apakah use case saya sepertinya sudah dalam kategori itu, atau akankah saya dapat mengukur satu mesin secara vertikal untuk sementara waktu? Apakah ini akan berfungsi dengan 10x data? 100x?