SCRIBE
A Large-Scale and Decentralised Application-Level Multicast Infrastructure
João Nogueira Tecnologias de Middleware DI - FCUL - 2006
1
SCRIBE A Large-Scale and Decentralised Application-Level Multicast - - PowerPoint PPT Presentation
SCRIBE A Large-Scale and Decentralised Application-Level Multicast Infrastructure Joo Nogueira Tecnologias de Middleware DI - FCUL - 2006 1 Agenda Motivation Pastry Scribe Scribe Protocol Experimental Evaluation
1
2
3
4
5
6
7
x 1 x 2 x 3 x 4 x 5 x 7 x 8 x 9 x a x b x c x d x e x f x 6 x 6 1 x 6 2 x 6 3 x 6 4 x 6 6 x 6 7 x 6 8 x 6 9 x 6 a x 6 b x 6 c x 6 d x 6 e x 6 f x 6 5 x 6 5 1 x 6 5 2 x 6 5 3 x 6 5 4 x 6 5 5 x 6 5 6 x 6 5 7 x 6 5 8 x 6 5 9 x 6 5 b x 6 5 c x 6 5 d x 6 5 e x 6 5 f x 6 5 a x 6 5 a 2 x 6 5 a 3 x 6 5 a 4 x 6 5 a 5 x 6 5 a 6 x 6 5 a 7 x 6 5 a 8 x 6 5 a 9 x 6 5 a a x 6 5 a b x 6 5 a c x 6 5 a d x 6 5 a e x 6 5 a f x d46a1c Route(d46a1c) d462ba d4213f d13da3 65a1fc d467c4 d471f1 O 2128 - 1
8
9
10
11
12
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null; // Stop routing the original message
13
(1) deliver( msg, key ) (2) switch( msg.type ) (3) CREATE: groups = groups U msg.group; (4) JOIN: groups[msg.group].children U msg.source; (5) MULTICAST: V node in groups[msg.group].children (6) send( msg, node ); (7) if memberOf( msg.group ) (8) invokeMessageHandler( msg.group, msg ); (9) LEAVE: groups[msg.group].children / msg.source; (10) if ( |groups[msg.group].children| == 0 ) (11) send( msg, groups[msg.group].parent );
14
15
16
0111
16
0111
groupID = 1100 route( CREATE, groupID );
16
0111
groupID = 1100 route( CREATE, groupID );
1100
16
0111
(1) deliver( msg, key ) (2) switch( msg.type ) (3) CREATE: groups = groups U msg.group; (...)
1100 1100
16
0111
(1) deliver( msg, key ) (2) switch( msg.type ) (3) CREATE: groups = groups U msg.group; (...)
1100 1100
Groups: > 1100
16
0111 1100 1100 1100
16
17
0111
18
0111
route( JOIN, groupID );
18
0111 1001
route( JOIN, groupID );
18
0111 JOIN, 1100 1001
route( JOIN, groupID );
18
0111
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null;
1001 1001
18
0111
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null;
1001 1001
18
0111
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null;
Groups: > 1100
1001 1001
18
0111
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null;
JOIN, 1100
Groups: > 1100
1101 1001 1001
18
0111
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null;
1101 1001 1001
18
0111
group[1100].children: > 0111
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null;
1101 1001 1001
18
0111 1101 1001 1001 1001
18
0111 1101 1101 1101 1001 1001 1001 1100
18
1100 1101 1001 0111
19
1100 1101 1001 0111
(1) deliver( msg, key ) (2) switch( msg.type ) (...) (4) JOIN: groups[msg.group].children U msg.group;
1100
19
1100 1101 1001 0111
(1) deliver( msg, key ) (2) switch( msg.type ) (...) (4) JOIN: groups[msg.group].children U msg.group; group[1100].children: > 1101
1100
19
1100 1101 1001 0111 1100 1100
19
1100 1101 1001 0111 1100 1100
19
1101 1001 0111 1100
20
1101 1001 0111 1100 0100
route( JOIN, groupID );
20
1101 1001 0111 1100 0100 JOIN, 1100
route( JOIN, groupID );
20
1101 1001 0111 1100 0100
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null;
1001
20
1101 1001 0111 1100 0100
(1) forward( msg, key, nextID ) (2) switch( msg.type ) (3) JOIN: if !(msg.group C groups) (4) groups = groups U msg.group; (5) route( msg, msg.group ); (6) groups[msg.group].children U msg.source; (7) nextID = null;
group[1100].children: > 0111 > 0100
1001
20
1101 1001 0111 1100 0100
20
1101 1001 0111 1100 0100
21
1101 1001 0111 1100 0100
send( LEAVE, parent );
21
1101 1001 0111 1100 0100
send( LEAVE, parent );
LEAVE, 1100
21
1101 1001 0111 1100 0100
(1) deliver( msg, key ) (2) switch( msg.type ) (...) (9) LEAVE: groups[msg.group].children / msg.source; (10) if ( |groups[msg.group].children| == 0 ) (11) send( msg, groups[msg.group].parent );
1001
21
1101 1001 0111 1100 0100
(1) deliver( msg, key ) (2) switch( msg.type ) (...) (9) LEAVE: groups[msg.group].children / msg.source; (10) if ( |groups[msg.group].children| == 0 ) (11) send( msg, groups[msg.group].parent );
group[1100].children: > 0111 > 0100
1001
21
1101 1001 0111 1100 0100
(1) deliver( msg, key ) (2) switch( msg.type ) (...) (9) LEAVE: groups[msg.group].children / msg.source; (10) if ( |groups[msg.group].children| == 0 ) (11) send( msg, groups[msg.group].parent );
1001
group[1100].children: > 0111
21
1101 1001 0111 1100
21
1101 1001 0111 1100
send( LEAVE, parent );
21
1101 1001 0111 1100
send( LEAVE, parent );
LEAVE, 1100
21
1101 1001 1100
21
1101 1100
21
1100
21
22
1101 0111 1100 0100 1001
23
1101 0111 1100 0100 1001
23
1101 0111 1100 0100 1001
send( MULTICAST, rendezVous );
23
1101 0111 1100 0100 1001
send( MULTICAST, rendezVous );
23
1101 0111 1100 0100 1001 1100
23
Access Control
1101 0111 1100 0100 1001 1100
23
1101 0111 1100 0100 1001 1100
23
1101 0111 1100 0100 1001 1101
23
1101 0111 1100 0100 1001 1001
23
1101 0111 1100 0100 1001
23
24
25
1100 0111 0100 1001 1101
26
1100 0111 0100 1001 1101
1101
26
1100 0111 0100 1001 1101
1101
26
1100 0111 0100 1001 1101
1101
route( JOIN, groupID );
26
1100 0111 0100 1001 1101
1101 1111
route( JOIN, groupID );
26
1100 0111 0100 1001 1101
1101 1111 J O I N , 1 1
26
1100 0111 0100 1001 1101
1101 1111 1111
26
1100 0111 0100 1001 1101
1101 1111 1111 JOIN, 1100
26
1100 0111 0100 1001 1101
1101 1111 1111
26
1100 0111 0100 1001 1101
1101 1111 1111
26
27
28
29
30
31
32
32
32
32
1 10 100 1000 10000 100000 150 300 450 600 750 900 1050 1200 1350 1500 Group Rank Group Size
33
300 600 900 1200 1500 1 2 3 4 5 Delay Penalty Cumulative Groups RMD RAD
34
5000 10000 15000 20000 25000 5 10 15 20 25 30 35 40 Number of Children Tables Number of Nodes 5000 10000 15000 20000 100 200 300 400 500 600 700 800 900 1000 1100 Total Number of Children Table Entries Number of Nodes 5 10 15 20 25 30 35 40 45 50 55 50 200 350 500 650 800 950 1100 Total Number of Children Table Entries Number of Nodes
35
5000 10000 15000 20000 25000 30000 1 10 100 1000 10000 Link Stress Number of Links Scribe IP Multicast
Maximum
36
37
38
39
39
39
39
BR, <grpID, children_table, latencies>
39
39
JOIN, grpID
39
39
39
5000 10000 15000 20000 10 20 30 40 50 60 70 Total Number of Children Table Entries Number of Nodes
40
41
5000 10000 15000 20000 25000 30000 35000 1 10 100 1000 10000 100000 Link Stress Number of Links
scribe collapse scribe ip mcast naïve unicast
2000 4000 6000 8000 10000 12000 14000 16000 18000 50 100 150 200 250 300 Number of Children Tables Number of Nodes scribe scribe collapse 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 50 100 150 200 250 300 350 400 Total Number of Children Table Entries Number of Nodes scribe scribe collapse
42
43