How to
KB N°2444

Haute disponibilité avec les serveurs Olfeo

Versions: V.5.x V6.x
Publié le vendredi 17 mai 2013
Modifié le jeudi 28 décembre 2017

Comment mettre en place la haute disponibilité sur les serveurs Olfeo.

Objectif

Mettre en place la haute disponibilité avec le protocole VRRP afin d'utiliser une IP virtuelle permettant la continuité de service Olfeo sur un des membres du cluster.

Étapes

1. Créer un domaine Olfeo :

Une page de patience va alors indiquer que la création du domaine est en cours :

Joindre des membres à ce domaine :

Ajouter une machine esclave à ce domaine :

L'objet esclave a été créé mais ce dernier est Hors-ligne :

Il faut, sur la machine esclave, également joindre le domaine :

Une page de patience va alors indiquer que la jonction au domaine est en cours :

L'interface graphique indique désormais que le serveur est en mode esclave :

Le serveur maître indique que le serveur esclave est en ligne :

2. La deuxième étape est de créer un cluster afin que chaque membre dispose d'une IP virtuelle :

3. La dernière étape va permettre de mettre en place une haute disponibilité des logs sur le serveur esclave :

Répartition de charge par proxy.pac

Il est possible d'effectuer de la répartition de charge entre les différents noeuds par l'implémentation d'un proxy.pac comme dans l'un des trois exemples ci-dessous :

  • Exemple 1 : haute disponibilité (fail over).
    function FindProxyForURL(url, host) {

    // Ne passe pas par le proxy si le host n'est pas un FQDN.
        if (isPlainHostName(host))
            return "DIRECT";

    // Exceptions : Ne pas passer par le proxy si l'URL match les regex suivantes :
        if (shExpMatch(url,"*domain.com*") || shExpMatch(url,"*vpn.domain.com*"))                  
            return "DIRECT";

    // Ne pas passer par le proxy si les noms d'hôtes de destination sont sur le réseau local.

        var resolved_ip = dnsResolve(host);

        if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||'effectuer une réplication
            isInNet(resolved_ip, "172.16.0.0",  "255.240.0.0") ||
            isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
            isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
            return "DIRECT";
                                            
    // Ne pas passer par le proxy entreprise si l'utilisateur n'est pas connecté au LAN entreprise.
        if (!isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
            return "DIRECT";

    // Tout le reste passe par le proxy entreprise.
        //exemple 1 : Un seul proxy :
        return "PROXY proxy.mondomaine.tld:3129";
        
        //exemple 2 : 2 proxy en Fail Over    
        // return "PROXY proxy1.mondomaine.tld:3129; PROXY proxy2.mondomaine.tld:3129; DIRECT";
    }
  • Exemple 2 : utilisation d'un proxy spécifique selon le protocole utilisé.
    function FindProxyForURL(url, host) {

    // Si l'hôte de destination (FQDN ou IP) est interne : ne pas passer par le proxy.

        var resolved_ip = dnsResolve(host);

        if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
            isInNet(resolved_ip, "172.16.0.0",  "255.240.0.0") ||
            isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
            isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
            return "DIRECT";
                   
    // Utiliser un proxy différent en fonction du protocole.   
        if (shExpMatch(url, "http:*"))  return "PROXY proxy1.mondomain.tld:3129";
        if (shExpMatch(url, "https:*")) return "PROXY proxy2.mondomain.tld:3129";
        if (shExpMatch(url, "ftp:*")) return "PROXY proxy3.mondomain.tld:3129";
                                  
    }
  • Exemple 3 : répartition de charge (load balancing).
    function FindProxyForURL(url, host)
    {

    // Ne passe pas par le proxy si le host n'est pas un FQDN.
        if (isPlainHostName(host))
            return "DIRECT";

    // Exceptions : ne pas passer par le proxy si l'URL match les regex suivantes.
        if (shExpMatch(url,"*domain.com*") || shExpMatch(url,"*vpn.domain.com*"))                 
            return "DIRECT";

    // Ne pas passer par le proxy si les noms d'hôtes de destination sont internes.

         var resolved_ip = dnsResolve(host);

        if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
             isInNet(resolved_ip, "172.16.0.0",  "255.240.0.0") ||
             isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
             isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
            return "DIRECT";

    // Ne pas passer par le proxy entreprise si l'utilisateur n'est pas connecté au LAN entreprise.
        if (!isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
            return "DIRECT";

    // On retourne une chaîne de proxy en fonction du hash de l'URL modulo le nombre de proxy. Ceci permet d'obtenir à la fois une répartition de charge et une tolérance aux pannes.
        ret = URLhash(url);

        if ( (ret % 2) == 0 ) {
            return "PROXY proxy1.mondomaine.tld:3129 ; PROXY proxy2.mondomaine.tld:3129 " ;
        } else  {
            return "PROXY proxy2.mondomaine.tld:3129 ; PROXY proxy1.mondomaine.tld:3129 " ;
        } 
                                                        
       
    }



    function URLhash(name)
    {
        var  cnt=0;
        var str=name.toLowerCase(name);
           
        if ( str.length ==0) {
            return cnt;
        }
               
        for(var i=0;i < str.length ; i++) {
            var ch= atoi(str.substring(i,i + 1));
            cnt = cnt + ch;
            }

        return cnt ;
    }



    function atoi(charstring)
    {

        if ( charstring == "a" ) return 0x61; if ( charstring == "b" ) return 0x62;
        if ( charstring == "c" ) return 0x63; if ( charstring == "d" ) return 0x64;
        if ( charstring == "e" ) return 0x65; if ( charstring == "f" ) return 0x66;
        if ( charstring == "g" ) return 0x67; if ( charstring == "h" ) return 0x68;
        if ( charstring == "i" ) return 0x69; if ( charstring == "j" ) return 0x6a;
        if ( charstring == "k" ) return 0x6b; if ( charstring == "l" ) return 0x6c;
        if ( charstring == "m" ) return 0x6d; if ( charstring == "n" ) return 0x6e;
        if ( charstring == "o" ) return 0x6f; if ( charstring == "p" ) return 0x70;
        if ( charstring == "q" ) return 0x71; if ( charstring == "r" ) return 0x72;
        if ( charstring == "s" ) return 0x73; if ( charstring == "t" ) return 0x74;
        if ( charstring == "u" ) return 0x75; if ( charstring == "v" ) return 0x76;
        if ( charstring == "w" ) return 0x77; if ( charstring == "x" ) return 0x78;
        if ( charstring == "y" ) return 0x79; if ( charstring == "z" ) return 0x7a;
        if ( charstring == "0" ) return 0x30; if ( charstring == "1" ) return 0x31;
        if ( charstring == "2" ) return 0x32; if ( charstring == "3" ) return 0x33;
        if ( charstring == "4" ) return 0x34; if ( charstring == "5" ) return 0x35;
        if ( charstring == "6" ) return 0x36; if ( charstring == "7" ) return 0x37;
        if ( charstring == "8" ) return 0x38; if ( charstring == "9" ) return 0x39;
        if ( charstring == "." ) return 0x2e;
        return 0x20;
    }

Validation

  • Préférer la commande "ip a" à "ifconfig" pour une lecture exacte des paramètres IP virtuelles.
  • Vérifier la configuration IP de chaque membre du cluster, chaque membre du cluster doit avoir 2 IPs (une physique et une virtuelle).
  • Sur le serveur maître, arrêter le service keepalived (/etc/init.d/keepalived stop), le serveur esclave doit récupérer l'IP virtuelle du maître.
  • Redémarrer le service keepalive sur le serveur maître (/etc.init.d/keepalived start), le serveur maître doit récupérer son IP virtuelle et l'esclave ne doit pas la conserver.
ATTENTION !
Lors d'une mise à jour Olfeo, toujours commencer par la machine maître.
Avez-vous trouvé cet article utile ?
Revenir à la liste des articles
En visitant ce site, vous acceptez l'utilisation de cookies. Nous utilisons des cookies pour améliorer votre navigation sur notre site. En savoir plus.Ok