Bir ölçeklenebilir vurur / analitik sistemi tasarımı için en iyi yolu?

4 Cevap php

Çalıştığım şirket Blackberry platformu için uygulamalar oluşturur.

Biz bize uygulamalar içinde embed kodu ve uygulamalar merkez sunucularına geri onlar koşmak konum her zaman bazı istatistikleri rapor olmasını sağlayan özel bir "analitik sistemi" üzerinde çalışıyoruz. Şu anda, sistem ok çalışır; ancak sadece saatte 100-200 vurur beta bulunuyor. "Hit" bir sorun olmadan sunucularına gönderilir. Biz (MySQL DB) isabet kabul ve depolama işlemek için çok sağlam bir API inşa ettik. Biz yük test ettik ve bir sorun olmadan yüzlerce saat başına isabet binlerce karşılamak gerekir. Bu gerçekten bir sorun değil.

Sorun istatistikleri gösteriyor. Biz Mint (haveamint.com) benzer bir ekran paneli inşa ettik, vb ... Geçen gün, ay, hafta, yıl, her bir saat fazla hit gösterir Yumruk sürümü vurur tablodan veri çekerek ve anında yorumlayarak düz sorguları koştu. Bu çok uzun süre işe yaramadı. Bizim şu anki çözüm hit işlenmesi için "kuyruğa" ve biz bir cron hit alıyor ve her saat, gün, hafta, ay, yıl ... vb "önbelleklerini" içine dizerek her 5 dakikada yoluyla gelmek zorunda olduğunu Bu inanılmaz çalışıyor ve inanılmaz derecede ölçeklenebilir; ancak, sadece 1 saat dilimini çalışıyor. Tüm şirket bu erişimi bu yana, çeşitli zaman dilimleri içinde birkaç yüz kullanıcıları ile uğraşıyoruz. Ne San Jose "Bugün" olarak tanımlamak Londra'da benim meslektaşım Bugün olarak tanımlayan olandan çok daha farklı. Geçerli çözüm sadece 1 timezone önbelleğe bu yana, bizim diliminin dışında verileri kontrol ediyor herkes için bir kabus.

Bunu düzeltmek için mevcut plan her zaman dilimi (toplam 40) için önbelleklerini oluşturmak için; Ancak, biz 40 ile veri miktarını çarparak anlamına gelir ... bu önbelleğe sadece kötü bir fikir gibi geliyor çarparak, çok büyük olabilir ki bana korkunç ve verilen; biz Kuyruk işlemek için gittiğinizde artı, 40 farklı önbelleklerini onları koymak için daha çok CPU zamanı alacak.

Herhangi bir kimse bu sorunu çözmek için nasıl daha iyi bir fikrin var mı?

(Böyle uzun bir soru için üzgünüm .. açıklamak tam olarak kolay değil. Tüm teşekkürler!)

4 Cevap

Önerdiğiniz çözüm çok fazlalık var. Ben saatlik en az 30 dakikalık bir kova yerine verileri depolamak ve zaman dilimi UTC normalize edilmesi öneririm.

Bir kullanıcı için 1 saatlik verileri isterse 30 dakika kova ile, - sisteminizden 6:30 PM ve göstermek - -4.5 UTC 14:00 sen 5:30 için veri getirebilir. Eğer bir saatlik artışlarla veri depolamak Eğer N + 0.5 saatlik farklılıklarla zaman dilimleri kullanıcılara istekleri hizmet edemez.

Günlük numaraları için 48 yarım saatlik yuvalarını toplamak gerekir. Almak için yuvaları kullanıcının saat dilimi tarafından belirlenecektir.

Eğer yıllık veri aldığınızda 17,520 yarım saatlik kova toplamak zorunda sona çünkü ilginç alır. Bu hesaplama kolaylaştırmak için ben size yıl 4.5 saat boyunca ilk için UTC zaman ve çıkarma toplu verilere başına öncesi toplanan yıllık veri almak önermek ve önümüzdeki yılın ilk 4.5 saat boyunca toplam verileri eklersiniz. Bu aslında 4.5 saat tüm yıl kayacak ve iş o kadar değil. Buradan çalışarak, daha fazla sistem çimdik.

EDIT: 15 dakikalık kova yerine 30 dakikalık kovalara veri depolamak gerekir bu yüzden Katmandu 5,45 GMT çıkıyor.

EDIT 2: 17.520 kovaları her zaman ekleyebilir ve ülke başına bir agrega gerektirmeden zorunda kalmazsınız Başka kolay gelişme civarında yıllık topluyor. Jan 02 dan yıllık verileri toplamaktadır -. Önce ve sonra bir kaç kova eklemek - Dec 30, herhangi iki ülke arasındaki maksimum zaman dilimi farkı 23 saat olduğundan, bu (Dec 30 Oca 02) yıllık verileri almak anlamına gelir Uygun olarak. Bir -5 UTC saat dilimini Örneğin 0500 sonrasında, 31 Aralık tarihinde tüm kovalar, ve 1 Ocak 0500 saate kadar ertesi yıl üzerinde Ocak 01, tüm kovalar eklersiniz.

Birden timezones dokunur yazılım tasarımı, ben / her zaman orijinal timezone için başka bir alan ile UTC daki tarih / süreleri depolamak ve zaman alır ve UTC ve onu dönüştüren bir işlevi var derdim timezone. Gündüz anahtarı farklı durumları, gün ışığı tasarrufu, böylece dünyanın diğer tarafında bir ülkenin İstatistik ve bakarak insanları işlemek için kendinize sorun bir çok tasarruf edersiniz ....

Senin durumunda, UTC önbelleklerini olan ve sadece UTC dönüştürülecek istekleri ayarlayarak yardımcı olmalıdır. "Bugün" olarak bir stat tutmayın, bu 23:59:59 UTC saat 00:00:00 UTC saklamak ve birisi New York'ta bugün için istatistikleri için sorduğunda, dönüşüm yapmak.

Bildiğim kadarıyla ben gördüğünüz gibi, siz (raporlar, ön-uç olurdu) burada bir veri ambarı sisteminin depolama bölümü arıyoruz.

Tabloları Preaggregate ve bunların önbelleklerini oluşturun: Aslında, ticari sistemler bunu yapıyor şekilde, açıklanan önbelleği. Sorguları hızlandırmak için tek yol veritabanı sistemi onlar için daha az yapmak yapmaktır. Bu da endekslerinde veri veya daha az veri yineleme harcanan daha az zaman demektir ki, daha az veri anlamına gelir.

O dedi, ben (fazla 24 saat dilimleri gerçekten vardır) "40 önbellek çözümü" önereceğini ya. Sen trivially verilerin kopyalarını oluşturarak sıralama kuyruğunu parallelize gerekir.

Bunu yapmanın bir başka yolu, saat parçalı yapı önbelleğe ve sonra (zaman dilimlerini bu gerektiriyorsa veya 30 dakika) gün içine saatlerini toplamak olacaktır. Bu sizin günlük önbellek daha ince parçalı yapı ama özgün verilere daha iri parçalı yapı önbelleğe gelir.

veri bu tür genellikle round-robin veya dairesel veritabanları kullanılarak saklanır. Bu http://www.shinguz.ch/MySQL/mysql_20070223.html kontrol edip http://techblog.tilllate.com/2008/06/22/round-robin-data-storage-in-mysql/ MySQL altında uygulamak için nasıl çalışır ve nasıl bilmek