Ideen für eine parallele Installation eines DMS

boehmi

New member
Hallo,

ich habe hier folgendes Problem:
wir haben ein DMS (KnowledgeTree), welches Produktiv eingesetzt wird.
Das ist im Grunde genommen eine Ansammlung von PHP Scripts, auf Basis von MySQL und Apache.
Das ganze läuft auf einem Linux auf einer IBM z Maschine.

Nunja, jedenfalls geht es nun darum in Zukunft sicher und komfortabel Updates des gleichen Einspielen zu können.
Der Normale Updateprozess des DMS ist im Grunde genommen eine Überschreibung des alten Ordners und die anschließende Ausführung eines Updatescripts, das wirkt mir aber zu unsicher, weil man keine Möglichkeit hat rückgängig zu machen.
Mal von Backups abgesehen, was nicht besonders elegant ist.

Deshalb soll ein Testsystem eingerichtet werden, also eine Parallele Installation der neuen Version, welche zum Testen genommen wird und die Produktiv-eingesetzte Version auch bei Fehlern nicht beeinflussen darf.

Wenn alles fehlerfrei getestet wurde soll einfach "umgeswitcht" werden.
Also ohne Ausfallzeit und ohne dass die User etwas merken.

Die erste und naheliegenste Möglichkeit, die mir einfiel ist einfach ein neuer Ordner für das Testsystem anlegen, eine neue Datenbank dafür anlegen und darin installieren.
Rechte für die Produktivdatenbank natürlich entziehen.
Das Problem was ich hier sehe ist, dass die Testumgebung eventuell den MySQL Server (den sich ja beide teilen) negativ beeinflusst und somit auch das Produktivsystem.

Ist es möglich auf Linux auch 2 MySQL Server parallel zu betreiben?

Eine weitere Möglichkeit wäre eine weitere VM anzulegen, als Klon der Produktivumgebung, dort zu updaten, testen und gegebenenfalls umzuswitchen.
Natürlich zieht eine VM nochmal extra Leistung/Speicher etc. und ist deshalb vllt. übertrieben.
Die Z is ohnehin nicht mehr die schnellste ;-)

Habt ihr noch weitere Vorschläge/Ergänzungen usw?

Würde mich freuen

Danke
 

bitmuncher

Moderator
Du kannst problemlos mehrere DB-Systeme parallel laufen lassen. Gibt nur einiges zu beachten:

- Du musst selbst kompilieren um jede DB in einen extra Ordner zu installieren.
- Die DBs müssen auf verschiedenen Ports und/oder Netzwerk-Interfaces laufen.
- Die DBs dürfen sich auf keinen Fall ihre Daten- oder Log-Verzeichnisse teilen.

Du könntest z.B. diese Anleitung nutzen um die Datenbanken zu kompilieren. Dabei musst du lediglich die Pfade beim configure-Befehl anpassen.
 

boehmi

New member
Vielen Dank für die Antwort.

In deinem Link ist im Configure Befehl der Parameter --sysconfdir=/etc enthalten,
kommt es da nicht zu Konflikten zwischen beiden Servern?

Kann man das Verzeichnis einfach auf ein beliebiges ändern?
 

boehmi

New member
Original von bitmuncher
Deswegen schrieb ich ja, dass du die Pfade anpassen musst. Da kannst du natürlich beliebige wählen.
Jop, das habe ich mir schon gedacht, nur ich weiß ja nicht genau wofür er das sysconfigdir benötigt,
eventuell muss er ja auf andere Sachen in /etc zugreifen
und wenn ich dass dann auf ein beliebiges Verzeichnis ändere läufts nicht.


Und kannst du mir noch verraten, wie ich den client in /usr/bin hinbekomme,
habe die befürchtung dass der Original Client von der Install überschrieben wird?
Also so dass ich beide Clients über die Kommandozeile aufrufen kann, einma mysql und einma mysql_test ?

Hab leider keine Erfahrung damit.


//edit: Einfach die sachen /usr/local/mysql_test/bin umbenennen und dann nach usr/bin linken?
Wobei mysql_test mein geänderter Ordnername ist

Danke
 

bitmuncher

Moderator
Ich würde dir folgendes empfehlen...

Du installierst 2 MySQL, eine in /usr/local/mysql und die andere in /usr/local/mysql_test. Die Konfigurationen und Datenverzeichnisse legst du auch innerhalb dieser Verzeichnisse ab. Damit hast du eine saubere Trennung der Daten und Software beider DBs. Einen der Clients verlinkst du nach /usr/bin. Wichtig ist ja nur, dass der Client min. die Version des Servers hat. Mit dem Client kannst du also auf beide Server zugreifen. Alternativ rufst du den Client immer mit dem vollen Pfad auf.
 

bitmuncher

Moderator
Naja, ganz so'n Denkfehler ist das nicht. Du musst halt drauf achten nicht über localhost auf die DB zuzugreifen, wenn du einen Client nutzt, der nicht mit der DB kompiliert wurde. Nutzt du localhost, wird der Client- und Server-Abschnitt der my.cnf ausgewertet, die zum Client gehört, um darüber den lokalen Socket usw. zu ermitteln. Ansonsten nutzt er aber eh TCP und dann ist es egal, welchen Client du hast. Vorsicht auch beim Linken von PHP o.ä.. Immer bedenken, dass das PHP gegen die beim Kompilieren angegebene MySQL gelinkt ist.
 

boehmi

New member
Mh ich möchte schon über localhost drauf zugreifen.
Ich dachte jetzt eigentlich dass ich einfach z.b. mit mysql -P andererPort auf den anderen Server zugreife?
Und bei PHP genauso einfach einen anderen Port beim Connecten angebe.
 

bitmuncher

Moderator
Dann wirst du um 2 PHP-Versionen vermutlich nicht herum kommen, damit der richtige Socket genutzt wird. Sonst versucht PHP ggf. den falschen lokalen Socket zu benutzen. Weiss allerdings nicht wie es bei einer expliziten Port-Angabe reagiert und ob da ggf. TCP für die Verbindung benutzt wird. Müsste man einfach mal evaluieren.
 

Serow

New member
Ich würde dir die Virtualisierungslösung empfehlen. Hast du schon nen VMware ESX Server laufen oder wie kann ich mir das vorstellen? 2 VMs wird er ja wohl locker packen oder? ;) Gerade mit dem transparent page sharing sollte das bei gleich OSs kein Thema sein.

cu
serow
 

boehmi

New member
Original von Serow
Hast du schon nen VMware ESX Server laufen oder wie kann ich mir das vorstellen?
Naja das Linux läuft als Gast in einem z/VM System.
Natürlich kriegt der das gebacken ;) aber trotzdem zieht er ja den anderen Services Leistung weg.

Ich soll halt so viele wie möglich Lösungsansätze finden und detailiert aufzeigen was zu machen wäre,
und mein Teamleiter möchte dann mit mir zusammen abstimmen welche der Lösungen nun durchgesetzt wird.

Weiß denn wer, wie ich PHP zwingen kann TCP als Verbindung zum MySQL zu benutzen?
Eventuelle Performanceverluste sind weniger wichtig.
Ich kann es leider gerade nicht einfach ausprobieren, ob es vllt. wie o.g. klappt.
 

metax.

New member
Du kannst bei einem MySQL Verbindungsaufbau (mysql_connect) als Host sowohl einen Port mit angeben, als auch direkt einen Pfad zum Socket angeben.
Damit solltest du wohl in der Lage sein, zwei MySQL Server zu unterhalten.

Socket: mysql_connect(':/tmp/mysql', 'mysql_user', 'mysql_password');
Port (TCP/IP): mysql_connect('127.0.0.1:3307', 'mysql_user', 'mysql_password');

http://de.php.net/manual/en/function.mysql-connect.php (Siehe Beispiele)

mfg, metax.
 

boehmi

New member
Was ist wenn ich den socket aus der my.cnf lösche?

Verhält es sich bei 127.0.0.1 genauso wie bei localhost?
 

bitmuncher

Moderator
Dann wird der Default-Path verwendet, der beim Kompilieren angegeben wurde. Wurde keiner angegeben, nutzt er den Default-Path der im Source steht, im Normalfall /data/directory/socket.file.

Edit: Da localhost zu 127.0.0.1 aufgelöst wird, verhält es sich da genauso.
 

metax.

New member
Original von bitmuncher
Dann wird der Default-Path verwendet, der beim Kompilieren angegeben wurde. Wurde keiner angegeben, nutzt er den Default-Path der im Source steht, im Normalfall /data/directory/socket.file.

Edit: Da localhost zu 127.0.0.1 aufgelöst wird, verhält es sich da genauso.
Ich hab das grad mal experimentell verifiziert (PHP5, MySQL 5):

mysql_connect('localhost', 'user', 'pass'); // Standard-Socket
mysql_connect('localhost:12345', 'user', 'pass'); // Standard-Socket
mysql_connect('127.0.0.1:12345', 'user', 'pass'); // Nicht Standard-Socket!
mysql_connect(':/path/to/socket', 'user', 'pass'); // Nicht Standard-Socket!

Es klappt also, wenn du 127.0.01 mit Port verwendest oder den Socket-Pfad direkt angibst.

mfg, metax.
 
Oben