OTRS - MySQL Replikation für separaten Suchserver

Howto's zu OTRS Themen. Keine neuen Topics mit Fragen in diesem Forum!
Post Reply
Andre Bauer
Znuny guru
Posts: 2189
Joined: 08 Dec 2005, 17:01
Znuny Version: 5.0.x
Real Name: André Bauer
Company: Magix Software GmbH
Location: Dresden
Contact:

OTRS - MySQL Replikation für separaten Suchserver

Post by Andre Bauer »

OTRS - MySQL Replikation für separaten Suchserver

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
Bei "NEUES_PASSWORT" müsst Ihr ein neues Passwort für den neuen
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
Bei "NEUES_PASSWORT" müsst Ihr ein neues Passwort für den neuen
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
Für PHPMyAdmin:

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
Die IP bei "bind-address" muss natürlich gegen die IP des SLAVE
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
Bei "master-host" muss die IP der OTRS eingetragen werden. Außerrdem
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
Bei "Core::MirrorDB::User:" kommt der zuvor angelegte
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.
Last edited by Andre Bauer on 16 Jan 2007, 11:00, edited 4 times in total.
Prod: Ubuntu Server 16.04 / Zammad 1.2

DO NOT PM ME WITH OTRS RELATED QUESTIONS! ASK IN THE FORUMS!

OtterHub.org
Dennis
Znuny wizard
Posts: 310
Joined: 16 Dec 2005, 14:40
Location: Schömberg
Contact:

Post by Dennis »

So ich versuch das gerade umzusetzen. Bei deinem Script ist jetzt folgendes passiert:
delete local binary logs

reset mysql master server
ERROR 1186 at line 1: Binlog closed, cannot RESET MASTER
er tart jetzt gerade die Datenbanken, hast du ne Idee?
Dennis
Znuny wizard
Posts: 310
Joined: 16 Dec 2005, 14:40
Location: Schömberg
Contact:

Post by Dennis »

Also er benutzt jetzt den zweiten Server als Suchserver, aber es scheint dennoch etwas nicht in Ordnung zu sein, ein gerade neu erstelltes Ticket finde ich in der Suche nicht. Dauert die Replikation ein wenig? Oder wie kann ich kontrollieren ob diese funktioniert?

Fehlermeldung in der mysqld.log auf dem Slave:
Version: '4.0.21' socket: '/var/lib/mysql/mysql.sock' port: 3306 Source distribution
060711 12:37:23 Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log './poet-demo1-relay-bin.001' position: 4
060711 12:37:23 Slave I/O thread: error connecting to master 'repli@192.168.245.101:3306': Error: 'Lost connection to MySQL server during query' errno: 2013 retry-time: 60 retries: 86400
060711 12:37:23 Slave I/O thread killed while connecting to master
060711 12:37:23 Slave I/O thread exiting, read up to log 'FIRST', position 4
060711 12:37:23 Error reading relay log event: slave SQL thread was killed
060711 12:37:23 Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log './poet-demo1-relay-bin.001' position: 4
060711 12:37:23 Slave I/O thread: error connecting to master 'repli@192.168.245.101:3306': Error: 'Lost connection to MySQL server during query' errno: 2013 retry-time: 60 retries: 86400
060711 12:38:23 Slave I/O thread: connected to master 'repli@192.168.245.101:3306', replication started in log 'FIRST' at position 4
060711 12:38:23 While trying to obtain the list of slaves from the master '192.168.245.101:3306', user 'repli' got the following error: 'Access denied. You need the REPLICATION SLAVE privilege for this operation'
060711 12:38:23 Slave I/O thread exiting, read up to log 'FIRST', position 4
Dennis
Znuny wizard
Posts: 310
Joined: 16 Dec 2005, 14:40
Location: Schömberg
Contact:

Post by Dennis »

habs selbst gefunden: GRANT REPLICATION SLAVE ON *.*
-> TO 'replicauser'@'%.example.com' IDENTIFIED BY 'replicapass';
Andre Bauer
Znuny guru
Posts: 2189
Joined: 08 Dec 2005, 17:01
Znuny Version: 5.0.x
Real Name: André Bauer
Company: Magix Software GmbH
Location: Dresden
Contact:

Post by Andre Bauer »

Sorry. Habs erst jetzt gesehen.

Wenn neue Tickets nicht gefunden werden, ist die Replikation fehlerhaft.
Du siehst das in den Logs (siehe oben) oder wenn du per PHPMyadmin die Anzahl der Datensätze in den beiden OTRS Datenbanken vergleichst (sollte immer gleich sein).


Du hast recht. Abhängig von der Mysql Version kann das etwas abweichen.
Siehe:
http://dev.mysql.com/doc/refman/4.1/en/replication-howto.html wrote:Suppose that your domain is mydomain.com and that you want to create an account with a username of repl such that slave servers can use the account to access the master server from any host in your domain using a password of slavepass. To create the account, use this GRANT statement:

mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

For MySQL versions older than 4.0.2, the REPLICATION SLAVE privilege does not exist. Grant the FILE privilege instead:

mysql> GRANT FILE ON *.*
-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

If you plan to use the LOAD TABLE FROM MASTER or LOAD DATA FROM MASTER statements from the slave host, you must grant this account additional privileges:

*

Grant the account the SUPER and RELOAD global privileges.
*

Grant the SELECT privilege for all tables that you want to load. Any master tables from which the account cannot SELECT will be ignored by LOAD DATA FROM MASTER.

Ich pass das bei Gelegenheit noch an...
Prod: Ubuntu Server 16.04 / Zammad 1.2

DO NOT PM ME WITH OTRS RELATED QUESTIONS! ASK IN THE FORUMS!

OtterHub.org
Dennis
Znuny wizard
Posts: 310
Joined: 16 Dec 2005, 14:40
Location: Schömberg
Contact:

Post by Dennis »

okay danke. Jetzt gehts übrigens wunderbar :)
Produktiv:
SuSE 11.2 - OTRS 2.4.7
Andre Bauer
Znuny guru
Posts: 2189
Joined: 08 Dec 2005, 17:01
Znuny Version: 5.0.x
Real Name: André Bauer
Company: Magix Software GmbH
Location: Dresden
Contact:

Post by Andre Bauer »

Hab das Howto mal entsprechend angepasst...
Prod: Ubuntu Server 16.04 / Zammad 1.2

DO NOT PM ME WITH OTRS RELATED QUESTIONS! ASK IN THE FORUMS!

OtterHub.org
Andre Bauer
Znuny guru
Posts: 2189
Joined: 08 Dec 2005, 17:01
Znuny Version: 5.0.x
Real Name: André Bauer
Company: Magix Software GmbH
Location: Dresden
Contact:

OTRS - MySQL Replikation für separaten Suchserver

Post by Andre Bauer »

Habe das Bash Script zum Erstellen / Reparieren der Replikation überarbeitet.

Eine Wiederherstellung einer defekten Replikation hat jetzt bei mir nur noch einen MySQL Ausfall von 5 Minuten zur Folge :-)
Prod: Ubuntu Server 16.04 / Zammad 1.2

DO NOT PM ME WITH OTRS RELATED QUESTIONS! ASK IN THE FORUMS!

OtterHub.org
Dennis
Znuny wizard
Posts: 310
Joined: 16 Dec 2005, 14:40
Location: Schömberg
Contact:

OTRS - MySQL Replikation für separaten Suchserver

Post by Dennis »

Normalerweise sollte die Replikation doch von alleine wieder aufgebaut werden.
Also angenommen der Slave war ne Stunde weg und ich starte ihn wieder, dann überprüft er doch seinen binlog stand mit dem des Masters und repliziert danach eben wieder auf den selben Stand. Wozu also das Script?
Produktiv:
SuSE 11.2 - OTRS 2.4.7
Andre Bauer
Znuny guru
Posts: 2189
Joined: 08 Dec 2005, 17:01
Znuny Version: 5.0.x
Real Name: André Bauer
Company: Magix Software GmbH
Location: Dresden
Contact:

OTRS - MySQL Replikation für separaten Suchserver

Post by Andre Bauer »

Richtig. Normaler Weise bei kurzen Unterbrechungen schon. Funktioniert aber in manchen Fällen eben auch nicht.

Szenario 1.) Auf dem Slave Server wurde geschrieben. Daten daher inkonsistent.

Szenario 2.) Die benötigten Binlogs zur Wiederherstellung sind wegen Autodelete schon nicht mehr vorhanden.

Ich hatte den Fall nun schon mehrmals. Das macht also durchaus Sinn.

Außerdem ist das Script ja auch hauptsächlich zur initialen Erstellung der Replikation gedacht.
Prod: Ubuntu Server 16.04 / Zammad 1.2

DO NOT PM ME WITH OTRS RELATED QUESTIONS! ASK IN THE FORUMS!

OtterHub.org
Dennis
Znuny wizard
Posts: 310
Joined: 16 Dec 2005, 14:40
Location: Schömberg
Contact:

OTRS - MySQL Replikation für separaten Suchserver

Post by Dennis »

Okay alles klar. Das war auch mehr eine Verständnisfrage meinerseits :)
Produktiv:
SuSE 11.2 - OTRS 2.4.7
dieda
Znuny newbie
Posts: 7
Joined: 03 Mar 2008, 11:47

OTRS - MySQL Replikation für separaten Suchserver

Post by dieda »

Hallo!

Ich hab auch mal ne Frage zu dem Thema, da ich versuche das nach obiger Anleitung einzurichten.
Das hat soweit alles geklappt, ich habe allerdings bei OTRS 2.2.6 die genannten Optionen in der SysConfig von OTRS nicht (mehr?) drin. Geht das damit überhaupt noch?

Gruß
Dieda
OTRS 3.2.9 - MySQL 5.5 - Ubuntu 12.04
Andre Bauer
Znuny guru
Posts: 2189
Joined: 08 Dec 2005, 17:01
Znuny Version: 5.0.x
Real Name: André Bauer
Company: Magix Software GmbH
Location: Dresden
Contact:

OTRS - MySQL Replikation für separaten Suchserver

Post by Andre Bauer »

Klar ist das noch drin!

Einfach mal die Sysconfig Suche nutzen. --> "Framework -> Core::MirrorDB"

Hab das Howto mal entsprechend angepasst.
Prod: Ubuntu Server 16.04 / Zammad 1.2

DO NOT PM ME WITH OTRS RELATED QUESTIONS! ASK IN THE FORUMS!

OtterHub.org
dieda
Znuny newbie
Posts: 7
Joined: 03 Mar 2008, 11:47

OTRS - MySQL Replikation für separaten Suchserver

Post by dieda »

Super, vielen Dank für die Korrektur - klappt jetzt einwandfrei!

Gruß
Dieda
OTRS 3.2.9 - MySQL 5.5 - Ubuntu 12.04
Jazz
Znuny newbie
Posts: 28
Joined: 18 Apr 2008, 11:47

OTRS - MySQL Replikation für separaten Suchserver

Post by Jazz »

monotek wrote:Klar ist das noch drin!

Einfach mal die Sysconfig Suche nutzen. --> "Framework -> Core::MirrorDB"

Hab das Howto mal entsprechend angepasst.

Ist diese Funktion in OTRS 2.1.* nicht enthalten? Dort kann ich leider nichts dazu finden. Auch im Admin Manual steht die Funktion unter 2.1 nicht drin. Ist dennoch möglich sie dort zu nutzen?

Live: OTRS 2.4.12, SLES 10, Apache 2.2 + MySQL 5.0
Test: OTRS 3.1.0beta3, SLES 11, Apache 2.2 + MySQL 5.0
Andre Bauer
Znuny guru
Posts: 2189
Joined: 08 Dec 2005, 17:01
Znuny Version: 5.0.x
Real Name: André Bauer
Company: Magix Software GmbH
Location: Dresden
Contact:

OTRS - MySQL Replikation für separaten Suchserver

Post by Andre Bauer »

Keine Ahnung. Habe hier nur OTRS 2.3.x und 2.4.x.
Prod: Ubuntu Server 16.04 / Zammad 1.2

DO NOT PM ME WITH OTRS RELATED QUESTIONS! ASK IN THE FORUMS!

OtterHub.org
jojo
Znuny guru
Posts: 15019
Joined: 26 Jan 2007, 14:50
Znuny Version: Git Master
Contact:

OTRS - MySQL Replikation für separaten Suchserver

Post by jojo »

Die Funktion gibt es seit der 1.3
"Production": OTRS™ 8, OTRS™ 7, STORM powered by OTRS
"Testing": ((OTRS Community Edition)) and git Master

Never change Defaults.pm! :: Blog
Professional Services:: http://www.otrs.com :: enjoy@otrs.com
Jazz
Znuny newbie
Posts: 28
Joined: 18 Apr 2008, 11:47

OTRS - MySQL Replikation für separaten Suchserver

Post by Jazz »

jojo wrote:Die Funktion gibt es seit der 1.3

Habs gefunden und eingerichtet. Funktioniert. Danke für den Hinweis.

Live: OTRS 2.4.12, SLES 10, Apache 2.2 + MySQL 5.0
Test: OTRS 3.1.0beta3, SLES 11, Apache 2.2 + MySQL 5.0
Post Reply