A propos | Laboratoire | Voisinage | Meilleurs articles | Nous aider

Panoramisk / Le druide de la VoIP 

Redondance Asterisk, une solution simple

Dès lors que l’on met en place un serveur Asterisk au sein d’un réseau de téléphonie, on se pose automatiquement la question de la redondance de celui-ci. Cet article propose un système très simple permettant d’aborder la redondance à l’aide de deux serveurs Asterisk montés en partage de charge.

Contexte

Contrairement à un matériel industriel, sans élément mobile, nos serveurs sont dotés de pièces en mouvement qui sont souvent fragiles comme les ventilateurs d’alimentation et de processeur ou les disques durs. Comment assurer qu’une telle machine, supportant du trafic de téléphonie qui peut être critique ou tout du moins important pour l’organisation, puisse être secourue rapidement ?

On peut imaginer de monter un serveur de secours, copie conforme de celui de production avec une procédure de bascule automatique ou manuelle, je vous propose ici de mettre en place deux serveurs actifs. Les téléphones seront répartis sur ces deux serveurs et l’on mettra en place un moyen d’assurer la continuité des appels. La problématique des appels vers l’extérieur n’est pas traitée ici, elle peut dépendre d’interface physique ou d’abonnement SIP qui nécessite de s’y pencher sérieusement, mais ne remet pas en cause la solution proposée ici.

Principe de fonctionnement

Cluster Asterisk

Chacun des deux serveurs Asterisk1 est capable de traiter l’appel en local ou si ceci échoue de l’acheminer vers son binôme. Ce principe permet donc de laisser les postes IP s’enregistrer sur le serveur de leur choix, on utilisera avantageusement la fonction d’enregistrement via le SRV DNS si cette fonction est disponible sur le téléphone. Il faut en revanche prévoir un système qui empêche un appel de tourner entre les noeuds du cluster sans fin, une simple variable sera utilisée ici.

Détail des configurations

Les deux serveurs Asterisk sont configurés comme indiqué ci-dessous (extensions.conf):

Noeud 1
; ---------Start: [cluster-local] ----------------
[cluster-local]
exten => _[12]X,1,Verbose(${FROM_CLUSTER})
exten => _[12]X,2,Dial(SIP/${EXTEN},20,rt)
exten => _[12]X,3,GotoIf($["${FROM_CLUSTER}" == "1"]?_[12]X,6)
exten => _[12]X,4,Set(CALLERID(num)=9999${CALLERID(num)})
exten => _[12]X,5,Dial(SIP/cluster-node2/${EXTEN},20,rt)
;
exten => _[12]X,6,Congestion()
; ---------End: [cluster-local] ------------------

; ---------Start: [cluster-from-remote] ----------------
[cluster-from-remote]
exten => _.,1,Set(_FROM_CLUSTER=1)
exten => _.,2,Set(CALLERID(num)=${CALLERID(num):4})
exten => _.,3,Goto(cluster-local,${EXTEN},1)
; ---------End: [cluster-from-remote] ------------------

Noeud 2
; ---------Start: [cluster-local] ----------------
[cluster-local]
exten => _[12]X,1,Verbose(${FROM_CLUSTER})
exten => _[12]X,2,Dial(SIP/${EXTEN},20,rt)
exten => _[12]X,3,GotoIf($["${FROM_CLUSTER}" == "1"]?_[12]X,6)
exten => _[12]X,4,Set(CALLERID(num)=9999${CALLERID(num)})
exten => _[12]X,5,Dial(SIP/cluster-node1/${EXTEN},20,rt)
;
exten => _[12]X,6,Congestion()
; ---------End: [cluster-local] ------------------

; ---------Start: [cluster-from-remote] ----------------
[cluster-from-remote]
exten => _.,1,Set(_FROM_CLUSTER=1)
exten => _.,2,Set(CALLERID(num)=${CALLERID(num):4})
exten => _.,3,Goto(cluster-local,${EXTEN},1)
; ---------End: [cluster-from-remote] ------------------

Les points importants à noter dans cette solution sont:

  • les appels des postes SIP (ou IAX) locaux arrivent dans le contexte cluster-local, ici on ne gère que les appels locaux, il faudrait traiter en particulier les appels vers des opérateurs, la messagerie vocale, etc…
  • les appels depuis l’autre noeud du cluster arrivent dans le contexte cluster-from-remote
  • la variable FROM_CLUSTER permet d’éviter une boucle, on la lève sur un appel qui vient de l’autre noeud du cluster afin de ne pas lui renvoyer. Si on avait plus de 2 noeuds on utiliserait plutôt un compteur, mais la valeur devrait suivre l’appel, avec un préfixe par exemple.
  • on change le numéro de l’appelant afin que la sélection du profile SIP ne soit pas basé sur celui-ci mais arrive bien dans le trunk SIP. Ici on utilise 9999 comme préfixe et on le supprime ensuite.

Conclusion

Voici une solution simple et efficace pour avoir plusieurs Asterisk en ligne. J’ai appelé cette solution “cluster”, c’est très exagéré, mais nous verrons dans d’autres articles comment s’approcher d’un vrai cluster.


  1. ce principe pourrait être étendu à plus si besoin []
Posté par: Alexandre Chauvin-Hameau, le 24/06/2007
Trackback | Popularité: 24%
marqué , , , , , et
AddThis Social Bookmark Button
UselessNothing newInformativeLearned a lotAmazingly helpful (3 votes, average: 3.33 out of 5)
Loading ... Loading ...

Voir aussi

Et pourquoi pas

4 Réponses à “Redondance Asterisk, une solution simple”

  1. SyLviO à dit:

    Bonjour,

    est- possible de mettre en oeuvre cette redondance avec Asterisk 1.2 ?

    Merci

  2. Alexandre Chauvin-Hameau à dit:

    Bonjour,

    Etant basée uniquement sur un fonctionnement de SIP et la gestion du plan d’appel d’Asterisk, il n’y a pas de raison que cela ne soit pas possible avec une release 1.2

    Néanmoins, cette version 1.2 est bientôt arrêtée, c’est peut-être l’occasion de faire la migration.

    Cordialement, Alex.

  3. DEMIL à dit:

    Bonjour,

    Vous avez dit que les postes SIP ont le choix entre les deux serveurs Asterisk ! comment gerer la distribution en charge (routage) des requetes vers l’un des deux serveurs?

  4. Alexandre Chauvin-Hameau à dit:

    Chaque téléphone SIP est à un instant donné enregistré sur l’un des noeuds, via la requête DNS. Une fois sur ce noeud, il ne change pas, sauf si ce noeud vient à ne plus répondre, auquel cas il tentera de joindre un autre noeud du cluster (suivant dans la liste DNS).

    Le partage de charge se fait donc pas enregistrement et non pas par appel. On pourrait se retrouver dans une configuration où tous les téléphones enregistrés sur le même noeud sont en ligne alors que tous les postes enregistrés sur l’autre noeud sont libre, ce qui ne répond pas à une problématique de partage de charge.

    L’objectif de la solution présentée ici est la redondance, pas le partage de charge qui est une notion un peu plus complexe à gérer, notamment en SIP.

Laisser un commentaire

© 2010 Panoramisk | Creative Commons License wordpress logo