Bagaimana cara menyimpan data _structured_ dalam jumlah besar?

9

Aplikasi akan terus menerus (sekitar setiap detik) mengumpulkan lokasi pengguna dan menyimpannya.

Data ini terstruktur. Dalam database relasional, itu akan disimpan sebagai: | user | timestamp | latitude | longitude |

Namun, terlalu banyak data. Akan ada 60 × 60 × 24 = 86.400 catatan per pengguna, setiap hari. Bahkan dengan 1000 pengguna, ini berarti 86.400.000 catatan setiap hari.

Dan tidak hanya 86.400.000 catatan setiap hari. Karena catatan ini akan diproses dan versi yang diproses akan disimpan juga. Jadi, kalikan jumlahnya dengan sekitar 2.

Bagaimana saya berencana menggunakan data

Pada dasarnya, saya berencana untuk membuat versi kasar dari data lokasi untuk konsumsi yang lebih mudah. Itu adalah:

  1. Sortir cap waktu data yang diterima.
  2. Berada di daftar ini secara berurutan, tentukan apakah lokasi telah berubah secara signifikan (dengan memeriksa seberapa banyak garis lintang dan garis bujur berubah)
  3. Mewakili perubahan lokasi yang tidak signifikan sebagai satu entri dalam output (karenanya, output adalah versi kasar dari data lokasi).
  4. Iterasi proses ini pada output, dengan memerlukan perubahan lintang dan bujur yang lebih besar untuk perubahan yang signifikan. Oleh karena itu, output yang akan dihasilkan dari output sebelumnya akan lebih berbutir kasar.
  5. Iterasi seluruh proses sebanyak yang diperlukan.
  6. Agregasikan serangkaian resolusi dan kirimkan ke pengguna. Juga, simpan semua resolusi data untuk konsumsi nanti.

Apa yang harus saya gunakan untuk menyimpan data ini? Haruskah saya menggunakan basis data relasional atau solusi NoSQL? Apa hal lain yang harus saya pertimbangkan ketika merancang aplikasi ini?

Utku
sumber
3
2000 catatan per detik seperti itu mungkin tidak akan menyulitkan mesin SQL terbaru. Tes kapasitas sederhana adalah untuk mendapatkan program konsol menulis beberapa acak ke file yang dimuat secara massal.
Caleth
1
@Caleth Tapi apakah ini bisa diskalakan? Bagaimana dengan basis pengguna yang tumbuh 100 kali?
Utku
3
Ukur apa yang bisa ditangani oleh perangkat keras Anda saat ini. Hambatannya adalah CPU "memproses" nilai-nilai, atau kecepatan disk mentah. Apa yang ingin Anda lakukan dengan semua data ini? Itu akan membentuk teknologi apa yang Anda pilih untuk penyimpanan
Caleth
3
Caleth benar sekali. Jutaan catatan tidak mengganggu sistem basis data modern. Toko NoSQL sangat pandai menulis data dalam jumlah besar dengan sangat cepat, tetapi pada akhirnya Anda ingin melakukan sesuatu yang melibatkan membaca lagi. Seberapa banyak bacaan yang Anda perlukan seringkali menentukan toko seperti apa yang harus Anda gunakan.
Kilian Foth
3
Untuk memberikan jawaban yang baik, kami perlu tahu bagaimana Anda berencana untuk menggunakan data ini. Database mungkin merupakan pilihan yang baik jika Anda ingin permintaan ad-hoc, sementara solusi berbasis file mungkin akan lebih baik untuk analisis seluruh dataset. Voting untuk ditutup.
kdgregory

Jawaban:

9

Beberapa alternatif untuk menyimpan data ini:

  1. Antrian pesan (mungkin didistribusikan), seperti Apache Kafka

Ini akan dioptimalkan untuk menulis dan membaca aliran data. Ini sangat ideal untuk mengumpulkan aliran data dalam format proses yang mudah, tetapi biasanya tidak dapat ditanyakan kecuali dengan membacakan aliran secara keseluruhan. Jadi, ini bisa untuk keperluan arsip, atau langkah menengah dalam perjalanan ke lapisan pemrosesan.

  1. Database relasional

Anda bisa menuliskannya ke basis data, dan ketika volume melebihi kapasitas DB untuk ditangani, Anda dapat membuang basis data (= memiliki beberapa himpunan bagian dari data yang duduk di server basis data yang berbeda). Manfaat: Anda dapat menggunakan DB relasional dan tidak harus mempelajari hal baru. Kelemahan: semua kode yang berhubungan dengan DB harus mengetahui pada pecahan data mana yang hidup, permintaan agregat harus dilakukan dalam perangkat lunak aplikasi.

  1. Database NoSQL yang didistribusikan, seperti Cassandra.

Anda menulis data Anda ke database NoSQL terdistribusi, dan secara otomatis akan mengirimkan data untuk Anda. Cassandra memungkinkan Anda untuk melakukan kueri di seluruh cluster, yang membutuhkan lebih sedikit kode aplikasi untuk kembali ke data. Manfaat: lebih cocok secara alami untuk data dalam jumlah besar, kerugian: akan membutuhkan keahlian khusus dan pemahaman mendalam tentang mekanisme bagaimana sistem ini bekerja untuk mencapai kinerja yang baik dan membuat data dapat ditanyakan sesuai dengan kebutuhan Anda. NoSQL bukan perbaikan kinerja ajaib, ini adalah satu set pertukaran yang harus dipahami untuk dinavigasi.

  1. Hadoop / file

Data ditambahkan ke file yang didistribusikan secara otomatis di seluruh server oleh platform Hadoop, diproses pada server tersebut menggunakan alat-alat seperti M / R atau Apache Spark, dan akhirnya ditanyai (sebagai file) menggunakan mesin Hadoop SQL seperti Hive atau Impala.

Yang mana yang harus dipilih?

Pertukaran antara alternatif ini rumit, dan mereka sangat bergantung pada tulisan Anda dan pola bacaan Anda, jadi satu-satunya orang yang dapat memutuskan timbal balik ini adalah Anda. Jika Anda tidak memiliki waktu untuk membangun pemahaman yang mendalam tentang alternatif-alternatif ini, maka gunakan saja DB relasional dan cari solusi sharding saat Anda melanjutkan. Dalam semua kemungkinan, YAGNI .

Joeri Sebrechts
sumber
Saya telah memberikan rincian lebih lanjut tentang bagaimana saya berencana untuk menggunakan data. Apakah Anda ingin menambahkan sesuatu yang diberikan informasi ini?
Utku
Masih belum jelas bagi saya apa yang Anda maksud dengan "resolusi". Apakah Anda ingin menggabungkan ke tingkat geografis (kota, negara bagian, ...) atau ke sistem koordinat seperti geohash? Atau apakah Anda tertarik dengan jumlah delta karena Anda ingin membuat notifikasi berdasarkan ambang gerakan? Singkatnya: untuk apa semua ini?
Joeri Sebrechts
Ini untuk melacak pengguna. Pengguna saling melacak, dan saya membuat grafik di mana pengguna yang mereka lacak berada dalam 5 jam terakhir di perangkat. Pada dasarnya, semakin halus, semakin baik. Namun, perangkat seluler memiliki jumlah memori terbatas, sehingga Anda tidak dapat mengirim data tanpa mengurangi resolusinya. Artinya, katakanlah pengguna A melacak pengguna B, C, dan D. Jika saya hanya meneruskan data lokasi apa pun yang saya terima dari B, C dan D ke A tanpa melakukan pemrosesan apa pun di sisi server, memori perangkat pengguna A akan mengisi dengan sangat cepat . Oleh karena itu, saya perlu melakukan beberapa pemrosesan.
Utku
Jika saya ingin membuat apa yang Anda gambarkan, saya akan membangunnya sebagai serangkaian log kafka yang terhubung melalui percikan aliran, di mana posisi diintegrasikan di seluruh jendela dalam aliran percikan, dan output akhir log kafka disediakan sebagai tarikan dan dorong web api ke klien. Namun ... itu banyak teknologi yang sangat khusus, dan tergantung pada latar belakang Anda dan waktu yang tersedia pilihan itu mungkin salah untuk Anda.
Joeri Sebrechts
Terima kasih. Saya akan mengingatnya tetapi mengikuti prinsip YAGNI, saya berencana untuk menggunakan basis data relasional untuk saat ini. Ketika kebutuhan muncul, saya akan beralih ke sesuatu yang lebih sesuai dengan aplikasi. Silakan mengedit informasi apa pun ke dalam jawaban Anda, jika Anda mau.
Utku
6

Lihatlah persyaratan Anda sedikit lebih dalam. Ada cara untuk membuat ilusi posisi pelacakan setiap detik.

Jika Anda memiliki aplikasi yang mengetahui lokasi GPS Anda saat ini dan menulisnya ke basis data, mengapa Anda tetap menulis lokasi jika tidak berubah? Bahkan jika Anda memerlukan data, jika pengguna telah tertidur selama 7 jam, Anda secara program dapat mengisi slot waktu yang hilang dengan lokasi duplikat untuk melakukan perhitungan atau pemetaan Anda atau apa pun yang perlu Anda lakukan.

Jika Anda melacak lokasi setiap detik, apakah Anda harus menyimpan data ini selamanya? Anda bisa mengarsipkan catatan ke database lain untuk mencegah tabel saat ini menjadi terlalu besar. Atau Anda bahkan bisa menyimpan catatan di mana ada perubahan posisi. Ini biasa terjadi di gudang data.

JeffO
sumber
2

Data Anda adalah serangkaian deret waktu. Anda telah memberikan set angka (dua per pengguna) yang berkembang seiring waktu. Biasanya, Anda TIDAK mencari segala jenis penyimpanan relasional, melainkan penyimpanan RRD. Penyimpanan ini sangat berfokus pada pengurangan pekerjaan I / O dari banyak penulisan kecil dengan buffering.

Penyimpanan relasional adalah bid'ah untuk seri waktu ini. Namun, berhati-hatilah bahwa pengembangan RRD tidak terlalu didukung dalam hal eksploitasi yang dapat diprogram dibandingkan dengan SQL. Anda mungkin melihat pekerjaan integrasi yang serius, tetapi sulit dihindari mengingat persyaratan Anda.

Arthur Havlicek
sumber