MySQL Verbindung beim Daemon

holzmensch

Erfahrenes Mitglied
Hallo Leute,

ich habe mehrere Worker, die Stunden am Stück laufen und auch auf die Datenbank (MySql) zugreifen müssen. Meine DB-Connections sind auf 4 beschränkt, deswegen habe ich eine API für den DB Zugriff gebaut, die dann via HTTP die Queries / Results hin- und herschicken.

Dabei brauche ich nur eine DB Verbindung, dafür explodiert der Traffic. Die Worker können offensichtlich nicht ständig die Verbindung aufrecht erhalten, sonst hat kein anderer mehr Zugriff darauf.

Wie kann man denn das am besten lösen? Würde man die Verbindung im Worker jedes mal aufbauen, den Query ausführen und diese sofort wieder schließen, damit die DB nicht gelockt ist?

Grüße
 
Entweder du öffnest und schließt nach der Arbeit direkt wieder wie du vorschlägst, draus erfolgt ein leicht größerer Aufwand durch Verbindungsaufbau, das sollte aber eigentlich kein Problem sein (außer du hast sehr viele Anfragen in kurzer Zeit und für jede öffnest und schließt du die Verbindung)

Das führt zu Möglichkeit 2, du nutzt die 4 Verbindungen voll aus, 3 bleiben länger/permanent geöffnet. Natürlich ist hier dann entscheidend, welcher Daemon am meisten davon profitiert. Dann bliebe 1 Verbinund für "die anderen" übrig. da du nicht erwähnst wie viele "mehrere Worker" sind, kann man das aber schlecht abschätzen. Auch 100 Worker sind "mehrere".
Natürlich ginge das auch mit einem 2/2 Verhältnis.
Permanent ist natürlich einfach, lohnt sich aber auch nur, wenn es 2-3 dominante Worker gibt, welche den großteil der Verbindungen aus machen. Sollte das nicht der Fall sein, ist "länger" interessant.
Du müsstest Berechnen/Wissen/Schätzen wie schnell der Worker wieder eine Verbindung braucht, und falls es "schnell genug" ist, wird die Verbindung nicht geschlossen.

Hilfe von uns für Möglichkeit 2 ist nur möglich falls du uns weitaus genauere Infos gibst.


Ob sich Möglichkeit 2 lohnt, hängt natürlich wie oben erwähnt von der Anzahl der Anfragen und darauf resultierenden eventuellen Verbindungsaufbauversuchen ab. Ohne genauere Infos ist es im Allgemeinen aber nicht möglich exakte Aussagen über Effizienz zu treffen, da Effizenz eine spezifische Aussage fordert, hier für ein allgemeines Problem ;)
 
Hi CookieBuster,

also es sollen um die 25 Worker werden, ggf mehr etwas mehr. Im Moment sind es 10 und die teilen sich die Verbindungen. Nach jeder Interaktion mit der DB wird die Verbindung geöffnet und wieder geschloßen. Dabei versuch der Worker 10 mal sich zur DB zu verbinden und zwischen den versuchen wartet er random 50-150ms.

Dennoch kommt es relativ häufig, dass der Worker nicht "rankommt" in 10 Versuchen und verhungert. Vlt ist es ja das Ratio zwischen Worker und Verbindungen von 10/4 zu hoch. Die Intervalen der DB-Abfragen sind eig richtig kurz - teilweise liegt nur minimaler PHP Code dazwischen ohne irgendwelche zeitintensiven Aktionen.

Es ist nun die Frage, ob das ein valides Konzept ist oder man da doch irgendwie anders rangeht und ggf. die DB skaliert? Oder sollte man da ggf zur einer anderen DB greifen wie MongoDB, da dort die Connections im vierstelligen Bereich kaum was kosten im Gegensatz zur MySql.
 
Zuletzt bearbeitet:
Zurück