Hardware des Datenbankservers
Ein wichtiges Kriterium für die Bereitstellung von performatenten Datenbanken ist die Auswahl passender Hardware für den der Datenbank-Engine gedachten Server. Hierbei kommt es nicht nur auf reine Rechen-, als CPU-Leistung an, sondern auch der Hauptspeicher und das I/O-System spielen eine entscheidende Rollen. Der Hauptspeicher des Servers ist sehr wichtig, dass alle Datenverarbeitenden Aktionen der Datenbank-Engine im Speicher durchgeführt werden, das I/O-System ist wichtig, da einen Transaktionen in der Datenbank-Engine erst abgeschlossen ist, wenn die entsprechenden Daten im Transaktions-Log persistiert sind. Da sich das Transaktions-Log auf einem Datenträger befinden, ist dessen Geschwindigkeit und Reaktion entscheindend für eine schnelle Abarbeitung der Transaktionen inner halb der Datenbank(en).
Bevor wir an dieser Stelle allerdings bereits zu tief in die eintelnen Themen vertiefen, stellt die folgende Übersicht die zu berücksichtigenden Punkt noch einmal grob dar:
- CPU-Leistung
- I/O-Leistung (Datenträger)
- Verwendung eines geeigneten RAID-Levels
- Unterschiede zwischen den RAID-Leveln
- Vor- und Nachteile
- HDD vs. SSD
- Datendurchsatz des Hauptspeichers
- Kapazitätsplanung der I/O-Systems
CPU-Leistung
Als ersten müssen die Energieeinstellungen des Servers überprüft werden. Der Server muss zwingend im Profil Höchstleistung laufen, damit der Turbo des Prozessors maximal ausgenutzt wird.
Im Gegensatz zu Data Warehouse Datenbanken spielen bei OLTP-Datenbanken die Laufzeiten einzelner Transaktionen eine entscheidende Rollen. Da vereinfacht betrachtet immer nur eine einzige Transaktion gleichzeitig ausgeführt werden kann ist es für eine performante Datenbankanwendung extrem wichtig, dass diese Transaktionen möglichst schnell abgeschlossen werden. Zusätzlich zu dem I/O-System des Transaktions-Log spielt hier die CPU-Leistung eine wichtige Rollen, besonders wenn es sich bei den SQL-Befehlen nicht um vorkompilierte Befehle sondern sogenannte Adhoc-Queries handelt.
Diese Adhoc-Queries müssen vor der Ausführung kompiliert werden, so das hier die CPU-Leistung des verwendeten Servers eine entscheidende Rolle spielt. Zusätzlich werden bei OLTP-Anwendungen eher viele kleine Datenänderungen anstatt Massenabfragen- / oder Änderungen durchgeführt. Dies bedeutet, dass bei OLTP-Datenbanken die Verwendung von Prozessoren mit weniger dafür aber höher getakteten Prozessoren ein Vorteil ist.
Als Beispiel würde ich immer einen 3,4GHz Quad-Core Prozessor einem 2,5 GHz Hexa-Core Prozessor vorziehen. Mehr zum Thema Prozessoren und ob man lieber Prozessoren von Intel oder AMD verwendet, werde ich demnächst in einem separaten Artikel veröffentlichen. Grundsätzlich sei an dieser Stelle aber gesagt, dass stand heute (Nov. 2017) Intel Prozessoren zu bevorzugen sind, da diese, abgesehen von den zukünftigen AMD Epic-Prozessoren auf Threadripper-Basis, die höchste Single-Core Leistung aller angebotenen Prozessoren besitzen.
I/O-Leistung
Wichtig: Wenn ich in diesem Anschnitt von Datenträgern spreche, verstehe ich darunter immer physikalische Datenträger und keine logischen Datenträger.
Datendateien vs. Transaktions-Log
Bei dem verwendeten I/O-System ist besonderns auf das Transaktions-Log ein Augenmerk zu richten. Da eine Transaktion erst als abgeschlossen gilt wenn die Daten phisikalisch im Transaktions-Log gespeichert sind, ist es sehr wichtig, dass sich dieses Transaktions-Log auf einem sehr schnellen Datenträger befinden. Zusätzlich ist es zu empfehlen, dass sich einzig die Log-Datei auf diesem Datenträger befinden. Dies ist in der Art des Zugriffen auf diese Datei begründet. Die Datei des Transaktions-Log wird sequentiell geschrieben, das bedeutet das alle Daten aus den Transaktionen hintereinander in diese Datei geschrieben werden. Gerade bei der Verwendung klassicher Festplatten, welche noch rotierende Schreiben und Lese-/Schreibköpfe verwenden, ist dies ein entscheidener Faktor.
Befindet sich nur die Transaktions-Log Datei auf diesem Datenträger, muss der Lese-Schreibkopf der Festplatten nicht andauernd neu positioniert werden. Dies bringt einen entscheidenden Vorteil, da die Zugriffszeiten von Festplatten. Auch bei der Verwendung von RAID-Controllern mit einem Cache sollte diese Prämisse gelten, da der Cache nur einen Teil der Daten zwischenspewichern kann und somit nicht garantiert ist, dass hier das Transaktionsl-Log bevorzugt wird. Zudem muss bei der Verwendung einen Controllers mit Cache dieser auch immer eine Backupbatterie besitzten, sodass es im Falle eines Stromausfalls nicht zu einem Datenverlust kommt.
Inwieweit sich dies über die Caching-Policies bei dem verwendeten Controller beeinflussen lässt, hängt von dem Controller ab.
Verwendung eines geeigneten RAID-Levels
Im folgenden möchte ich meine Empfehlungen für die I/O-Konfiguration darstellen und diese auch begründen. Hiebei gehe ich von der Verwendung von Festplatten aus, da stand heute die auf hohe Schreiblast ausgelegten serverzertifizierten SSD noch ziemlcih teuer sind.
Grundsätzlich empfehle ich folgende Konfiguration der Festplatten:
Datenlaufwerk
Für das Datenlaufwerk ist meine Empfehlung die Verwendung eines RAID10-Array aus min. vier identischen Festplatten, hinzu kommt immer ein zusätzliches Laufwerk als Hot Spare. Somit besteht das zu erstellende Array aus mindestens fünf Festplatten. Zum Einsatz sollten hier Festplatten mit mindestens 7200rpm kommen. Dies kligt zwar bei genauerer Betrachtung erstmal wenig, aber hier muss man meiner Meinung nach auch auf den Einsatzzweck der Datenbank schauen. Werden selten große Datenmengen verarbeitet, solten sich alle Pages der Datenbank bereits im Hauptspeicher des Datenbankservers befinden und somit garnicht erst von der Festplatte gelesen werden.
Spielt Geld jedoch nur eine untergeordnete Rolle, können auch für dieses Array Festplatte mit 15k verwendet werden. Dies beschleunigt Statement mit großen Datenmengen welche ggf. nicht alle im Hauptspeicher befinden, zudem benötigen Backup- und Restore-Prozesse weniger Zeit.
Spielt Geld überhaupt keine Rolle und ist Perfomance oberstes Ziel, ist an dieser Stelle auch die Verwendung von datenbankzertifizierten PCI-Exporess SSD Karten angebracht. Dabei ist darauf zu achten, dass auch diese SSD-Karten im RAID-Verbund konfigutiert werden sollten um Datenverluste durch Ausfälle oder Fehler der Hardware zu vermeiden.