Büyük miktarda _structured_ verisi nasıl saklanır?


9

Uygulama sürekli olarak (yaklaşık her saniye) kullanıcıların yerini toplar ve saklar.

Bu veriler yapılandırılmıştır. İlişkisel bir veritabanında şu şekilde depolanır: | user | timestamp | latitude | longitude |

Ancak, çok fazla veri var. Kullanıcı başına günlük 60 × 60 × 24 = 86.400 kayıt olacaktır. 1000 kullanıcıyla bile günlük 86.400.000 kayıt anlamına gelir.

Ve bu sadece günlük 86.400.000 kayıt değil. Çünkü bu kayıtlar işlenecek ve işlenmiş sürümleri de saklanacaktır. Yani, bu sayıyı yaklaşık 2 ile çarpın.

Verileri nasıl kullanmayı planlıyorum

Esasen, daha kolay tüketim için konum verilerinin daha kaba taneli sürümlerini yapmayı planlıyorum. Yani:

  1. Alınan verileri zaman damgalarına göre sıralayın.
  2. Bu listede sırayla yinelenerek, konumun önemli ölçüde değişip değişmediğini belirleyin (enlem ve boylamın ne kadar değiştiğini kontrol ederek)
  3. Önemli olmayan konum değişikliklerini çıktıda tek bir girdi olarak gösterin (dolayısıyla çıktı, konum verilerinin daha kaba taneli bir sürümüdür).
  4. Önemli bir değişiklik için daha büyük bir enlem ve boylam değişikliği gerektirerek bu işlemi çıktıda yineleyin. Dolayısıyla, önceki çıktıdan üretilecek çıktı daha kaba taneli olacaktır.
  5. Tüm süreci gerektiği kadar yineleyin.
  6. Bir dizi çözünürlük toplayın ve bunları kullanıcılara gönderin. Ayrıca, verilerin tüm çözünürlüklerini daha sonra kullanmak üzere saklayın.

Bu verileri saklamak için ne kullanmalıyım? İlişkisel veritabanı mı yoksa NoSQL çözümü mü kullanmalıyım? Bu uygulamayı tasarlarken başka nelere dikkat etmeliyim?


3
Saniyede 2000 kayıt, muhtemelen güncel bir SQL motorunu rahatsız etmez. Basit bir kapasite testi, toplu olarak yüklenen dosyalara rastgele bir yazı yazarak bir konsol programı almak olacaktır.
Caleth

1
@Caleth Ama ölçeklenebilir mi? Kullanıcı tabanı 100 kat arttığında ne olacak?
Utku

3
Donanımınızın şu anda neler yapabileceğini ölçün. Darboğaz, CPU'nun değerleri "işleme" veya ham disk hızından kaynaklanıyor olabilir. Eğer niyetleri nedir yapmak bu verilerin tüm? Depolama için seçtiğiniz teknolojiyi şekillendirmelidir
Caleth

3
Caleth kesinlikle haklı. Milyonlarca kayıt modern bir veritabanı sistemini aşamaz. NoSQL mağazaları, çok miktarda veriyi çok hızlı yazma konusunda çok iyidir , ancak sonuçta bir şeyleri tekrar okumayı içeren bir şey yapmak istersiniz . Ne kadar okumaya ihtiyacınız olacağı, ne tür bir mağaza kullanmanız gerektiğini belirler.
Kilian Foth

3
İyi bir cevap vermek için bu verileri nasıl kullanmayı planladığınızı bilmemiz gerekir . Geçici sorguları istiyorsanız veritabanı iyi bir seçim olabilir, ancak dosya tabanlı bir çözüm muhtemelen tüm veri kümesi analizi için daha iyi olur. Kapatmak için oylama.
kdgregory

Yanıtlar:


9

Bu verileri depolamak için bazı alternatifler:

  1. Mesaj kuyruğu (muhtemelen dağıtılmış), Apache Kafka gibi

Bu, bir veri akışı yazmak ve okumak için optimize edilecektir. Veri akışlarını işlenmesi kolay bir formatta toplamak için idealdir, ancak akışı bütünüyle okumak dışında genellikle sorgulanamaz. Dolayısıyla bu, arşivleme amaçları için veya bir işleme katmanına giden yolda bir ara adım olacaktır.

  1. İlişkisel veritabanı

Sadece veritabanına yazabilirsiniz ve birim DB'nin işleme kapasitesini aştığında, veritabanını parçalayabilirsiniz (= verilerin birden çok alt kümesinin farklı veritabanı sunucularında oturmasını sağlayabilirsiniz). Faydası: ilişkisel bir DB kullanabilirsiniz ve yeni bir şey öğrenmek zorunda değilsiniz. Dezavantajı: DB ile ilgili tüm kodlar, hangi veri parçasının yaşandığı, uygulama yazılımında toplu sorgular yapılması gerektiğinin farkında olmalıdır.

  1. Cassandra gibi dağıtılmış NoSQL veritabanı.

Verilerinizi dağıtılmış bir NoSQL veritabanına yazarsınız ve bu veriler sizin için otomatik olarak parçalanır. Cassandra, verilere geri dönmek için daha az uygulama kodu gerektirerek, küme genelinde sorgular yapmanızı sağlar. Faydası: büyük miktarlarda veri için daha doğal olarak uygundur, olumsuz: bu sistemlerin iyi performans elde etmek ve verilerin ihtiyaçlarınıza göre sorgulanabilir hale getirilmesi konusunda nasıl çalıştığı konusunda belirli bir uzmanlık ve derinlemesine bilgi gerektirir. NoSQL sihirli bir performans düzeltmesi değildir, navigasyon için anlaşılması gereken bir dizi ödünleşmedir.

  1. Hadoop / dosya

Veriler Hadoop platformu tarafından sunucular arasında otomatik olarak dağıtılan, M / R veya Apache Spark gibi araçlar kullanılarak bu sunucularda işlenen ve son olarak Hiveop Impala gibi bir Hadoop SQL motoru kullanılarak sorgulanan (dosya olarak) dosyalara eklenir.

Hangisini seçmeli?

Bu alternatifler arasındaki ödünleşimler karmaşıktır ve bunlar hem yazınıza hem de okuma alışkanlıklarınıza bağlıdır, bu nedenle bu değiş tokuşlara karar verebilecek tek kişi sizsiniz. Bu alternatifleri derinlemesine anlamak için zamanınız yoksa, ilişkisel bir DB kullanın ve ilerlerken bir parçalama çözümü bulun. Muhtemelen, YAGNI .


Verileri nasıl kullanmayı planladığım hakkında daha fazla ayrıntı verdim. Bu bilgi verilen herhangi bir şey eklemek ister misiniz?
Utku

Hala "çözüm" derken ne demek istediğini açık değil. Coğrafi düzeyde (şehir, eyalet, ...) veya coğrafi bir coğrafi bölge gibi bir koordinat sisteminde bir araya gelmek ister misiniz? Veya hareket eşiklerine dayalı bildirimler oluşturmak istediğiniz için delta miktarıyla ilgileniyor musunuz? Kısacası: bunların hepsi ne için?
Joeri Sebrechts

Kullanıcıları izlemek içindir. Kullanıcılar birbirlerini izler ve izledikleri kullanıcıların cihazlarda son 5 saat içinde nerede olduklarını gösteririm. Esasen, daha ince taneli, daha iyi. Bununla birlikte, mobil cihazların sınırlı miktarda belleği vardır, bu nedenle çözünürlüğünü azaltmadan verileri gönderemezsiniz. Yani A kullanıcısının B, C ve D kullanıcılarını izlediğini varsayalım. B, C ve D'den aldığım konum verilerini sunucu tarafında herhangi bir işlem yapmadan A'ya iletirsem A kullanıcısının cihazının belleği çok hızlı dolar . Bu nedenle, biraz işlem yapmam gerekiyor.
Utku

Açıkladığınız şeyi inşa edersem, kıvılcım akışı ile bağlı bir dizi kafka günlüğü olarak inşa ederdim, konumlar kıvılcım akışındaki pencerelere entegre edilir ve son çıktı kafka günlüğü çekme ve web api istemcilere itmek. Ancak ... bu çok özel bir teknolojidir ve arka planınıza ve uygun zamanınıza bağlı olarak bu seçenekler sizin için yanlış olabilir.
Joeri Sebrechts

Teşekkürler. Bunu aklımda tutacağım, ancak YAGNI prensibini takip ederek şimdilik bir ilişkisel veritabanı kullanmayı planlıyorum. İhtiyaç ortaya çıktığında, uygulamaya daha uygun bir şeye geçeceğim. İsterseniz, herhangi bir bilgiyi cevabınızda düzenlemekten çekinmeyin.
Utku

6

Gereksinimlerinize biraz daha derinlemesine bakın. Her saniye izleme konumu yanılsaması yaratmanın bir yolu var.

Geçerli GPS konumunuzu bilen ve bir veritabanına yazan bir uygulamanız varsa, neden değişmezse konumu yazmaya devam edersiniz? Verilere ihtiyacınız olsa bile, kullanıcı 7 saat uykuda kalıyorsa, hesaplamalarınızı veya eşlemenizi veya başka bir şey yapmanız gerekenleri yapmak için eksik zaman aralıklarını programlı olarak yinelenen bir konumla doldurabilirsiniz.

Konumu her saniye izlerseniz, bu verileri sonsuza kadar saklamanız gerekir mi? Geçerli tablonun çok büyük olmasını önlemek için kayıtları başka bir veritabanına arşivleyebilirsiniz. Ya da sadece pozisyon değişikliği olan kayıtları tutabilirsiniz. Bu, veri ambarlarında yaygındır.


2

Verileriniz bir dizi zaman dizisidir. Zamanla gelişen sayı kümelerini (kullanıcı başına iki adet) verdiniz. Tipik olarak, herhangi bir ilişkisel depolama değil, bir RRD depolama arıyorsunuz. Bu depolama, çok sayıda küçük yazının G / Ç çalışmalarını arabelleğe alarak azaltmaya odaklanır.

İlişkisel depolama, bu zaman serisi hacmi için bir sapkınlıktır. Bununla birlikte, RRD'nin geliştirilmesinin, programlanabilir sömürü açısından SQL'den daha iyi desteklenmediği konusunda uyarılmalıdır. Muhtemelen ciddi entegrasyon çalışmalarına bakıyorsunuz, ancak gereksinimleriniz göz önüne alındığında pek önlenemiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.