Mrz 092011
 

Es gibt mehrere gute Gründe die Anfragen die TYPO3 an die Datenbank sendet aufzuteilen. Die Aufteilung der Anfragen kann der Lastenverteilung auf mehrere MySQL-Server dienen. Gleichzeitig ist es wie in dem Beispiel hier gezeigt möglich alle lesenden Anfragen in eine MySQL-Datenbank aus einer RAM-Disk zu senden, um die Daten schneller ausgeliefert zu bekommen und den Seitenaufruf zu beschleunigen.

Der Artikel baut auf unseren Beitrag MySQL Performance mit einer Ramdisk tunen auf.

Die meisten Änderungen erfolgen in der zentralen Datenbankklasse

class.t3lib_db.php

In der Funktion connectDB ergänzen wir den Funktionaufruf zur Anbindung der Datenbank um die Parameter für die zweite Datenbank

if ($this->sql_pconnect($host, $user, $password, TYPO3_db_host2,
TYPO3_db_username2, TYPO3_db_password2))

In der Funktion sql_pconnect wird der Aufruf der Funktion um mögliche Parameter für die zweite Datenbank ergänzt.

function sql_pconnect($TYPO3_db_host, $TYPO3_db_username,
$TYPO3_db_password,$TYPO3_db_host2='', $TYPO3_db_username2='',
$TYPO3_db_password2='') {

An den Stellen, an denen $this->link gesetzt wird, wird ein möglicher zweiter Connect zur Datenbank aufgebaut.

 if(($TYPO3_db_host2!='')&&($TYPO3_db_username2!='')&&($TYPO3_db_password2!='')){
$this->link2 = @mysql_connect($TYPO3_db_host2, $TYPO3_db_username2,
$TYPO3_db_password2);
}

Die Funktionen exec_PREPAREDquery und sql ergänzen wir so, dass falls vorhanden für Select-Statements die RAM-Datenbank verwendet wird.

if(!$this->isConnected2()){
$this->connectDB();
}

if($this->isConnected2())
if(!strpos(strtolower($query),"insert"))
if(!strpos(strtolower($query),"update"))
if(!strpos(strtolower($query),"truncate"))
if(!strpos(strtolower($query),"delete")){
$res = mysql_query($query, $this->link2);
}
else{
$res = mysql_query($query, $this->link);
}

Einfacher ist die Änderung in der Funktion exec_SELECTquery

if(!$this->isConnected2()){
$this->connectDB();
}

if($this->isConnected2()){
$res = mysql_query($query, $this->link2);
}else{
$res = mysql_query($query, $this->link);
}

Zusätzlich schaffen wir eine Funtion

public function isConnected2() {
return is_resource($this->link2);
}

um jederzeit prüfen zu können, ob unsere zweite Datenbank verbunden werden konnte.

Als letztes ergänzen wir die Funktion

sql_select_db

schlicht um den zweiten Link

$ret2 = @mysql_select_db($TYPO3_db, $this->link2);

Um die veränderte Klasse zu nutzen, müssen wir noch ein paar zentrale Aufrufe der Klasse ändern.

Zuerst in der init.php im typo3-Verzeichnis

$TYPO3_DB->sql_pconnect(TYPO3_db_host, TYPO3_db_username,
TYPO3_db_password, TYPO3_db_host2, TYPO3_db_username2,
TYPO3_db_password2)

t3lib/config_default.php

ergänzen wir um die Zeilen

define('TYPO3_db_username2', $typo_db_username2);
define('TYPO3_db_password2', $typo_db_password2);
define('TYPO3_db_host2', $typo_db_host2);

Zuletzt tragen wir die Konfiguration in die localconf.php ein

$typo_db_username2 = 'root'; // Modified or inserted by TYPO3 Install Tool.
$typo_db_password2 = 'test'; // Modified or inserted by TYPO3 Install Tool.
$typo_db_host2 = '192.168.17.17:3307'; // Modified or inserted by TYPO3 Install
Tool.

Der Aufruf von

show global status LIKE „%select%“;

nach 1000 Seitenaufrufen zeigt, dass schon 2/3 aller Select-Anfragen an die RAM-Datenbank gehen.

In der normalen Datenbank
Com_select | 3002

In der RAM-Datenbank
Com_select | 6012

Wie die beiden Screenshots zeigen, ist die durchschnittliche Verarbeitungszeit der Seite um ca. 10% zurück gegangen.

Eine Steigerung von 10% ist in Anbetracht der Tatsache, dass beide Datenbanken (RAM und Disk) auf dem gleichen System gelaufen sind recht ordentlich. Der einzige Aufwand liegt, falls genügend RAM vorhanden ist, in der oben beschriebenen Einrichtung.

Die Verteilung Anfragen auf zwei Server wird nur dann zu spürbaren Geschwindigkeitsvorteilen führen, wenn ein Datenbanksystem ausgelastet ist. Da die Hauptlast einer TYPO3-Installation von den PHP-Scripten verursacht wird, dürfte das aber nur in sehr großen Installationen mit mehreren Webservern der Fall sein. (te)

 Antworten

Du kannst diese HTML Tags und Attribute benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(Pflichtfeld)

(Pflichtfeld)

© 2017 LAMP solutions GmbH