Non-Stop cronjob

Dostałem od firmy nowy wymóg dotyczący "czasu rzeczywistego" danych/statystyk. Chcą pokazać, jak nasz system działa w czasie rzeczywistym.

Nie wiem jak to zrobić, ale oto moje przemyślenia:

Myślę, że nie jest możliwe, aby uzyskać dane co sekundy, ponieważ cronjob uruchomić co najmniej co minutę. Więc, nie mówiąc im, powiedziałem Tak to możliwe.

Teraz mój problem polega na tym, jak mogę uruchomić cronjob, który dostaje statystyki na naszych stronach (sprzedaż, impresje, cpc itp...)?

Przykład:

Od 9h01 do 9h02 mam:

  • 41 odsłon produktu 1
  • 1 zamówienie
  • 8 kliknięć od klientów
  • 2 dodano do listy życzeń

Od 9h02 do 9h03 mam:

  • 57 views on product 1
  • 0 order
  • 13 kliknięć poleceń od klientów
  • 0 dodano do listy życzeń

RAZEM:

    [[19]} 98 views on product 1
  • 1 zamówienie
  • 21 kliknięć poleceń od klientów
  • 2 dodano do listy życzeń

Jak mogę się upewnić, że nie będę obliczał duplikatów, jeśli z jakiegoś powodu baza danych jest wolna i nie przetwarza informacji na czas?

Thanks

Edit: firma ma 200 pracowników w 3 różnych stanach, które składa się z działu sprzedaży, analityka biznesowego, technologii, księgowości i personelu wykonawczego.

W ostatnim roku zatrudnił 20 pracowników, więc będzie trochę rosnąć. W przypadku danych o ruchu drogowym trudno jest dokładnie określić, ile danych otrzymujemy na minutę. Szacunki wynoszą około 2,5 k do 10K na minutę.

Właśnie zamówiliśmy 3 PowerEdge R510 (Intel® Xeon® E5503, 2.0 Ghz, 4M Cache, 12GB pamięci (3x4gb), 1333MHz Dual Rank, 4 x 300GB 15K RPM Serial-Attach SCSI 6Gbps RAID 5).

Author: Book Of Zeus, 2011-11-29

4 answers

Oto co polecam na podstawie Twoich serwerów / pracowników / danych, jeśli te serwery są. Ponieważ używasz 1 serwera (i 1 kopii zapasowej), pojemność dysku powinna wystarczyć na jakiś czas, chyba że chcesz zarchiwizować pełne dane na tym serwerze. Dane mogą szybko rosnąć i myślę, aby zwiększyć pojemność lub archiwizować dane gdzie indziej.

Teraz, ponieważ masz wiele osób, które mogą zażądać danych raportowania, główną ideą jest pobieranie danych tak szybko, jak to możliwe, aby na pewno nie blokujesz rekordów(szczególnie jeśli używasz MyISAM tables-table locking vs innodb, który ma blokowanie poziomu wiersza).

Używaj swojego indeksu (unikalnego, jeśli potrzebujesz) mądrze i przechowuj dane tak efektywnie, jak to możliwe, za pomocą znacznika czasu.

Możesz również podsumować swoje dane, co może uprościć Twoje zapytania. Chociaż nie jest powszechną praktyką w bazach danych, ponieważ nie respektuje normalnych form. Można uzyskać świetne wyniki, ale to ból do utrzymać.

Szczerze mówiąc, cron, który działa co minuty, jest w porządku, ponieważ masz czas, kiedy zapisujesz rekord, ale możliwe jest pobranie danych co sekundę. Polecam upewnić się, że po otrzymaniu rekordu oznaczasz ten rekord jako "przetworzony" lub jakiś inny status, aby nie wziąć tego rekordu dwa razy.

Teraz, gdy podsumujesz swoje dane, upewnij się, że zoptymalizujesz swoje zapytania i możesz również sprawdzić, co explain wypowie, a następnie wykonaj decyzja.


EDIT: sumowanie danych (które nie respektuje normalizacji bazy danych) zapewni Ci doskonałą wydajność, ponieważ zapytujesz tylko o rekordy bez użycia funkcji agregujących i złącz tabel używając klauzuli minimal where.

Przykład:

98 views on product 1
1 order
21 referral click from clients
2 added to wishlist

Może być:

SELECT
 views, orders, referral, whishlist
FROM
 summarize_stats_20111201 /* daily table for example */
WHERE
 `time` between 1322791200 /*2011-12-01 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/;

views ma całkowitą Ilość wyświetleń, w tym przykładzie 98

orders ma całkowitą kwotę zamówień, w tym przykładzie 1

referral ma całkowitą kwotę w tym przykładzie 21

wishlist posiada całkowitą ilość listy życzeń, w tym przykładzie 2

Są to dane obliczane w tabeli podsumowującej (dlatego powiedziałem "nie respektuje normalizacji bazy danych", ponieważ nigdy nie obliczasz danych w RDBMS), ale jeśli potrzebujesz danych natychmiast, jest to sposób, w jaki możesz to zrobić.


EDIT 2: Oto przykład utrzymania tego rozwiązania:

Masz cronjob, który utrzymuje tabele. Jego zadaniem jest tworzenie stolik na następny dzień, czy coś, czego potrzebujesz.

// in php
$date = date('Ymd', strtotime('+1 day')); // for daily table 
$sql = 'CREATE TABLE IF NOT EXISTS the_database.summarize_stats_" . $date . ";

Więc kiedy wstawiasz, upewnij się, że masz odpowiednią nazwę tabeli i używasz NA ZDUPLIKOWANYM kluczu

// in php
$sql = 'INSERT INTO TABLE summarize_stats_20111201 SET /* all the fields you need */ ON DUPLICATE KEY views = views + 1;

Na przykład, jeśli chcesz zwiększyć widok

Zapominam również o tym, że jeśli chcesz odpytywać 1 tydzień danych, musisz utworzyć merge tabelę. W ten sposób możesz zrobić coś w stylu:

SELECT
 views, orders, referral, whishlist
FROM
 summarize_stats_2011 /* yearly merge table for example */
WHERE
 `time` between 1322272800 /*2011-11-25 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/;

W ten sposób nie musisz UNION ALL ton zapytań.

 30
Author: Book Of Zeus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 03:55:10

Zapisz w bazie danych znacznik czasu rekordów i oceń dane według niego (dla mysql http://dev.mysql.com/doc/refman/5.0/en/timestamp.html )

 2
Author: de3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 12:04:53

Gino, możesz zrobić coś takiego jak cronjobs, jeśli masz dostęp do swojego php.ini na serwerze. Jeśli możesz ustawić wartość max_execution_time na zero, możesz tworzyć własne cronjobs, które działają co sekundę. Potrzebujesz czegoś takiego w php.ini:

max_execution_time = 0

Lub ustaw go jako skrypt runtime w kodzie PHP:

ini_set("max_execution_time",0); 

Następną funkcją, której potrzebujesz, jest funkcja sleep () W PHP. Ta funkcja spowoduje opóźnienie wśród Twoich operacji. Możesz go używać jak sleep(10);. Więcej informacje o tej funkcji, spójrz na ten link .

 0
Author: Mohammad Saberi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 12:17:00

Może to zabrzmieć dziwnie, ale dlaczego nie użyć Google Analytics do tego rodzaju zadań śledzenia. Z nowym "live beta"

I pobierając dane za pomocą swojego API i wykonując wszystkie fantazyjne wymagania, których może wymagać zarządzanie.

Plus js i google poradzą sobie z większością obciążeń.

Edit: chodzi mi o to, dlaczego nie spróbujesz użyć js (woopra lub własnego), aby zebrać kliknięcia, zdarzenia na froncie i zapisać wszystkie statystyki na kolejna baza danych, nie wierzę, że mieszanie OLAP i OLTP jest dobrym pomysłem na każdym serwerze produkcyjnym. Mam nadzieję, że to ma sens.

 0
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 04:21:50