Server spiegeln ohne "Ist Mirror von" Mail, dbispconfig, Einstellungen

isp_geek

Member
Hallo Leute,

ich suche Hilfe bei einem kleinen Projekt. Ich habe zwei Server einer speziell für Mail (nennen wir den X) und einen, der Web, SQL und Mail (nennen wir den Y) bereitstellt. Y kann ich nicht als "ist Mirror von" X setzten, sonst kann ich keine Dienste mehr auf Y konfigurieren. Aber genau das soll möglich bleiben.

Setup bisher: Beide Server sind mit ISPConfig 3.1.1p1 um Cluster und für Ihre jeweiligen Dienste konfiguriert.
Eine Kopie jeweils der Tabelle mail_user und der Verzeichnisse /var/vmail/* der User von X nach Y ermöglichte den Zugriff auf die Postfächer nun auch auf Server Y. Die Synchronisierung der Daten in beiden Postfächern mit dovecot funktioniert.

So, nun das fehlt: Wie mann sich nun denken kann .. müssen die gemachten Einstellungen auf X nun auch auf Y automatisch übernommen werden. Also alle Inhalte, die in den Tabllen "mail_*" liegen, damit sich Y mailtechnisch genauso verhällt wie X.

Ich habe schon ein Script geschrieben, dass regelm. prüft, ob X erreichbar ist und schaltet per DNS auf den anderen Server Y um, falls X nicht mehr erreichbar ist. Hintergrund ist nun leicht zu erkennen .. hat jemand eine Idee wie ich die betreffenden Tabellen in der Datenbank auf den anderen Server spiegeln kann, damit diese stets synchron sind ohne ein extra Script einsetzen zu müssen?

Gibt es in ISPConfig etwas, was ich anzapfen bzw. ausnutzen könnte?
Vielleicht die Funktion "ist Mirror von" oder Teile davon umfunktionieren?
mySQL interne Funktionen zur Synchronisation (über Server hinweg)?

gruß
 

florian030

Active Member
Beide Server sollen die gleichen Mails haben und X zusätzlich noch web und db? Dann mach doch Y ist Mirror von X.
 

isp_geek

Member
naja .. das ist nicht das was sich beabsichtige. Beide Server sollen "unverbunden" sein. Ich bräuchte einen Rat, wie ich sinnvoll die jeweiliegen Tabellen synchronisieren kann.

Ich kann auch ein Cron-Script schreiben und die selber synchronisieren .. aber den Aufwand betreibe ich erst, wenn alle anderen Ansätze scheitern .. vielleicht gibt es was einfacheres?
 

isp_geek

Member
Yeah .. es geht doch :D und das war gar nicht so schwer, wenn man es weiß.

Mache mir das sys_datalog zunutze .. in der Funktion datalogSave(..) in lib/classes/db_mysql.inc.php kann man die Anweisung verdoppeln .. abh. von dem was man machen will .. natürlich mit angepasster server_id .. und so werden die Aktionen auf beide Server angewendet.

Eine bessere Lösung, denke ich, kann es nicht geben.
 

isp_geek

Member
PHP:
    //** Function to fill the datalog with a full differential record.
    public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new, $force_update = false) {
#var_dump($record_old);
#echo "<br><br>";
#var_dump($record_new);
       
        global $app, $conf;

        // Check fields
        if(!preg_match('/^[a-zA-Z0-9\-\_\.]{1,64}$/',$db_table)) $app->error('Invalid table name '.$db_table);
        if(!preg_match('/^[a-zA-Z0-9\-\_]{1,64}$/',$primary_field)) $app->error('Invalid primary field '.$primary_field.' in table '.$db_table);
       
        $primary_id = intval($primary_id);

        if($force_update == true) {
            //* We force a update even if no record has changed
            $diffrec_full = array('new' => $record_new, 'old' => $record_old);
            $diff_num = count($record_new);
        } else {
            //* get the difference record between old and new record
            $tmp = $this->diffrec($record_old, $record_new);
            $diffrec_full = $tmp['diff_rec'];
            $diff_num = $tmp['diff_num'];
            unset($tmp);
        }
       
#echo "<br><br>";
#var_dump($diffrec_full);

        // Insert the server_id, if the record has a server_id
        $server_id = (isset($record_old['server_id']) && $record_old['server_id'] > 0)?$record_old['server_id']:0;
        if(isset($record_new['server_id'])) $server_id = $record_new['server_id'];


        if($diff_num > 0) {
            //print_r($diff_num);
            //print_r($diffrec_full);
           
            $username = $_SESSION['s']['user']['username'];
            $dbidx = $primary_field.':'.$primary_id;
            if(trim($username) == '') $username = 'none';

            if($action == 'INSERT') $action = 'i';
            if($action == 'UPDATE') $action = 'u';
            if($action == 'DELETE') $action = 'd';
           
           
            $diffstr = serialize($diffrec_full);
            $sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES (?, ?, ?, ?, ?, ?, ?)";
            $app->db->query($sql, $db_table, $dbidx, $server_id, $action, time(), $username, $diffstr);

// dbsync with mail2
if ( strpos($db_table, "mail_")!==FALSE || strpos($db_table, "spamfilter_")!==FALSE ){

    if ($server_id == "10") {
        if ($diffrec_full["old"]["server_id"]=="10") $diffrec_full["old"]["server_id"] = "12";
        if ($diffrec_full["new"]["server_id"]=="10") $diffrec_full["new"]["server_id"] = "12";
        $diffstr = serialize($diffrec_full);
        $sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES ('".$db_table."','$dbidx','12','$action','".time()."','$username','$diffstr')";
        $this->query($sql);
    }
    if ($server_id == "12") {
        if ($diffrec_full["old"]["server_id"]=="12") $diffrec_full["old"]["server_id"] = "10";
        if ($diffrec_full["new"]["server_id"]=="12") $diffrec_full["new"]["server_id"] = "10";
        $diffstr = serialize($diffrec_full);
        $sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES ('".$db_table."','$dbidx','10','$action','".time()."','$username','$diffstr')";
        $this->query($sql);
    }
   
}
// dbsync with mail2
        }
#die();
        return true;
    }
vielleicht kanns jemand mal gebrauchen o_O
 

Werbung

Top