Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zu einem Project 1 Cronjob pro User

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • knuffiwuffi
    hat ein Thema erstellt Frage zu einem Project 1 Cronjob pro User.

    Frage zu einem Project 1 Cronjob pro User

    Hallo zusammen,

    mein Project ist schon recht weit und ich prüfe noch einmal den Aufbau. Meine Frage wurde durch meinen Hoster leider nur sehr wage beantwortet. Daher wollte ich nach euren Erfahrungen fragen.

    1. Das Project ist ein CMS gestütztes Joomla Projekt.
    2. Zum Einsatz kommt eine MySQL
    3. Jeder Benutzer bekommt derzeit bis zu 7 eigene Tabellen für die Verarbeitung von Daten
    4. Jeder Benutzer soll mind. einen Cronjob zur Verfügung haben, der Daten verarbeiten kann
    5. Es werden recht viele Daten eingelesen, aber nacheinander (Zeile für Zeile)
    7. CSV wird hochgeladen, Verarbeitung, Export

    Meine initiale Überlegung: "Was, wenn MySQL eine Grenze für die TABLES hat?". Aber da sollen wohl sehr viele möglich sein (4Billion??).

    Meine zweite Frage wäre, ob und wie ich das am besten organisiere, wenn mein Server, auf dem sich alles absppielt, am Limit ist, was Cronjobs angeht?
    Könnte z.B. ein zweiter Rechner die Last übernehmen und quasi auf die selbe Datenbank dazu geschaltet werden?

    Oder gibt es ab einer bestimmten größe prof. Lösungen, um die Last zu verteilen und die Stabilität der DB zu gewährleiten?

    Ich werde zu Anfang einen skalierbaren Server nehmen (einen eigenen bei einem Hoster).

    Danke.

  • jspit
    antwortet
    Zu den Cronjobs noch ein Nachtrag:

    Ein Cronjob für jeden.
    Zitat von protestix Beitrag anzeigen

    auch das ist unnötig, ein Cronjob reicht.
    Richtig. Genau genommen ein echter Cronjob mit dem kleinsten Intervall was du brauchst (jede Minute ?). Den Rest erledigst du selbst, indem du einen kleinen Scheduler baust.

    Ich habe selbst mehrere Projekte, wo der User selber per Konfiguration vorgeben kann wann eine bestimmte Aufgabe durchgeführt werden soll. Für diese Zeitpunkte lege ich in der Datenbank ein String mit einer Crontab-Syntax ab.
    Für jeden in der DB abgelegten Zeitpunkt braucht dann im echten Cronjob nur getestet werden, ob der Crontab-Eintrag aus der DB zum aktuellen Zeitpunkt erfüllt ist.

    Vom Grundsatz :
    PHP-Code:
    if( dt::create("Now)->isCron($cronStrFromDB)){
      //Aufgabe ausführen

    Mehr dazu s. https://github.com/jspit-de/dt .

    Einen Kommentar schreiben:


  • knuffiwuffi
    antwortet
    Alles ok. Noch einmal Danke für eure Antworten.
    @Perry Staltic

    Deine Antworten haben eigentlich alle meine Bedenken ausgeräumt und auch meine Fragen beantwortet, die ich wohl etwas umständlich umschrieben habe. Wolh weil ich nicht so recht wusste, was ich fragen muss.

    Eine Tabelle hört sich gut an. Wollte wegen Performance und Privatsphäre trennen.

    Einen Kommentar schreiben:


  • hellbringer
    antwortet
    Zitat von knuffiwuffi Beitrag anzeigen
    Die Datenaufbereitung soll für jeden Benutzer in einer eigenen Tabelle laufen. Ein Cronjob für jeden. Der Aufbau ist immer gleich. Das ist richtig.
    Du beschreibst, was du machen willst, aber nicht WARUM du es so machen willst. Warum glaubst du hier mehrere Tabellen zu benötigen? Dem Cronjob sollte es egal sein, ob er über eine Tabelle oder mehrere Tabellen rattert.

    Es sieht nach wie vor nach einem Fehlkonzept aus und bis jetzt gibt es keine Erklärung, warum das so ein merkwürdiger Aufbau sein muss.

    Einen Kommentar schreiben:


  • Perry Staltic
    antwortet
    Meine Frage war, warum braucht jeder eigene Tabellen?
    Deine Antwort
    Zitat von knuffiwuffi Beitrag anzeigen
    Die Datenaufbereitung soll für jeden Benutzer in einer eigenen Tabelle laufen.
    Wenn Du Hilfe bekommen möchtest, solltest Du schon die Rückfragen beantworten oder wenigstens erklären, warum etwas eine unumstößliche Vorgabe ist.

    Und da Du auch in deiner folgenden Nachfrage wieder von Tabelle je Benutzer schreibst:
    Tabelle je Benutzer ist zu 99% konzeptionell falsch.

    Mir fallen spontan 2 Gründe ein, warum man das wollen könnte.
    1. Performance
    2. besondere Privatheit

    Beides wird auf anderen Wegen erreicht.
    1. Partitionierung (um mal eine Möglichkeit zu nennen, die im Grunde sogar physisch mehreren Tabellen entspricht, nur unendlich eleganter ist)
    2. Mehrschicht Zugriffslogik

    Außerdem müsstest Du etwas an Deinen Begriffen arbeiten, was z.B. ist eine ausgelagerte Datenbank? Und was ist Umkopieren in eine solche?

    Wenn der Aufbau Deiner CSV Dateien zur Verarbeitung in der Datenbank immer gleich ist, dann ist das ganz toll und genau das, was eine Datenbank und ein Programm gern haben.
    Es ist außerdem ein super Grund, genau nicht je User extra Tabellen anzulegen, denn es sind eigentlich nur strukturelle Unterschiede von Informationen, die die Erzeugung und Verwendung verschiedener Tabellen erst erfordern.

    Um Dir noch eine andere Perspektive davon zu geben, warum man nicht 2 oder mehr Tabellen von identischer Struktur anlegt:
    Sämtlicher Code, der auf diese Tabellen zugreift, muss individuell angefertigt werden, entweder statisch oder dynamisch.
    Ebenso gilt das für sämtliche Änderungen, die bei einer neuen Version anfallen und für sämtliche Planetensysteme wie z.B. Reporting oder anderes.


    und noch was:
    Wenn deine "User" zufällig sowas sein sollten wie ein Mandant,
    wenn ein User != einem Login Account einer Web-Anwendung ist,
    wenn es um eine technische Trennung, unterschiedliche Berechtigungen usw. geht,
    dann würde man wohl eher verschiedene Schema verwenden, statt sich verschiedene Tabellen zu basteln.
    Da mySQL das nicht kann, dann verschiedene Datenbanken.

    Also versuch mal bitte Deine Idee etwas zu erläutern, je größer das Verständnis beim Leser, desto besser die Tipps.

    Einen Kommentar schreiben:


  • protestix
    antwortet
    Würdest du die Grundlagen von DBMS beherrschen stellte sich die Frage erst gar nicht. Eine Tabelle ist die Antwort.

    Dein Datenbankdesign ist immer noch fehlerhaft.

    Die Datenaufbereitung soll für jeden Benutzer in einer eigenen Tabelle laufen.
    Die Datenhaltung meinst du höchstwahrscheinlich und die muss in einer Tabelle erfolgen. Du brauchst also wahrscheinlich nicht mehr als 2 Tabellen, eine für die Userdaten und eine weitere wo du deine Daten aus den CSV einpflegst. Aus diesen Daten kannst du dann aufbereitet ausgeben, was auch immer du dann brauchst Eine erneute CSV, ein PDF oder einfach eine HTML Tabelle generieren.

    Logdaten würde ich in eine Datei schreiben, ebenso die Settings, obwohl man das wohl auch in eine DB-Tabelle auslagern könnte, dies aber angesichts deines hohen Besucheraufkommens(5 User im ersten Jahr), bezweifel ich deren Vorteile.

    Ein Cronjob für jeden.
    auch das ist unnötig, ein Cronjob reicht.

    Einen Kommentar schreiben:


  • knuffiwuffi
    antwortet
    Nachgefragt. Bei einer sehr großen Tabelle, wäre der Zugriff auf die Daten eines Benutzer schneller über eine große Tabelle, oder über 2 kleinere (pro Benutzer eine). Ich hätte gedacht, auch daß umkopieren in eine ausgelagerte Datenbank wäre einfacher, da jeder Benutzer seine eigenen Tabellen hat.

    Einen Kommentar schreiben:


  • knuffiwuffi
    antwortet
    Zitat von Perry Staltic Beitrag anzeigen
    upload, download, process, settings
    Warum braucht jeder user dafür eine eigene Tabelle?
    Diese Tabellen sind ja wohl immer gleich aufgebaut oder?

    Beschreiben diese Tabellen einzelne Uploads (z.B. Link auf CSV Upload, ..) oder enthalten sie den Datenupload?
    Die Datenaufbereitung soll für jeden Benutzer in einer eigenen Tabelle laufen. Ein Cronjob für jeden. Der Aufbau ist immer gleich. Das ist richtig.

    Einen Kommentar schreiben:


  • Perry Staltic
    antwortet
    upload, download, process, settings
    Warum braucht jeder user dafür eine eigene Tabelle?
    Diese Tabellen sind ja wohl immer gleich aufgebaut oder?

    Beschreiben diese Tabellen einzelne Uploads (z.B. Link auf CSV Upload, ..) oder enthalten sie den Datenupload?

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    wie andere schon sagten, ist das ein Faildesign, wenn Duu immer wieder neue Tabellen erstellen mußt. Mir scheint auch, Du willst dann SQL-Befehle in Schleifen durchführen, um irgendwas zu machen. Auch das ist eine direkte Abkürzung ins Chaos.
    Je nachdem, was Du genau machen willst, mag das MySQL-Spielzeug ausreichend sein - oder auch nicht.

    Einen Kommentar schreiben:


  • knuffiwuffi
    antwortet
    Bitte nicht lachen, daß ich nur < 100 angegeben habe. Ich mache mir einfach grundsetlich Gedanken, wie die Basis eines gut skalierbaren Systems (PHP) aussieht. Zum einen, um später keinen Flaschenhals zu haben und weil es mich sehr interessiert.

    Worauf ist zu achten? Gibt es goldene Regeln?

    Was mir halt einfällt...

    a) DB Index setzen
    b) DB Feldern passende größen geben
    c) Strukturierte Tabellennamen
    d) Foreign Keys ggf. verknüpfen
    e) Skalierbarer Server

    Einen Kommentar schreiben:


  • knuffiwuffi
    antwortet
    Erst einmal Danke für eure Antworten...

    [1] Mit wievielen Usern rechnest Du

    Ich rechne Anfangs mit < 100 Benutzern, im ersten Jahr eher 2 bis 5. Jeder Benutzer sollte mind. einen Cronjob zur Verfügung haben, der die Arbeit übernimmt. Die Cronjobs sollten parallel laufen, da diese horchen, ob es neue Arbeit gibt, die der jeweilige Benutzer eingestellt hat. Projekt als Hobby/Arbeitserleichterung in der Freizeit gestartet.

    [2] Ab welcher anzahl von usern willst oder kannst Du dir teil-/ vollzeit brauchbare hilfe für die adminstration deines db/webspace/whatever clusters leisten

    Die Administration würde ich selber übernehmen. Prof. Hilfe dann, wenn ich die Anforderungen nicht mehr alleine erfüllen kann oder eine prof. Softwarelösung her muss, um die Last zu verteilen. Ab 10 - 20 Benutzern dürfte es schon möglich sein, prof. Hilfe zu finanzieren, sofern erforderlich.

    [3] Ab welcher anzahl user hälst Du ein eigenes Rechenzetrum für notwendig

    Das Projekt wird von anfang an auf einem eigenen skalierbaren Server laufen (Hoster / JiffyBox).

    [4] In der Tat noch nicht ausprobiert. Ich würde, wenn das Projekt für einen ersten Test lauffähig ist, die Performance unter Last auf dem angemieteten Server auswerten/prüfen. Ein Cronjob kann durchaus bis zu 3 Tage laufen und dabei 500.000 Datenzeilen schreiben. Unterbrechungen des Cron sind nicht schlimm, da dieser immer dort weiter macht, wo er aufgehört hat. Würde der Cronjob unterbrechen, habe ich eine LOG Tabelle, die mir Hinweise auf mögliche Fehler gibt.

    Die Tabellen haben an den wichtigen Stellen einen Index. Da ich selber nicht so viel Erfahrung mit skalierbaren Projekten habe (serverseitig), fühlt es sich halt aktuell so an, als ob ich lieber noch ein wenig Grundlagenforschung betreiben sollte, um später keinen Flaschenhals zu erhalten. Ab einem bestimmten Zeitpunkt könnte ich mir sogar vorstellen, den code einmal prof. einschätzen und ggf. korrigieren zu lassen. Ich bin absolut kein Profi, bekomme aber immer mein Ergebnis und habe mir eine gute Entwicklungsumgebung (Framework) gebastelt.

    =====

    [1] Gibt es einen ersten Entwurf der DB? Falls ja, bitte DB-Dump hier einstellen.

    Ja, aber die Struktur möchte ich aktuell noch überarbeiten. Möchte diese nicht 1:1 einstellen. Unten ist eine Vorschau.

    [2] Was ist der Sinn und Zweck des Ganzen? Willst du praktisch Webspace zur Verwaltung durch die User nach bestimmten Regeln zur Verfügung stellen oder was?

    Benutzer lädt eine CSV hoch, mein System verarbeitet diese, erstellt Auswertungen und einen Export.

    [3] Haben die Tabellen table_system_1, table_system_2 usw. die gleiche Struktur?

    Nein. Die Systemtabellen sind z.B.

    - system_settings
    - system_user
    - system_upload_to_do
    - system_download_to_do

    ...und dann für jeden Benutzer die Tabellen, in denen die Daten verarbeitet werden. Diese werden bei der Registrierung bereits automatisch angelegt, sofern noch nicht vorhanden:

    - user_309_upload
    - user_309_download
    - user_309_process
    - user_309_log
    - user_309_settings

    - user_401_upload
    - user_401_download
    - user_401_process
    - user_401_log
    - user_401_settings

    Einen Kommentar schreiben:


  • Alf2016
    antwortet
    Zitat von knuffiwuffi Beitrag anzeigen
    Hallo zusammen,

    ...

    Danke.
    Gegenfragen:
    1. Gibt es einen ersten Entwurf der DB? Falls ja, bitte DB-Dump hier einstellen.
    2. Was ist der Sinn und Zweck des Ganzen? Willst du praktisch Webspace zur Verwaltung durch die User nach bestimmten Regeln zur Verfügung stellen oder was?
    3. Haben die Tabellen table_system_1, table_system_2 usw. die gleiche Struktur?
    Soweit.

    Einen Kommentar schreiben:


  • protestix
    antwortet
    Zitat von knuffiwuffi Beitrag anzeigen
    Sieht dann in etwas so aus:

    - table_system_1
    - table_system_2
    - table_system_3
    - table_user_1_import
    - table_user_1_export
    - table_user_2_import
    - table_user_2_export
    Das sieht in jeder Hinsicht falsch aus.

    Tabellen sollten nicht pro Nutzer angelegt werden und auch entsprechend benannt werden. Der Präfix table für Tabelle ist auch nicht zu verwenden.
    Das Design der Datenbank sollte im laufenden Betrieb nicht mehr angefasst werden, heisst, es kommen keine Tabellen hinzu!

    Schau dir dazu auch mal das Thema Normalisierung an.

    Einen Kommentar schreiben:


  • tomBuilder
    antwortet
    Meine initiale Überlegung: "Was, wenn MySQL eine Grenze für die TABLES hat?". Aber da sollen wohl sehr viele möglich sein (4Billion??).
    https://lmgtfy.com/?q=mysql%20max%20...tabase&p=1&s=g


    Meine zweite Frage wäre, ob und wie ich das am besten organisiere, wenn mein Server, auf dem sich alles absppielt, am Limit ist, was Cronjobs angeht?
    Könnte z.B. ein zweiter Rechner die Last übernehmen und quasi auf die selbe Datenbank dazu geschaltet werden?

    Oder gibt es ab einer bestimmten größe prof. Lösungen, um die Last zu verteilen und die Stabilität der DB zu gewährleiten?
    lange zweite frage ....

    ad a:
    siehe oben
    ad b:
    ja
    ad c:
    ja

    gegenfargen

    1
    mit wieviel usern rechnest du

    a - gleichzeitig
    b - insgesamt

    Bei Deiner Appllikation

    2.)

    Ab welcher anzahl von usern willst oder kannst Du dir teil-/ vollzeit brauchbare hilfe für die adminstration deines db/webspace/whatever clusters leisten

    3.)

    ab welcher anzahl user hälst Du ein eigenes Rechenzetrum für notwendig

    4.)

    welche anzahl user kannst du mit deinem homepc zwölf kerne/32GB Ram/20TB storage abfackeln

    Einen Kommentar schreiben:

Lädt...
X