KB 2444 : HAUTE DISPONIBILITÉ AVEC LES SERVEURS OLFEO
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. Sur la machine maître, à la page Ajouter un esclave :
, cliquez surL’écran Machine esclave apparaît. Ajouter l’adresse IP de la future machine esclave :
Sur la machine esclave, renseigner l’ID fourni par la machine maître ainsi que l’IP du maître pour pouvoir joindre le domaine Olfeo, puis valider :
Une page de patience va alors indiquer que la jonction au domaine est en cours :
Connectez-vous en utilisant un compte administrateur de la machine maître : seuls les menus propres à la configuration locale de la machine apparaissent. L’interface graphique indique désormais que le serveur est en mode esclave :
Rafraîchissez la page Domaine Olfeo dans la machine maître : l’État de l’esclave passe à En ligne
2. La deuxième étape est de créer un cluster afin que chaque membre dispose d’une IP virtuelle, Cliquez sur le lien Ajouter un cluster :
Saisissez un chiffre entre 1 et 254 dans le champ Premier ID VRRP. Le premier identifiant VRRP est un identifiant à utiliser pour la gestion des noeuds.
Pour chaque machine ajoutée précédemment dans le cluster Olfeo saisissez une adresses IP virtuelle dans la colonne IP virtuelle.
Répartition de charge par proxy.pac
Il est possible d’effectuer de la répartition de charge entre les différents nœuds 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.
Lors d’une mise à jour Olfeo, toujours commencer par la machine maître