bitobi-arch
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bitobi-arch] [archi] Efficacité du rézal par l'architecture


From: Olivier Lourdais
Subject: [Bitobi-arch] [archi] Efficacité du rézal par l'architecture
Date: Mon, 13 Jan 2003 13:57:31 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020826

Principe : que chaque noeud est un comportement "améliorant" (civique) pour l'état du réseau (diminution de la latence globale, répartition correcte de la latence, ...)

Les algos entrant en jeu n'ont imho pas vocation à être normalisés (plusieurs algos peuvent coexister, et leur non-utilisation n'empêche pas le réseau de fonctionner) (on peut toutefois donner des exemples d'algo à titre indicatif), et ça n'entre de toutes façons pas dans le cadre de cette ml. Toutefois, pour permettre à un noeud de se connecter à tel noeud plutôt qu'à tel autre, il faut lui fournir des informations sur l'état du réseau, et bien sûr il faut évaluer l'état du réseau.

Le premier extrait de mail (un peu dépoussiéré) :
-----
bon, je propose que chaque noeud connaisse en permanence l'état (approximatif) du réseau, modélisé par un graphe
à chaque noeud pourrait être associé ces infos :
- infos d'authentification (clé gpg + autres infos ?)
- nombre de connexions max à d'autes noeuds
- nombre de requêtes/sec pour les n dernières minutes (+ éventuellement le nombres d'utilisateurs différents, reconnus par leur cookies (voire la liste des users)) (+ éventuellement le nombre max de req/sec (et d'utilsateurs ?) acceptées (limite "souple" vu que c'est difficile à bloquer sans faire chier le peuple))
et pour chaque arc :
- sa latence [question pour les experts en résal : y'a t'il un moyen d'avoir une estimation fiable (en tenant compte de la synchronisation d'heure entre tous les noeuds) de la latence entre les noeuds A et B ? on peut avoir facilement (latence(A, B) + latence(B, A)), mais est il possile de connaître latence(A, B) ET latence(B, A) par un moyen qualconque ? et sinon est-il acceptable d'approximer (latence(A, B) ~= latence(B, A) ~= ((latence(A, B) + latence(B, A)) / 2)) dans le cas général ? (grosso modo, j'entends par latence "temps de la propagation d'un message", ou toute valeure proportionnelle au temps de la propagation d'un message) ]

pour maintenir tout çà, il faut penser à diffuser des messages "de service" :
- ajout d'une connexion (A: le noeud B vient de se connecter à moi)
- suppression d'une connexion (A: je viens de perdre le contac avec le noeud B) - mise à jour de la latence (plus éventuellement des messages pour estimer la latence, mais je pense qui çà se ferait plutôt à un plus bas niveau)
- mise à jour des infos associées à un noeud

quand un noeud veut rejoindre le réseau (je zappe des étapes qui ont déjà été énumérées) : 1. il demande à un noeud (noeud fixe, de référence ?) l'état du réseau (le graphe) 2. il applique sur ce graphe un algo basé sur Warshall-Floyd* pour déterminer le diamètre du réseau (le nombre max d'arcs entre deux noeuds, mais ici plutôt la latence max entre deux noeuds) 3. il se connecte aux deux noeuds qu'il a établi être les extrémités du diamètre du réseau
remarques :
- un comportement de ce type a imho tendance à améliorer l'état du réseau (vu que çà ajoute un lien potentiellement plus rapide entre les deux noeuds les plus éloignés du réseau) - l'algo peut prendre d'autres éléments en compte (info sur les noeuds) pour choisir les noeuds - l'algo est donné à titre indicatif, pas normatif (çà fait pas partie du protocole et çà n'est pas gênant que tous les noeuds n'utilisent pas le même algo)
- le noeud peut se choisir plus de 2 voisins
- on peut aussi envisager qu'un noeud déjà relié au réseau lance régulièrement un algo de ce genre pour voir s'il est possible d'améliorer le réseau - quand est noeud se déconnecte, ses anciens voisins vont éventuellement établir de nouvelles liaisons (selon leur nb de liaison min) pour améliorer le réseau et leur place dans le réseau

* un tel algo prend en entrée un graphe G qui contient les connexions entre les noeuds (voisins) et leur latence, et rend un graphe G' qui contient les connexions virtuelles entre chaque noeud (pas forcément physiquement voisin) et leur latence (calculée en cumulant les latences des connexions physiques utilisées) : si G contient les noeuds A, B et C, avec des connexions physiques A->B (latence=25) et B->C (latence=17), alors le graphe G' contiendra les connexions de G + la connexion A->C (latence=42) (s'il y a deux chemins dans G pour aller de A à C, on choisit celui qui a la latence la plus faible)
-----

un autre :
-----

à la louche, je
dirais : demandons-nous d'abord si il est nécessaire d'avoir une
connaissance plus complexe du bitobi que 'tel noeud est up, tel noeud
est down'. Si oui, alors faut trouver un bon algo, et là je vous laisse
oeuvrer ;)


Si on veut assurer le meilleur fonctionnement possible (minimiser le temps de propagation d'un message, ne pas concentrer la charge sur quelques noeuds, ...), il faut fournir à tout noeud qui veut se connecter les informations nécessaires, et donc connaître en permanence l'état approximatif (mais néanmoins détaillé) du réseau (ce qui peut aussi amener des noeuds à modifier leurs connexions) Et je pense qu'on peut y inclure un max d'infos dès le début (tant que çà coûte pas trop cher), étant donné que les algos qui utiliseront ces donnés seront non normatifs et à la discretion des implémentations (de noeud et de mouling agent).
-----

puis :
-----

Ouais.. Du coup effectivement, une connaissance de l'état du réseau plus
précise que up, down risque d'être nécessaire.. va falloir une
représentation ad-hoc du réseau, alors..


sur chaque noeud çà peut se modéliser par un graphe valué, qui peut se sérialiser facilement en xml (ensemble de sommets + enemble d'arcs) pour le transmettre à un noeud qui vient de se connecter pour les messages de services qui feront évolué le graphe de chaque noeud, on peut avoir des messages du genre :
- A: je viens de me connecter à B
- A: je vais me déconnecter
- A: je viens de perdre ma connexion avec B sans qu'il annonce sa déconnexion (chaque noeud regarde si B a encore une connexion active avec un autre noeud, si çà n'est pas le cas, B est considéré comme down) - A: je viens d'évaluer ma connexion avec B, la latence est actuellement de x ms - A: voici mes stats de charge : x req/sec depuis les coincoins traditionnels, avec n utilisateurs authentifiés distincts ces 10 dernières minutes, ... - A: voici les quotas que j'aimerais bien respecter vis à vis de la charge : x req/sec max, ...
-----


Pour évaluer la latence de A vers B, vous pensez qu'il suffit d'un échange du style :
A->B : <test-latence heure-envoi="01/02/2003-42:42:42.123"/>
B->A : <réponse-test-latence heure-envoi="01/02/2003-42:42:42.123" heure-réception="01/02/2003-42:42:45.456"/>
?
En gros, est-ce que la synchro entre chaque noeud suffit à avoir des mesures fiables avec ce protocole ?
reply via email to

[Prev in Thread] Current Thread [Next in Thread]