PHP / MySQL - sınıra kadar bastırıyor?

6 Cevap php

Ben şimdi bir süre için php kodlama ve bunun üzerinde oldukça sağlam bir kavrama sahip oldum, MySQL, iyi, sadece o iş yapabilir diyelim.

Ben bariz StatCounter, google analytics, nane, vb benzer diğer web sitelerinin istatistiklerini izlemek için bir istatistik komut dosyası yapmak istiyorum

Ben, tabii, doğru bu kod ve ben MySQL günlük 20.000.000 80.000.000 ekler (ikinci "kabaca **" başına 925 uçlar) sevme görmüyorum istiyorum.

Ben biraz araştırma yaptım ve ben düz dosyasının bir csv veya başka bir forma, her ziyarette, "giriş" depolamak ve daha sonra ondan ihtiyacım veri almak gerekir gibi görünüyor.

Ben burada doğru yolda mıyım? Ben sadece doğru yönde bir itme gerekir, 1.000 psödo ikinci ve bunu yapmanın doğru yolu başına "MySQL" ekler nefes için bir yol olarak yön.

Örnek Ekle: IP, time (), http_referer, vb

Ben gün boyunca bu verileri toplamak ve daha sonra günün sonunda ya da belli aralıklarla, biz kaç tane ekstra benzersiz vurur, örneğin, ile veritabanındaki ONE satırı güncelleştirmek gerekir. Ben sadece bir şeyler açıklayan korkunç olduğumdan beri bir görselleştirme vermeye çalışıyor, tabii ki bunu yapmak için biliyorum.

Herkes bana yardımcı olabilir, ben büyük bir kodlayıcı değilim, ben iyilik dönmek için daha istekli olacaktır.

6 Cevap

Biz yaz boyunca bu yüzden geçen yıl çalıştığım yerde bu ele. Biz bilgi çok parçalı yapı gerektirir, bu yüzden ne bizim için çok iyi çalıştı farklı dönemler veri kaynaştırma oldu vermedi. Örneğin, biz bir aylık tabloya kapalı sonra bazı günlük toplamları içine itti, ve olurdu bundan sonra, gerçek zamanlı istatistikler, tek bir gün yetmeyecek olurdu.

Bu tabii ki bazı büyük sakıncaları, ayrıntı yani bir kaybı var. Biz anda farklı yaklaşımlar bir çok düşündü. Dediğin gibi, örneğin, CSV veya bazı benzer biçimi potansiyel bir seferde veri ay işlemek için bir yol olarak hizmet verebilir. Büyük bir sorun ancak ekler olduğunu.

Eğer tutmak için gereken tam olarak ne bilgi açısından bazı örnek şema yola başlayın, ve bunu yaparken, sizin için çalışacak ne (revizyonlar) aracılığıyla kendinizi rehberlik edeceğiz.

Ekler çok sayıda için bir başka not: biz potansiyel veri değerinde bir saate kadar saklamak için hizmet verecek küçük bir cini içine gerçek zamanlı istatistikler damping fikri ile konuştuğunu, daha sonra gerçek zamanlı olmayan, sonraki önce veritabanına içine enjekte saat kadar oldu. Sadece bir düşünce.

Eğer bakıyoruz faaliyet tür için, bakış, yeni bir açıdan soruna bakmak gerekir: ayırımı. Yani, sen gecikmeler ve sorunlar geri satır yukarı yayılmasının kalmamak veri kayıt adımlarını ayrılabilmesi için nasıl anlamaya gerekir.

Bunun içinde sipariş garanti sürece, bir veritabanı tablosuna günlüğü vurur doğru fikri var, erişimi olmayan sürmüştür. Bu veritabanı sağlayan bir şeydir. Ne yazık ki, bunun bir bedeli, bir veritabanı size geri almadan önce INSERT tamamlar olmasıdır. Böylece hit kayıt hit çağırma ile birleştirilmiştir. Isabet kaydederken herhangi bir gecikme çağırma yavaş olacaktır.

MySQL bu ayrılabilmesi için bir yol sunar; deniyor INSERT DELAYED. Sonuç olarak, size "bu satırı eklemek, ama bunu yaparken etrafta sopa değil" veritabanını anlatmak ve veritabanı "Ben bir dakika zaman tamam, ben senin satır var, onu takın edeceğiz" diyor. Bu size bağlanmak hangisi ekleme, yok MySQL bir konu sağlar çünkü bu kilitleme sorunları azaltır düşünülebilir. Maalesef, bu sadece MyISAM tabloları ile çalışır.

Soruna daha genel bir çözüm başka bir çözüm, sizin günlük bilgileri ve gitmek zorunda yerde sadece en-kuyruklar bunu kabul eden bir günlük cini sahip olmaktır. Bu hızlı yapmak için hile tr-kuyruk adımdır. Bu çözüm syslogd'nin tür sağlayacaktır.

Bu verileri analiz etmek için araçlar sağlar çünkü benim görüşüme göre bu, ziyaret kayıt için MySQL ayrılmamak için iyi bir şey. Yükünü azaltmak için aşağıdaki önerileri olurdu.

  • Birincil anahtar, myisam, hit başına bir satır dışında hiçbir indixes ile, hızlı bir toplama tablo yapın
  • Isabetleri için bir normalize veri yapısını yapmak ve bu veritabanına günde bir kez kayıtları taşımak.

Bu size günlük ve sorgulama / analiz için iyi endeksli normalleştirilmiş yapısı için küçük bir performans isabet verir.

MySQL sunucu web sunucusu farklı bir fiziksel makine üzerinde olduğunu varsayarsak, o zaman evet, muhtemelen yerel dosya sistemindeki bir dosyaya isabet giriş ve periyodik veritabanına bu itmek için biraz daha verimli olacaktır.

Gerçi bazı karmaşık eklemek istiyorum. Size test veya normal sorgu ile test düşündünüz mü? (Ayrı bir satırda her girdiyi gerek yok çünkü), yani bir UPDATE sorgusu kullanarak bir sayaç artırmak. Açıkçası sizin 80.000.000 sayfa bastırıyorlar eğer, muhtemelen hiç fazla kıpırdatmak oda yok bir gün hit olsa, bu, kadar düşünmüştü gibi şeyler yavaşlatmak olmadığını görebilirsiniz.

Eğer makul bir şeyler yapmak kaydıyla, oldukça kolay hacminin bu tür almak gerekir. İşte bazı fikirler vardır.

  1. Bir düzenli üzerinde denetim tablo bölümlemek gerekir (günlük, saatlik?) Temelinde, başka bir şey sadece bu yüzden makul alanı yönetmek için eski bölümleri bırakabilirsiniz eğer. 10M satırları silmenin hoş değil.
  2. Web sunucuları (sağ, oldukça büyük bir çiftlikte çalışan olacak gibi?) Muhtemelen uyumsuz, büyük gruplar halinde ekler yapmak isteyeceksiniz. Bir başına bir web sunucu makinede düz dosya günlükleri okur ve onları harmanlayan servis sürecini olacak. Bu InnoDB performans için önemlidir ve denetim web sunucuları yavaşlatan önlemek için. Veritabanı kullanılamıyor Ayrıca, eğer, web sunucuları servis web istekleri devam ve hala onları (sonunda) denetlenmiş olması gerekir
  3. Bu çok zevk meselesi nasıl yapmanız - veri geniş hacimli topluyorlar, bazı summarisation mantıklı bir hızda o rapor için gerekli olacak. Mantıklı özetleri olun.
  4. InnoDB motor ayarlama - size oldukça anlamlı ayarlamak için InnoDB motoru gerekir - özellikle disk kızarma kullanımını kontrol değişkenlerine bir göz var. Her taahhüt üzerine günlüğünü dışarı Yazma serin olacak değil (bir SSD üzerinde bulunuyor belki olmadıkça - Eğer performans ve dayanıklılık gerekiyorsa, günlükleri için bir SSD düşünün :)) sizin tampon havuzu yeterince büyük olduğundan emin olun. Şahsen ben InnoDB eklenti ve masa seçeneği başına dosyasını kullanmak istiyorum, ama tamamen kendi özelliklerini ve sınırlarını anlamak eğer siz de MyISAM kullanabilirsiniz.

Ben zaten bu ölçekte bir uygulama oluşturmak için takım geliştirici becerilere sahip sanki daha da yukarıdakilerden herhangi açıklamak için gitmiyorum, ya ne anlama geldiğini biliyor ya dışarı bulma yeteneğine sahip olacak.

1000 satır / sn, modern donanım ile veri boyutları ile gerçekçi değil çok endeksleri, bilgisi yok; birçok bazen (ve muhtemelen çok daha fazla dizin) olduğunu yerleştirin.

Performans testi unutmayın tüm üretim-spec donanım (Ben gerçekten bu, değil mi? Söylememe gerek yok).

MySQL kullanarak günlükleri toplama ve bunları özetleme görev için bir overkill olduğunu düşünüyorum. Ben senin durumunda düz günlük dosyalarına sopa istiyorum. Bu ilişkisel veritabanı yönetim gücüyle sağlamaz ama özetleri oluşturmak için oldukça yeterli. Modern bir işletim sistemi üzerinde basit bir kilit-ekleme-unlock dosya işlem kesintisiz ve anlık. Aksine, aynı basit bir işlem için MySQL kullanarak CPU yükler ve takas ve ölçeklenebilirlik diğer cehennem yol açabilir.

Yanı sıra depolama akla. Düz metin dosyası ile dikkate düz metin günlükleri cari HDD fiyat / kapasite oranı ve sıkışabilirliği alarak yüksek yüklenen web günlükleri yıllarca saklamak mümkün olacak