Datenbankserver

maxx
Posts: 13
Joined: 2008-11-20 21:20

Datenbankserver

Post by maxx »

Hi@all,

ich besitze einen Counterdienst, der momentan auf einem Server mit E6600, 4GB Ram und einer 500GB Festplatte im 32Bit-Mode läuft.

Da der Counter schon sehr gut genutzt wird, und somit viele Aufrufe und Datenbankaktionen bei einer Load von 0,1 bis 1,5 hat, denke ich gerade darüber nach, einen seperaten Datenbankserver aufzustellen, damit die Datenbankbelastungen auf dem ersten Server entfallen. Gerade für die Zukunft, denn weniger wird es nicht mehr. :D Manche Indexe sind schon relativ groß und wachsen von Tag zu Tag. Von 2 Tabellen sind sie schon knapp 1,5GB groß.

Was wäre für ein solches Projekt die ideale Hardwarezusammenstellung für einen Datenbankserver?
Muss ich mehrere Festplatten im Datenbankserver unterbringen und ein spezielles Raid einstellen?
Muss ich auf 64-Bit umstellen, um mehr Ram zu nutzen?

Viele Grüße
Maxx
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Hallo Matthias,

momentan verwende ich nur MyIsam. Ich habe die Tabellen bereits in schreibende und lesende Tabellen aufgeteilt, da es für jeden Counter eine detailierte live Statistik im Memberbereich gibt. Somit werden jede Minute alle neuen und geänderten Daten in die lesenden Tabellen übernommen. Dabei gibt es ca. 10 große Tabellen, die alle Daten tragen, und ca. 20 Tabellen, die bereits optimiert für die Statistiken sind, also auch relativ klein.

Ich habe auch schon überlegt, dass ich die schreibenden Tabellen auf Innodb umstelle, nur habe ich irgendwo gelesen, dass Schreibaktionen temporär im Cache gehalten werden und dann in einem Schwung geschrieben wird. Wenn es nun zu einen Strom- oder Hardwareausfall kommt, würden diese Daten ja fehlen.

Vor allem hab ich nun auch keine Sicherungen der DB. Auf einen extra Datenbankserver würde ich Raid10 fahren, was woll dann, bei meinem Dienst, am besten ist.

Viele Grüße
maxx
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Bei einem Zugriff speichere ich gleich in mehreren Tabellen mit ID-Zuordnung (LAST_INSERT_ID).
Würde das dann bei Innodb auch funktionieren? Oder geht es dann nicht mehr, wegen dem Caching?
Kann ja sein, dass mehrere Aufrufe passieren und alle 10 die gleich ID zurückbekommen, da noch nichts geschrieben wurde.
Oder wirds sich gemerkt, welche Datensätze im Cache geschrieben wurden und fließen bei SELECTs mit ein?

Sorry wegen den Fragen, habe noch nie was mit Innodb gemacht ;)
Top

User avatar
Joe User
Project Manager
Project Manager
Posts: 11519
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Datenbankserver

Post by Joe User »

Sofern noch nicht vollständig gelesen: viewtopic.php?f=104&t=39167

Für einen Counter-Dienst sind ein paar fehlende Klicks mehr beim DB-Ausfall völlig unwichtig, denn beim DB-Ausfall kann eh nicht weitergecountet werden... Transaktionssicherheit ist hier also eher hinderlich als nützlich und somit unnötiger Overhead. Kleine (<160GB) schnelle (SCSI/SAS/SSD) Platten im RAID10 sind hier auf Grund der Writes nahezu Pflicht und auch das Filesystem muss gut gewählt werden...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Danke für eure Antworten,

ich habe nun zum Test die 2 wichtigsten Tabellen, in den Schreibaktionen sind, auf Innodb umgestellt.
Ist es normal, dass der Load dann höher ausfällt?

Um diese Uhrzeit ist im allgemeinen noch relativ wenig los, da ich viele Ami-Seiten habe. Und die schlafen gerade.
Normal ist der Load dann so bei 0,05 bis 0,1. Nun ist er aber bei 0,7 - 1. Naja, MySQL wurde zwar vor 45min neu gestartet, wegen Innodb Einstellungen, sollte aber inzwischen wieder normalisiert haben. Wäre wohl doch besser, bei MyIsam zu bleiben.
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Nein, ich habe nur eine SATA-Festplatte im System, leider. Somit momentan noch nichts mit Raid. Deswegen möchte ich mir ja einen reinen Datenbankserver zusammenbasteln. :-)

Momentan schaut die Load durchschnittlich so aus: load average: 0.34, 0.44, 0.56
wird also langsam weniger. Ich schätze mal, je nachdem, welche Abfragen in den Cache landen und dort bereits fündig werden.

Auf der Festplatte ist ansonsten wenig los, nur wenn jemand in den Stats rumklickt ist es ein bißchen mehr. Momentan liegt der Wait zwischen 0 und 10.
Wobei unter 1 zu 90% ist.

Ich arbeite viel mit Temorären Tabellen, die dann auch im Speicher abgehändelt werden. Habe sogar einen Bereich von 512MB vom Speicher als tmp gemounted und zugewiesen.

Auszug aus dem Top:

Code: Select all

Mem:   4074480k total,  3864484k used,   209996k free,   129328k buffers
Swap:  1959920k total,      640k used,  1959280k free,  3043228k cached


Und hier sind die Variablen für Innodb:

Code: Select all

innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 2M
innodb_data_file_path = ibdata1:10M:autoextend:max:128M
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_log_files_in_group=2
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_commit_concurrency = 0
innodb_thread_concurrency = 16
innodb_concurrency_tickets = 500
innodb_file_per_table   = 1
innodb_open_files = 2048
open_files_limit  = 32768
Top

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

Re: Datenbankserver

Post by daemotron »

matzewe01 wrote:BTW, was ist eigentlich im Verbund mit identischer Anzahl Platten (z.B. 6 ) schneller:
Raid 0 oder 10?

Standard-Antwort eines Informatikers: Das kommt darauf an :D
RAID1 begünstigt lesende Zugriffe (da alle Informationen auf allen Datenträgern vorhanden sind, können Leseoperationen parallelisiert werden). Schreiben dauert aber genauso lange wie bei einer einzelnen Platte.

RAID0 begünstigt schreibende Zugriffe, da die Information vor dem Schreiben in Häppchen zerteilt wird und diese Häppchen anschließend parallel auf die verschiedenen Platten geschrieben werden. Lesen dauert aber u. U. sogar länger als von einer einzelnen Platte, da die Informationen erst von den verschiedenen Platten gepuhlt und anschließend wieder zusammengesetzt werden müssen (es ginge schneller, wenn es einen zentralen Index gäbe, in dem Hinterlegt ist, wo auf den Platten die Häppchen einer Information verteilt wurden - so ließe sich das lesen wieder parallelisieren. Aber so ist RAID0 nun mal nicht aufgebaut...).

In der Gesamtperformance mit einem Mix aus lesen und schreiben würde ich daher vermuten, dass RAID10 sich besser schlägt als RAID0 (aber vorsicht, RAID 0+1 ist deutlich ungünstiger und sollte tunlichst vermieden werden). MySQL-Gott isotopp hat auch hierzu einiges zusammengetragen: viewtopic.php?f=104&t=39167#p302388
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time
Top

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: Datenbankserver

Post by Roger Wilco »

Noch zum Nachdenken: Es gibt durchaus auch nicht-relationale Datenbanken. Die sind für dein Vorhaben vielleicht besser geeignet.
Top

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

Re: Datenbankserver

Post by daemotron »

Roger Wilco wrote:Noch zum Nachdenken: Es gibt durchaus auch nicht-relationale Datenbanken. Die sind für dein Vorhaben vielleicht besser geeignet.

[x] interessiert. Kannst Du ein konkretes Produkt (abseits von Flat- oder CVS-Files) nennen, das auch mit großen Datenmengen (im GB-Bereich) noch zuverlässig klarkommt?
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Hi,

ein reiner Counter ist es nicht, wo man nur Visits und PIs zählt, sondern schon in Richtung Analytics

die zwei größten Tabellen sind z.B. die Besucher und das Surfverhalten (Tracking), wobei ich die Besuchertabelle in unregelmäßigen Abständen bereits splitte und für Ausgaben bereits aufbereite.
In der Tracking-Tabelle sind momentan aktuell ca. 70Mio Einträge bei einer Größe von 1GB Daten und ca. 1,75GB Index, wobei der Index bereits pack_keys=1 besitzt. Diese Tabelle könnte man auch splitten, da sie fortlaufend ist.
Anders wäre es aber z.B. bei den TrackingURLs. Es sind bereits Filter drin, dass SessionIDs eliminiert werden, aber diese Tabelle wächst trotzdem gut voran. Splitten kann ich diese nicht, da z.B. eine index.html in beiden Tabellen vorkommen kann und ich bei einen GROUP BY beide URLids bekomme.
Hm :-k
Top

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: Datenbankserver

Post by Roger Wilco »

Einige Alternativen hat matzewe01 ja schon genannt. Für den konkreten Einsatzzweck in einer Countersoftware würde ich einen einfach Key-Value-Store nehmen. Da reicht z. B. eine Berkley DB und wenn es verteilt sein soll gerne auch MemcacheDB.

Berkley DB ist mittlerweile wirklich sehr stabil und lange Zeit erprobt.

EDIT: Weil du Analytics meinst: Google benutzt für Google Analytics z. B. auch keine relationale Datenbank, sondern einen verteilten Key-Value-Store (BigTable).
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

In der Tracking-Tabelle gibt es nur: ID | UID |PageID | DATE
wobei die ID fortlaufend ist. Theoretisch könnte man die ID weglassen.

Und die URL-Tabelle ist relativ einfach gehalten mit: PageID | URL

Die User-Tabelle habe ich aber wirklich seeehr groß :oops: : UID | AID | DATE | AGENTID | BROWSERID ... (AID = Account-ID des Counters)
Sind halt wirklich alle wichtigen Verknüpfungen nochmal enthalten. Natürlich halte ich diese Daten auch in seperaten Tabellen, die aber erst beim Erstellen der Lesetabellen generiert werden. Die User-Tabelle wird halt einmal erstellt und dann noch einmal mit den restlichen IDs upgedated, so dass zu dem Zeitpunkt nicht noch die weiteren Tabellen aufbereitet werden müssen.

Aber die Berkley DB schaue ich mir mal an. Danke für den Tipp :)
Top

User avatar
Joe User
Project Manager
Project Manager
Posts: 11519
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Datenbankserver

Post by Joe User »

Neben den bereits genannten Optimierungen, kannst Du auch noch die bekannten redundanten Werte (URL, Browser, etc) hashen, damit die Spalten fixe Längen haben, bringt auch noch etwas Performance und Space zurück.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Die Tabellen mit gepackten Keys werden nur beim ersten Visit eines User mit neuen Daten befüllt. Danach nicht mehr. Ich werde aber mal alle pack_keys auf default wieder setzen und schau mal, wo ich id's weglassen könnte.
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Hi und danke für eure Antworten :)

Ich habe nun alle gepackten Keys und und die Innodb Tabellen wieder entfernt.
Nun rennt mein Counter wieder :) Load 0,1

Die Tabellen habe ich über das Weekend schön minimiert.

Um auf den Datenbankserver zurückzukommen :)
Ich werde wahrscheinlich 4 Vertex 120 SSD Platten von OCZ im Raid10 nehmen. Danke für den Tipp mit SSD, die sind wirklich sau schnell und mit Raid10 bestimmt noch ein bissel schneller :) Desweiteren werde ich wohl 16GB Ram nehmen. Welche CPU wäre nun sinnvoll? Quadcore i7 oder muss es ein XEON sein? Oder evtl. mehrere Xeons auf einem Board?

PS: Ich werde erstmal MySQL treu bleiben und mal schauen, wo dessen Grenzen sind, und mich seperat in die BDB einarbeiten.
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Ich werde dieses Jahr ein bissel Werbung machen, und hoffe, dass ich die Anzahl an teilnehmenden Seiten verzehnfachen kann. Ob dann die Load dann immer noch so gut aussieht, glaube ich nicht :D

Wenn die CPU mehr Kerne hätte, könnte der Server dann nicht mehr Abfragen gleichzeitig bearbeiten, als ein Dualcore? (thread_concurrency)
Top

User avatar
Joe User
Project Manager
Project Manager
Posts: 11519
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Datenbankserver

Post by Joe User »

Solltest Du Dir dennoch eine neue CPU kaufen wollen, dann bitte einen aktuellen Dual/Quad-Core XEON (inklusive neuem Server-Motherboard mit aktuellem Server-Chipsatz), die anderen CPUs/Chipsätze sind nicht für den 24/7-Betrieb ausgelegt...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
Top

maxx
Posts: 13
Joined: 2008-11-20 21:20

Re: Datenbankserver

Post by maxx »

Hab ich mir auch schon überlegt, 2 DB Server hinzustellen. Also der Master eine >= Dual 3 GHz CPU und Slave dann ein Quadcore.
Diese dann einfach per Ring-Replikation verbinden, oder den Slave einfach nur mithorchen lassen?

Wäre evtl. später auch ein Bladeserver sonst sinnvoll?
Top

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

Re: Datenbankserver

Post by daemotron »

matzewe01 wrote:Eine gegenseitige "Replikation" gibt es nicht.

Doch. Das ist dann, was als "Ring" bezeichnet wird. Allerdings sollte man ein solches Konstrukt meiden; es birgt mehr Probleme als Lösungen. Schlimmer ist da eigentlich nur noch die Cluster-Storage-Engine - auch die will man nur einsetzen, wenn es gar nicht anders geht. Häufig ist man besser dran, die Anwendung so umzumodeln, dass sie mit mehreren DB-Backends arbeitet - oder auf ein DMBS umzusteigen, bei dem der Cluster-Betrieb schon etwas weiter gediehen ist als bei MySQL.
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time
Top