Владимир Озеров
GridGain
Масштабируемость в
распределенных in-memory системах
Кто?
2
3
4
Спасибо за внимание!
План
5
• Алгоритмы шардирования
План
6
• Алгоритмы шардирования
• Data co-location
План
7
• Алгоритмы шардирования
• Data co-location
• Синхронизация в кластере
План
8
• Алгоритмы шардирования
• Data co-location
• Синхронизация в кластере
• Локальная архитектура многопоточности
План
9
• Алгоритмы шардирования
• Data co-location
• Синхронизация в кластере
• Локальная архитектура многопоточности
Куда?
10
Affinity
11
partition => node
Affinity
12
Affinity
13
key => partition => node
Affinity
14
Naïve affinity
15
Naïve affinity
16
Naïve affinity
17
Naïve affinity
18
Naïve affinity
19
Naïve affinity
20
Naïve affinity
21
node = f(partition, nodes.size(), ...)
Rendezvous affinity
22
• Consistent hashing [1]
• Rendezvous hashing (HRW) [2]
[1] https://en.wikipedia.org/wiki/Consistent_hashing
[2] https://en.wikipedia.org/wiki/Rendezvous_hashing
Rendezvous affinity
23
WEIGHT(partition, node)
Rendezvous affinity
24
Rendezvous affinity
25
Rendezvous affinity
26
Rendezvous affinity
27
Rendezvous affinity
28
Rendezvous affinity
29
План
30
• Алгоритмы шардирования
• Data co-location
• Shared-nothing архитектура
• Синхронизация в кластере
Без co-location: транзакции
31
1: class Customer {
2: long id;
3: City city;
4: }
Без co-location: транзакции
32
Без co-location: транзакции
33
2 (2 узла)
Без co-location: транзакции
34
2 (2 узла)
2 (primary + backup)
Без co-location: транзакции
35
2 (2 узла)
2 (primary + backup)
2 (two-phase commit)
Без co-location: транзакции
36
2 (2 узла)
2 (primary + backup)
2 (two-phase commit)
2 (request-response)
Без co-location: транзакции
37
2 (2 узла)
2 (primary + backup)
2 (two-phase commit)
2 (request-response)
--
16 сообщений
Провод
38
Co-location: транзакции
39
1: class Customer {
2: long id;
3:
4: @AffinityKeyMapped
5: City city;
6: }
Co-location: транзакции
40
Co-location: транзакции
41
1 (1 узел)
Co-location: транзакции
42
1 (1 узел)
2 (primary + backup)
Co-location: транзакции
43
1 (1 узел)
2 (primary + backup)
1 (one-phase commit)
Co-location: транзакции
44
1 (1 узел)
2 (primary + backup)
1 (one-phase commit)
2 (request-response)
Co-location: транзакции
45
1 (1 узел)
2 (primary + backup)
1 (one-phase commit)
2 (request-response)
--
4 сообщения
Запустим SQL
46
Без co-location: full scan
47
Без co-location: full scan
48
Без co-location: full scan
49
• 1/3x latency!
Без co-location: full scan
50
• 1/3x latency!
• 3x capacity!
Индексы
51
А с индексами же еще круче
будет?
Индексы
52
1 node
Индексы
53
1 node N nodes
Посчитаем сложность
54
log 1_000_000 ≈ 20
Посчитаем сложность
55
log 1_000_000 ≈ 20
vs
log 333_333 ≈ 18
log 333_333 ≈ 18
log 333_333 ≈ 18
Посчитаем сложность
56
log 𝑁 < 𝑀 ∗ log
𝑁
𝑀
Без co-location: index seek
57
Без co-location: index seek
58
• такой же latency?
• такой же capacity?
Co-location: index seek
59
Co-location: index seek
60
Co-location: index seek
61
• такой же latency?
• но 3x capacity!
Дисбаланс
62
PARTITIONED cache
63
PARTITIONED cache
64
REPLICATED cache
65
План
66
• Алгоритмы шардирования
• Data co-location
• Синхронизация в кластере
• Локальная архитектура многопоточности
Счетчик: локально
67
1: AtomicLong ctr;
2:
3: long getNext() {
4: return ctr.incrementAndGet();
5: }
Счетчик: локально, велосипедно
68
1: AtomicLong ctr;
2: ThreadLocal<Long> localCtr;
3:
4: long getNext() {
5: long res = localCtr.get();
6:
7: if (res % 1000 == 0)
8: res = ctr.getAndAdd(1000);
9:
10: localCtr.set(++res);
11:
12: return res;
13: }
69
Провод
70
Счетчик: в кластере
71
• Локально: миллионы
• Распределенно: тысячи
Разумные требования: счетчик
72
Уникальный, монотонно возрастающий, 8 байт!
Разумные требования: счетчик
73
Уникальный, монотонно возрастающий, 8 байт!
Разумные требования: счетчик
74
Уникальный, монотонно возрастающий, 8 байт!
Разумные требования: счетчик
75
Уникальный, монотонно возрастающий, 8 байт!
76
Разумные требования: IGFS
77
Разумные требования: IGFS
78
Разумные требования: IGFS
79
Разумные требования: IGFS
80
Разумные требования: IGFS
81
Разумные требования: IGFS
82
Разумные требования: IGFS
83
Разумные требования: IGFS
84
Разумные требования: IGFS
85
Данные к коду
86
Данные к коду
87
1: Account acc = cache.get(accKey);
3:
3: acc.add(100);
4:
5: cache.put(accKey, acc);
Данные к коду
88
1: Account acc = cache.get(accKey);
3:
3: acc.add(100);
4:
5: cache.put(accKey, acc);
Код к данным
89
Данные к коду
90
1: cache.invoke(accKey, (entry) -> {
1: Account acc = entry.getValue();
3:
3: acc.add(100);
4:
5: entry.setValue(acc);
6: });
Данные к коду: а если баг?
91
Код к данным: а если баг?
92
Код к данным: а если баг?
93
План
94
• Алгоритмы шардирования
• Data co-location
• Синхронизация в кластере
• Локальная архитектура многопоточности
Локальное распределение задач
95
Локальное распределение задач
96
Локальное распределение задач
97
Локальное распределение задач
98
99
Thread-per-partition
100
Thread-per-partition
101
Thread-per-partition
102
Thread-per-partition
103
Итого
104
• Шардинг: баланс и стабильность
Итого
105
• Шардинг: баланс и стабильность
• Co-location: баланс vs эффективность
Итого
106
• Шардинг: баланс и стабильность
• Co-location: баланс vs эффективность
• Модель данных должна быть адаптирована
Итого
107
• Шардинг: баланс и стабильность
• Co-location: баланс vs эффективность
• Модель данных должна быть адаптирована
• Координация – аккуратно
Итого
108
• Шардинг: баланс и стабильность
• Co-location: баланс vs эффективность
• Модель данных должна быть адаптирована
• Координация – аккуратно
• Thread-per-partition – ускоряет простые сценарии,
может замедлить сложные
Контакты
109
@devozerov
http://ignite.apache.org
dev@ignite.apache.org
user@ignite.apache.org
110
Вопросы?

Масштабируемость в распределенных in-memory системах