Datenbank komplett im Ram halten

theomega
Userprojekt
Userprojekt
Posts: 704
Joined: 2003-01-27 14:36

Datenbank komplett im Ram halten

Post by theomega »

Hallo Leute,
ich habe folgende Situation:
Nachdem die Zugriffe auf phpadsnew (Bannermanagement) die komplette Performance nach unten gezogen haben (sowohl auf dem Datenbank alsauch auf dem Webserver), wohl aufgrund der extrem vielen Hits habe ich nun einen Extraserver dazu abgestellt.
Auf dem Server läuft nur ein Lightttpd und ein MySQL-Server, die beide nichts anderes tun als phpadsnew laufen zu lassen.

Da die Datenbank von phpadsnew nicht sonderlich groß ist (50MB) will ich die komplett im RAM halten, das sollte bei 2GB Ram auch kein Problem sein. Es ist ganz egal wenn aufgrund eines (unwahrscheinlichen) Servercrashes Daten verloren gehen, deshalb sollen die Schreibzugriffe möglichst lange im Cache gehalten werden und auf einmal geschrieben werden.

Dabei stellen sich mir jetzt zwei Fragen:

1. Lieber MyISAM oder lieber innodb? Tendiere momentan zu MyISAM in dem Fall weil ich die Features von InnoDB nicht brauche.
2. Wie konfiguriere ich den MySQL-Server, vor allem um die Schreibzugriffe zu minimieren? Schreibzugriffe erfolgen bei jedem Klick und jedem View eines Banners, also recht häufig. Ich denke das Szenario ist anders als bei den typischen Webanwendungen, selten hat man eine so kleine Datenbank die komplett in den Ram passt!

System ist:
Debian stable (Etch), Mysql 5.0.32

Hat jemand einen Tipp?

Danke
TO
Top

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: Datenbank komplett im Ram halten

Post by daemotron »

Du könntest anstelle der MyISAM-Engine (InnoDB würde ich dafür wirklich nicht nehmen und auch gleich mit skip-innodb ganz abklemmen) die MEMORY-Engine einsetzen. Die baut alles komplett im RAM auf; aber nach jedem Neustart des Servers ist halt alles weg. Du könntest aber cron-gesteuert alle paar Minuten einen Dump erzeugen, um zumindest immer bis auf die letzten 5 Minuten alles zu haben. Nervig ist nur, dass Du dann nach jedem Neustart erst mal die Datenbank- und Tabellenstruktur aufbauen müsstest (was man aber auch gleich mit ins init-Skript packen könnte). Außerdem stellt die MEMORY-Engine nur eine eingeschränkte Auswahl an Datentypen zur Verfügung; Text und Blob z. B. gibt es nicht.

Ansonsten hat isotopp zwei wirklich sehr lesenswerte Artikel zum Thema MySQL und Schreibperformance verfasst. Da hat er auch beschrieben, wie man writes verzögern kann, um möglichst nur dann zu schreiben, wenn die DB eh grad nix besseres zu tun hat. Hier die Links:
http://blog.koehntopp.de/archives/1776- ... erver.html
http://blog.koehntopp.de/archives/1775- ... MySQL.html

HTH
Top