Aktive Server Rollenspiele - Downloadmanager

saftmeister

Nutze den Saft!
Die Informationen hätten mal eher kommen sollen. Hiernach sehe ich vollkommen ein, das eine Replikation der DB Kanonen-auf-Spatzen ist. DB-Dump+Import genügt vollends. Ich bin davon aus, das jede Menge Laufzeit-Daten verwendet und damit hohe Datenbank-Fluktuation statt findet. Gewaltig getäuscht.

Zu den Punkten: Lässt sich alles prima mit Bordmitteln erledigen.

Du solltest aber für alle Server einen separaten Benutzer in der MySQL-DB für den Dump- und Import-Prozess anlegen, der auf den jeweiligen Umgebungen jeweils nur die entsprechenden Rechte hat, wenn du bspw. verbieten willst, das ein INSERT-INTO auf dem Master möglich ist.

Für den Fail-over-switch solltest du dir Gedanken machen, ob kompletter Hardware-Ausfall auch abgefangen werden soll. In diesem Falle empfehle ich, eine Monitoring-Komponente auf einer anderen dedizierten Maschine zu installieren, die alle Server überwacht und ggf. eine weitere Flag-Spalte umsetzt oder den neuen Master definiert => hier sehe ich erstmal größeren Aufwand auf grund von Eintragungen im Nameserver (IP tauschen, neu starten, DNS-Tabelle replizieren lassen, etc). Letztendlich könntest du eine Ausfallzeit von ca. 15-30 Min haben aufgrund von DNS-Caches, Nameservice-Replikation und so weiter. Durch bereits erwähntes Round-Robin wäre es möglich, das abzufangen, allerdings verstößt das gegen die anderen Bedingungen des Konzepts, das z.B. keine Eintragungen von Daten an den Slaves möglich sein soll.

Außerdem kann es aufwendig werden, den Fail-Over zu testen. Der Fail-Over besteht prinzipiell aus folgenden Einzelschritten, die vom Monitor erledigt werden müssten:

1. Neu-Definieren des Masters aufgrund der Tabelle, die (auch/nur) auf der Monitoring-Einheit vorhanden ist
2. Connect zum Nameserver und austausch der IP-Addresse für Domain xyz.tld
3. [Schritt abhängig von der Sicherheitsstufe der Benutzer-Einstellung in der MySQL-DB]
- Neu-Setzen der Privilegien für den Laufzeit-Benutzer der Scripts für Dump auf dem neuen Master (INSERT INTO jetzt verboten)
4. Anlegen der Cron-Jobs für Sonntag (Dump+Dateien) - Für Dateien empfehle ich rsync - ist mehrfach erprobt und kommt gut mit großen und kleinen Mengen zurecht
5. Auf der DB des neuen Masters muss der (noch nicht konzipierte) Zugriff für den Administrator gewährt werden, das könnte man so erledigen, das bei jedem Login am Admin-Panel die Monitoring-Komponente gefragt wird, wer der aktuelle Master ist (mysql_connect() zur Monitoring-Komponente, Abfragen etc.); Hat den Vorteil, das dies ab dem Zeitpunkt möglich wäre, an dem die Monitoring-Komponente den Ausfall bemerkt hat und die Rollen neu verteilt wurden. Nachteil ist der Traffic zwischen zwei verschiedenen Maschinen bei Login am AP muss sichergestellt werden.

Zu deiner Frage mit dem Config-File: Ich glaube nicht, das dies notwendig ist, denn sämtliche Tasks beim Fail-Over erfordern ohnehin Änderungen am System. Ob man jetzt ein Konfig-File anpasst, oder Links neu im Dateisystem verlegt, ist dann erstmal egal. Beim Config-File wäre mir die Gefahr zu hoch, das eine Änderung das System im Ganzen kaputt macht. Die Monitoring-Komponente kann vorgefertige Scripte auf dem neuen Server über HTTP aufrufen, welche die entsprechenden Tasks ausführt, die im Fail-Over definiert sind.

So, das war erst mal ein bisschen Input. Du kannst mit den Vorschlägen verfahren wie du willst, evtl. hast du dadurch noch bessere Ideen.
 

zkmlch

Master of Disaster
So ich bekomm langsam nen Überblick....

Benötigte Module


Login Script

Ich muss ein Login Script entwickeln, welches auf einem HTML Formular basiert. Beim login muss mit einer einfachen if-Anweisung mit abfrage an den Datenbank-Flag überprüft werden ob der Server auf dem sich der User anmeldet „master“ oder „slave“ ist. Falls er nicht „master“ ist Error ausgeben:“Um mich zu bearbeiten muss Ich „master“ sein. Möchtest du mich zum Master machen?
Option Nein: Bricht das Login verfahren ab.
Option Ja: Macht folgendes:
1. Setzt den Flag des bisherigen „masters“ auf „slave“
2. Setzt den Flag des CurrentServers auf „master“
3. Login-Script startet eine Seesion und der User kann aufs Admin-Panel

Kann mir hier jemand helfen ein Abgestimmtes Login-Script zu Entwickeln?

Mirror Script (angepasste Version)

Ich muss das bestehende Mirror Script so anpassen das es zuerst eine if Anfrage an die Datenbank stellt ob der CurrentServer mit „master“ gflagt ist. Ist diese bedingung wahr so soll er den nächsten befehl im script ausführen. Ist er nicht wahr soll er sofort abbrechen.

Bestehendes Script (mirror.sh)

Code:
#!/bin/sh

#	Hier soll die IF Anweisung hinkommen

		
#	Backup Anweisung zum Dumpen

	mysqldump --user=root --password=asdf1234 --databases db_filemanager > /var/www/downloadseite/dbupdate/db_backup	

#	rsync Anweisung		  Quelle		  Ziel	

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.224:/var/www/downloadseite/

	rsync --avz -e ssh /var/www/downloadseite/ patrick@192.168.4.225:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.226:/var/www/downloadseite/

Kann mir jemand mit der IF-Anweisung helfen?

Insert-Into Script (angepasste Version)


Ich muss das bestehende Insert-Into Script so anpassen das es zuerst eine if Anfrage an die Datenbank stellt ob der CurrentServer mit „slave“ gflagt ist. Ist diese bedingung wahr so soll er den nächsten befehl im script ausführen. Ist er nicht wahr soll er sofort abbrechen.


Gruss Patrick

Edit: @saftmeister (wiso denk ich immer an saftsack? :D) Herzlichen Dank für deine Ausführliche Doku :) Leider Möchte Ich das Fail-Over noch im Background lassen, da Ich zuerst das Prove of Concept der obengenannten Module realisieren möchte. Aber Ich behalt es mir sicherlich warm :)
 
Zuletzt bearbeitet:

zkmlch

Master of Disaster
Mirror Script (mirror.sh)

Guten Morgen

Ich hab da mal einen Entwurf gemacht; Aber esgeht nicht...

PHP:
#!/bin/sh

# Mirror Script (mirror.sh)
# Version 0.12 // 13.10.2011

# Scriptbeschreibung: Dieses Script soll den Ordner "downloadseite" welcher im Verzeichnis /var/www/ abgelegt ist auf allen fünf Webserver abgleichen. Jedoch nur wenn der Server "master" ist...



#	Hier soll die IF Anweisung hinkommen
	
	$mysqlhost="localhost";
	$mysqluser="root"; 
	$mysqlpwd="asdf1234"; 
	$mysqldb="db_filemanager";

	$db = @mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Konnte keine Verbindung zur Datenbank herstellen");
	mysql_select_db($mysqldb, $db);

	$sql = "SELECT server_rolle FROM tbl_server";
	$rolle = mysql_query($sql);

	$current_ip = $REMOTE_ADDR;

	current_hostname=hostname	


	if ($rolle['server_rolle']=="master" && $rolle['server_address']==$current_ip || $rolle['server_hostname']==$current_hostname){
		
#	Backup Anweisung zum Dumpen

	mysqldump --user=root --password=asdf1234 --databases db_filemanager > /var/www/downloadseite/dbupdate/db_backup	

#	rsync Anweisung		  Quelle		  Ziel	

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.222:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.224:/var/www/downloadseite/

	rsync --avz -e ssh /var/www/downloadseite/ patrick@192.168.4.225:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.226:/var/www/downloadseite/

	}

Kann mir da jemand helfen? Danke :)

EDIT:

Das bash kan nicht mit den Variablen anfangen... Ich frage mich nur wie Ich ohne PHP in einer Bash das gleiche ergebnis erzielen kann...

Gruss Patrick
 
Zuletzt bearbeitet:

zkmlch

Master of Disaster
Hab mein Script mal Weiterentwickelt... Nun brauche Ich euere Hilfe...

Ich hab das Script sauber erklärt, sollte eigentlich alles verständlich sein. Sonst ungeniert fragen.

PHP:
#	Mirror Script (mirror.sh)
#	Version 0.23 / Fr. 14.10.11


#	Kurzbeschreib:
#	Das Script spiegelt alle vorhandenen Downloadfiles auf alle Slave Server.
#	Der Dump und die Rsync Befehle dürfen nur ausgeführt werden wenn der Server
#	"master" ist. (Er bekommt automatisch oder manuell einen Flag in der 
#	db_filemanager in der Tabelle tbl_server unter der Spalte; server_rolle


#	Datenbankauszug:

#	+-------------+----------------------+----------------+--------------+-----------------+
#	| server_prio | server_address       | server_comment | server_rolle | server_hostname |
#	+-------------+----------------------+----------------+--------------+-----------------+
#	|           5 | http://192.168.4.226 |                | slave        |                 |
#	|           4 | http://192.168.4.225 |                | slave        |                 |
#	|           3 | http://192.168.4.224 |                | slave        |                 |
#	|           2 | http://192.168.4.223 |                | slave        |                 |
#	|           1 | http://192.168.4.222 |                | master       |                 |
#	+-------------+----------------------+----------------+--------------+-----------------+


    

# 	Definition der Varible current_ip (IP Adresse)
	simple_ip=`ifconfig eth0 | head -n 2 | tail -n 1 | cut -d: -f2 | cut -d" " -f 1`
	echo "$simple_ip";
	
	http='http://';
	ip=$simple_ip;

#	Hier sollen die beiden Variablen zusammengeführt werden: Soll Ergebniss zB: http://192.168.4.223
    	current_ip=$http . $ip;

	echo "$current_ip";

#	DB Connect
	mysql --user=root --password=asdf1234
#	DB auswählen
	use db_filemanager
#	Select Anweisung & Query 
	sql=SELECT * FROM tbl_server WHERE server_rolle = "$current_ip";
	query=mysql_query($sql);
	
	rolle=mysql_fetch_array($query);
	
	exit

	echo "$sql";
	echo "$current_ip";
	echo "$rolle";

#	IF Anweisung: mysql dump dar NUR dan ausgeführt werden wen der Server in der Datenbank
#	als master geflaggt ist. Desshalb frage Ich in der Select Anweisung nach 
#	"WHERE" server_rolle = "eigene IP Adresse" (bei der migrierung werde ich dann nach dem 
#	Hostnamen suchen.

   if `$rolle == master`{
        
#    Backup Anweisung zum Dumpen

    mysqldump --user=root --password=asdf1234 --databases db_filemanager > /var/www/downloadseite/dbupdate/db_backup    

#    rsync Anweisung          Quelle          Ziel    

# 	webserver222
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.222:/var/www/downloadseite/
# 	webserver223
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/
#	webserver224
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.224:/var/www/downloadseite/
#	webserver225
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.225:/var/www/downloadseite/
#	webserver226
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.226:/var/www/downloadseite/

    }

Fehlerbeschreib:

Bleibt in der Befehlszeile von MySQL stehen und fürd die SQL Befehle von mir nicht aus.
Nach eingabe von exit erscheint noch folgender Fehler:

Code:
ww/downloadseite/mirror.sh: 42: [new_file]: not found
/var/www/downloadseite/mirror.sh: 43: Syntax error: "(" unexpected
ach eingabe von exit erscheint noch folgender Fehler:
 

saftmeister

Nutze den Saft!
Du machst in dem Shell******-Script einen Misch-Masch aus verschiedenen Sprachen, das kann ja nix werden. Entscheide dich für eine und bau das Script mit einer Sprache.
 

zkmlch

Master of Disaster
Ich möchte es in Bash Sprache haben... Aber Ich komm nicht mehr weiter... Zwischenzeitlich habe Ich noch folgendes geändert:

PHP:
 sql=SELECT * FROM tbl_server WHERE server_rolle = "$current_ip";
    query=mysql_query($sql);
    
    rolle=mysql_fetch_array($query);

zu:

PHP:
rolle=SELECT server_rolle FROM tbl_server WHERE server_address = "$current_ip";

Jetzt müsste doch alles Shell Sprache sein....

Gruss Patrick
 

zkmlch

Master of Disaster
Hi saftmeister hast du das gelesen:

Zwischenzeitlich habe Ich noch folgendes geändert:

PHP-Code:
sql=SELECT * FROM tbl_server WHERE server_rolle = "$current_ip";
query=mysql_query($sql);

rolle=mysql_fetch_array($query);


zu:


PHP-Code:
rolle=SELECT server_rolle FROM tbl_server WHERE server_address = "$current_ip";
Jetzt müsste doch alles Shell Sprache sein....

Gruss Patrick
 

zkmlch

Master of Disaster
hmmm desshalb stelle Ich hier ja die Frage wie Ich es umsetzten kann, das mir jemand vielleicht ne Lösung bieten kann...

MySQL wird ja geöffnet aber die Anweisungen werden nicht ausgeführt... wenn ich aber die SQL Anwisungen in eine EOFMYSQL<<< .... >>> hänge funktionieren die Variablendefinitionen innerhalb der MySQL Anweisungen nicht mehr und somit nicht usefull....

Ich dreh langsam am Rad... :confused: :confused: :confused: