OdpornoÅÄ na bÅÄdy bizantyjskie w systemach peer-to-peer - Instytut ...
OdpornoÅÄ na bÅÄdy bizantyjskie w systemach peer-to-peer - Instytut ...
OdpornoÅÄ na bÅÄdy bizantyjskie w systemach peer-to-peer - Instytut ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
26 Rozdział 2. Architektury systemów <strong>peer</strong>-<strong>to</strong>-<strong>peer</strong><br />
funkcją, jest funkcja replik f r : N → N, której działanie sprowadza się do wyz<strong>na</strong>czenia<br />
kilku identyfika<strong>to</strong>rów węzłów odpowiedzialnych za obiekt o danym<br />
identyfika<strong>to</strong>rze tzw. replica keys. Funkcja mapująca musi być deterministycz<strong>na</strong><br />
i wyz<strong>na</strong>czać jeden konkretny adres, <strong>na</strong><strong>to</strong>miast funkcja replik niekoniecznie. W<br />
praktyce jed<strong>na</strong>k rzadko s<strong>to</strong>suje się funkcje mapującą i funkcję replik, chociaż<br />
ich użycie poprawiałoby wydajność zapytań o konkretne obiekty.<br />
Każdemu zestawowi danych (obiektów) możemy przypisać identyfika<strong>to</strong>r id,<br />
<strong>na</strong>jlepiej z tej samej przestrzeni, z której pochodzą identyfika<strong>to</strong>ry węzłów w<br />
sieci, który dalej będziemy <strong>na</strong>zywali kluczem. Klucz skojarzony jest ze zbiorem<br />
atrybutów, który go określa (np. dla pliku mogą <strong>to</strong> być poszczególne słowa<br />
występujące w <strong>na</strong>zwie). Każdemu atrybu<strong>to</strong>wi również możemy przypisać unikalny<br />
identyfika<strong>to</strong>r, gdyż atrybut również jest pewnym zestawem danych. Gdy<br />
użytkownik wprowadza dane do systemu wykonuje operację:<br />
put(lista atrybutów, dane)<br />
W tym momencie dane zostały zapamiętane w systemie wraz z określoną<br />
listą atrybutów. W rzeczywistym systemie odbywa się <strong>to</strong> tak, że dla każdego<br />
atrybutu wyliczany jest jego identyfika<strong>to</strong>r i węzeł o <strong>na</strong>jbliższym identyfika<strong>to</strong>rze<br />
do identyfika<strong>to</strong>ra atrybutu zapamiętuje parę < a(i) id ,id >, <strong>na</strong><strong>to</strong>miast węzły<br />
których identyfika<strong>to</strong>ry są <strong>na</strong>jbliższe do id zapamiętują parę .<br />
Użytkownik poszukujący danych podaje bezpośrednio id (sytuacja rzadka),<br />
lub listę atrybutów (sytuacja, częsta), otrzymuje w ten w odpowiedzi listę adresów<br />
dojść do danych odpowiadającą liście atrybutów, lub bezpośrednio dane<br />
wskazane poprzez id. Operacja, która wykonuje zapytanie wygląda <strong>na</strong>stępująco:<br />
lista danych = get(lista atrybutów)<br />
W przypadku, gdy lista atrybutów, jest ograniczo<strong>na</strong> do jednej unikalnej war<strong>to</strong>ści,<br />
<strong>to</strong> otrzymamy prostą tablicę adresowań. W innej sytuacji, gdy przyporządkowanie<br />
jest typu jeden-do-wielu, czyli jeden klucz, dla kilku obiektów,<br />
<strong>to</strong> usługa działa, jak tablica z kodowaniem mieszającym (ang. hashing table).<br />
Do poprawnego działania pokazanego schematu wystarczy, aby klucz obiektu<br />
był generowany jako wynik działania bezkolizyjnej funkcji skrótu <strong>na</strong> danych i<br />
atrybutach.<br />
Wymienione uprzednio podstawowe usługi realizowane <strong>na</strong> warstwie <strong>peer</strong>-<strong>to</strong><strong>peer</strong><br />
prowadzą do ogólnej postaci interfejsu programistycznego zaproponowanego<br />
w [DZDS03].<br />
DHT DOLR CAST<br />
put(key, data) publish(objectId) join(groupId)<br />
remove(key) unpublish(objectId) leave(groupId)<br />
data = get(key) sendToObj(msg, objectId, n) multicast(msg, groupId)<br />
anycast(msg, groupId)