10.03.2015 Views

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 ...

SHOW MORE
SHOW LESS

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)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!