Wenn eine OTRS Installation viele Mails verarbeiten muss, wird das
System mit der Zeit immer langsamer, wenn ein Agent die Suche nutzt,
ohne dabei eine zeitliche Grenze zu setzen. In manchen Fällen führt
das sogar zu einer mehrminütigen Blockierung des Systems.
Dafür gibt es aber einen Ausweg. Das OTRS bietet eine Option an, mit
der es möglich ist, Suchanfragen auf einen anderen Server auszulagern,
so das man auf dem eigentlichen OTRS keine Geschwindigkeitseinbußen
mehr hat.
Damit die Suche auch alle aktuellen Tickets einschließt, muss die
Datenbank auf dem Suchsystem in Echtzeit aktualisiert werden. Dafür
ist es nötig einen MySQL Replikation aufzusetzen. Auf dem Suchserver
(der MySQL Slave) sollte die gleiche MySQL Version eingesetzt werden
wie auf dem normalen OTRS (MySQL Master). Auf den Slave darf immer nur
lesend (SELECT) zugegriffen werden, das die Replikation sonst zerstört
wird.
1.) Als erstes muss auf dem Masterserver (OTRS) ein neuer MySQL User
angelegt werden, der für die Replikation zuständig ist.
Der Vorgang unterscheidet sich, abhängig von der verwendeten MySQL
Version, etwas. Ich werde hier beide Wege aufzeigen.
Für MySQL bis Version 4.0:
Auf der Shell geht das am schnellsten wenn Ihr den folgenden Befehl
eingebt:
Code: Select all
echo "GRANT FILE ON *.* TO repli@"%" IDENTIFIED BY "NEUES_PASSWORT";" |
mysql -uroot -pMYSQL_ROOT_PASSWORT
Replikationsuser setzen. Bei "MYSQL_ROOT_PASSWORT" muss euer MySQL
Root Passwort eingetragen werden.
Alternativ könnt Ihr den User natürlich auch unter PHPMyAdmin anlegen.
Dort reicht folgendes in eimem der SQL FEnster, wenn Ihr als Root
eingeloggt seid:
Code: Select all
GRANT FILE ON *.* TO repli@"%" IDENTIFIED BY 'NEUES_PASSWORT';
Für MySQL ab Version 4.1:
Auf der Shell geht das am schnellsten wenn Ihr den folgenden Befehl
eingebt:
Code: Select all
echo "GRANT REPLICATION SLAVE ON *.* TO repli@"%" IDENTIFIED BY
"NEUES_PASSWORT;" | mysql -uroot -pMYSQL_ROOT_PASSWORT
Replikationsuser setzen. Bei "MYSQL_ROOT_PASSWORT" muss euer MySQL
Root Passwort eingetragen werden.
Alternativ könnt Ihr den User natürlich auch unter PHPMyAdmin anlegen.
Dort reicht folgendes in eimem der SQL FEnster, wenn Ihr als Root
eingeloggt seid:
Code: Select all
GRANT REPLICATION SLAVE ON *.* TO repli@"%" IDENTIFIED BY
"NEUES_PASSWORT;
Außerdem benötigen wir noch einen User, der nur lesenden Zugriff auf
das OTRS erhält. Dieser wird dann die Suchanfragen auf dem Suchserver
durchführen. Für die Bash:
Code: Select all
echo "GRANT SELECT ON otrs . * TO otrs_search@"%" IDENTIFIED BY
"NEUES_PASSWORT";" | mysql -uroot -pMYSQL_ROOT_PASSWORT
Code: Select all
GRANT SELECT ON otrs . * TO otrs_search@"%" IDENTIFIED BY
"NEUES_PASSWORT";
2.) Nun müssen die Mysql Konfigdateien des Master Servers angepasst
werden.
Bei Master Server öffnet Ihr die Datei "/etc/mysql/my.cnf". Dort
tragt Ihr folgendes ein (muss eventuell auch nur auskommentiert
werden):
Code: Select all
log-bin
server-id=1
bind-address=192.168.0.2
Servers ausgetauscht werden. Ihr könnt die Zeile aber auch
auskommentieren, wenn Ihr von mehreren Hosts auf das OTRS zugreifen
müsst.
3.) Beim Slave Server muss, ebenfalls unter "/etc/mysql/my.cnf",
folgendes eingetragen werden:
Code: Select all
master-host=192.168.0.1
master-user=repli
master-password=REPLI_PASSWORT
master-port=3306
server-id=2
bind-address=192.168.0.1
noch bei "master-password" das zuvor gesetzte Passwort des "repli"
Users angeben. Der Parameter "bind-address" muss auf die IP des OTRS
eingestellt bzw. wieder komplett auskommentiert werden.
4.) Um nun die bestehende MySQL-Daten vom Mysql Master auf den Mysql
Slave zu bringen und alle weiteren nötigen SQL Befehle abzusetzen,
habe ich ein Bash Script geschrieben, welches die Arbeit für euch
übernimmt. Das Script muss als User "root" ausgeführt werden.
Ihr müsst, während der Ausführung des Scriptes, lediglich 1 mal das
ausführen mit der Eingabe von "ok" bestätigen und 2 mal das Root
Passwort des Slave Servers eingeben. Wenn Ihr den Slave Server für SSH
Public Key Authentifizierung ohne Passwort eingerichtet habt, entfällt
dies, was aber aus sicherheitstechnischer Sicht nicht zu empfehlen
ist.
In den oberen Zeilen des Scripts müssen noch einige Configparameter an
eure Bedürfnisse angepasst werden, die aber selbsterklärend sein
sollten. Das Script gibt bei jeder Aktion auf der Shell aus, was es
gerade macht. Je nach größe der Datenbank kann das Ganze schon ein
paar Minuten dauern.
Code: Select all
#!/bin/bash
#
# Mysql replication script by monotek
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
#config
SLAVE_USER="root"
SLAVE_SERVER="192.168.1.2"
MYSQL_PASS="`cat mysqlrootpass`"
RSYNC_OPTIONS="-a --delete"
LOCAL_DIR="/var/lib/mysql/"
SERVER_DIR="/var/lib/mysql"
ERROR_COUNT="0"
function actionstart (){
echo -e "\n`date '+%d.%m.%G %H:%M:%S'` - $1"
}
function exitcode (){
if [ "$?" = 0 ]; then
echo -e "`date '+%d.%m.%G %H:%M:%S'` - $1 - ok"
else
echo -e "`date '+%d.%m.%G %H:%M:%S'` - $1 - not ok"
let ERROR_COUNT=ERROR_COUNT+1
fi
}
#script
echo -e "\nOTRS MySQL replication will be repaired now! - `date`"
echo -e "\nScript will start in 10 seconds!"
echo "Press STRG+C to abort!"
sleep 10
actionstart "stopping local apache server"
/etc/init.d/apache2 stop
exitcode "stopping local apache server"
actionstart "reset local mysql master server"
echo RESET MASTER | mysql -u root -p${MYSQL_PASS}
exitcode "reset local mysql master server"
actionstart "stopping local mysql server"
/etc/init.d/mysql stop
exitcode "stopping local mysql server"
actionstart "stopping mysql server on slave"
ssh ${SLAVE_USER}@${SLAVE_SERVER} "/etc/init.d/mysql stop"
exitcode "stopping mysql server on slave"
actionstart "copy mysql data to slave server"
rsync ${RSYNC_OPTIONS} ${LOCAL_DIR} ${SLAVE_USER}@${SLAVE_SERVER}:${SERVER_DIR}
exitcode "copy mysql data to slave server"
ssh ${SLAVE_USER}@${SLAVE_SERVER} "(
echo -e '\n`date '+%d.%m.%G %H:%M:%S'` - starting mysql server on slave - start'
/etc/init.d/mysql start
echo '`date '+%d.%m.%G %H:%M:%S'` - starting mysql server on slave - end'
echo -e '\n`date '+%d.%m.%G %H:%M:%S'` - stop mysql slave on slave server'
echo STOP SLAVE | mysql -u root -p${MYSQL_PASS}
echo '`date '+%d.%m.%G %H:%M:%S'` - stop mysql slave on slave server'
echo -e '\n`date '+%d.%m.%G %H:%M:%S'` - reseting mysql slave on slave server'
echo RESET SLAVE | mysql -u root -p${MYSQL_PASS}
echo '`date '+%d.%m.%G %H:%M:%S'` - reseting mysql slave on slave server'
echo -e '\n`date '+%d.%m.%G %H:%M:%S'` - start mysql slave on slave server'
echo START SLAVE | mysql -u root -p${MYSQL_PASS}
echo '`date '+%d.%m.%G %H:%M:%S'` - start mysql slave on slave server'
)"
actionstart "starting local mysql server"
/etc/init.d/mysql start
exitcode "starting local mysql server"
actionstart "starting local apache server"
/etc/init.d/apache2 start
exitcode "starting local apache server"
echo -e "\n`date` - Repairing Replication complete - errors = ${ERROR_COUNT}"
5.) Als letztes muss nur noch in der OTRS Konfiguration eingestellt
werden, dass die Suche auf dem anderen Server ausgeführt wird.
Geht dazu in der Sysconfig auf "Framework -> Core::MirrorDB".
Bei "Core::MirrorDB::DSN:" gebt Ihr folgendes ein:
Code: Select all
DBI:mysql:database=otrs;host=192.168.0.2
User "otrs_search" hinein. Darunter bei
"Core::MirrorDB::Password:" kommt das von euch
ausgewählte Passwort rein. Dann abspeichern.
Das wars. Die Suche sollte ab jetzt auf dem zweiten Server ausgeführt
werden. Sollte die Replikation, z.B. durch nichterreichbarkeit eines
Servers, aus dem Tritt kommen (sieht man am besten wenn Anzahl der
Datensätze der OTRS Datenbank beim Master größer ist oder in den Logs)
reicht es das Script nochmal auszuführen.