Apache Kafka

1.

А вы Кафку
пробовали?
Apache Kafka – распределённый брокер сообщений
Григорий Кошелев
СКБ Контур
CodeFest, Новосибирск, 2019
1

2.

План
1.
2.
3.
4.
5.
Зачем нам Apache Kafka
Введение в Кафку
Архитектура
Неочевидности
Выводы
2

3.

Зачем нам Apache Kafka
3

4.

Зачем нам Apache Kafka
- Vostok Hercules
https://github.com/vostok
4

5.

Зачем нам Apache Kafka
- Vostok Hercules
- Логи
https://github.com/vostok
5

6.

Зачем нам Apache Kafka
- Vostok Hercules
- Логи
- Метрики
https://github.com/vostok
6

7.

Зачем нам Apache Kafka
- Vostok Hercules
- Логи
- Метрики
- Трассировки
https://github.com/vostok
7

8.

Зачем нам Apache Kafka
- Vostok Hercules
-
Логи
Метрики
Трассировки
Бизнес-события
https://github.com/vostok
8

9.

Зачем нам Apache Kafka
- Vostok Hercules
- Search & Recommendation Systems (SRS)
9

10.

Зачем нам Apache Kafka
- Vostok Hercules [Kafka 2.0+]
- Search & Recommendation Systems (SRS)
10

11.

Зачем нам Apache Kafka
-Vostok Hercules [Kafka 2.0+]
-Search & Recommendation Systems (SRS) [Kafka
0.11.x]
11

12.

Блиц-опрос
12

13.

Блиц-опрос
Кто использует Apache Kafka?
13

14.

Блиц-опрос
Кто использует Apache Kafka?
Версия…
< 0.11?
14

15.

Блиц-опрос
Кто использует Apache Kafka?
Версия…
< 0.11?
0.11.x?
15

16.

Блиц-опрос
Кто использует Apache Kafka?
Версия…
< 0.11?
0.11.x?
1.x.x?
16

17.

Блиц-опрос
Кто использует Apache Kafka?
Версия…
< 0.11?
0.11.x?
1.x.x?
2.x.x?
17

18.

Введение в Apache Kafka
18

19.

Введение в Apache Kafka
Kafka Producer
Producer
19

20.

Введение в Apache Kafka
Kafka Consumer
Producer
Consumer
20

21.

Введение в Apache Kafka
Kafka Cluster
Producer
Cluster
Consumer
21

22.

Введение в Apache Kafka
Kafka Broker
Producer
Cluster
Broker
Consumer
22

23.

Введение в Apache Kafka
Cluster
Producer
Broker
Consumer
23

24.

Введение в Apache Kafka
Kafka Topic
Producer
Cluster
Topic
Broker
Consumer
24

25.

Введение в Apache Kafka
Pub-Sub с poll-механикой чтения
Cluster
Producer
Topic
Broker
Consumer
25

26.

Архитектура Apache Kafka
-
Topic
Broker
Producer
Consumer
26

27.

Архитектура Kafka Topic
topic = {partition}
partition 0
0 1 2 3 4 5
partition 1
0 1 2 3 4 5 6 7
partition 2
0 1 2 3 4 5 6
27

28.

Архитектура Kafka Topic
topic = {partition}
partition 0
0 1 2 3 4 5 6
partition 1
0 1 2 3 4 5 6 7
partition 2
0 1 2 3 4 5 6
28

29.

Архитектура Kafka Topic
topic = {partition}
partition 0
0 1 2 3 4 5 6
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5 6 7
29

30.

Архитектура Kafka Topic
topic = {partition}
partition 0
0 1 2 3 4 5 6
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5 6 7
30

31.

Архитектура Kafka Topic
topic = {partition}
partition 0
0 1 2 3 4 5 6
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5 6 7
offset = 0
31

32.

Архитектура Kafka Topic
topic = {partition}
partition 0
0 1 2 3 4 5 6
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5 6 7
offset = 1
32

33.

Архитектура Kafka Topic
topic = {partition}
partition 0
0 1 2 3 4 5 6
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5 6 7
offset = 2
33

34.

Архитектура Kafka Topic
topic = {partition}
partition 0
0 1 2 3 4 5 6
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5 6 7
offset = 3
34

35.

Архитектура Kafka Topic
partition = {segment}
35

36.

Архитектура Kafka Topic
partition = {segment}
0 1 2 3 4 5 6 7 8 9 … … … n … … …
36

37.

Архитектура Kafka Topic
partition = {segment}
0 1 2 3 4 5 6 7 8 9 … … … n … … …
segment
37

38.

Архитектура Kafka Topic
partition = {segment}
0 1 2 3 4 5 6 7 8 9 … … … n … … …
segment
38

39.

Архитектура Kafka Topic
partition = {segment}
0 1 2 3 4 5 6 7 8 9 … … … n … … …
segment
39

40.

Архитектура Kafka Topic
partition = {segment}
0 1 2 3 4 5 6 7 8 9 … … … n … … …
base offset
40

41.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
41

42.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
42

43.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
43

44.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
log
44

45.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
log
Index record = (relative offset, posit
45

46.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
log
Index record = (relative offset, posit
offset = 1234567890relative offset = 0
size = 100
position = 0
46

47.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
log
Index record = (relative offset, posit
offset = 1234567891relative offset = 1
size = 100
position = 100
47

48.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
log
Index record = (relative offset, posit
offset = 1234567892relative offset = 2
size = 50
position = 200
48

49.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
log
Index record = (relative offset, posit
offset = 1234567893relative offset = 3
size = 150
position = 250
49

50.

Архитектура Kafka Topic
segment = (base_offset, data, index, timeindex)
00000000001234567890.log
00000000001234567890.index
00000000001234567890.timeindex
50

51.

Архитектура Kafka Broker
cluster = {broker}
broker 1
broker 2
broker 3
51

52.

Архитектура Kafka Broker
Controller – координирует работу кластера
broker 1
broker 2
broker 3
52

53.

Архитектура Kafka Broker
topic = {partition}
broker 1
broker 2
broker 3
partition 0
partition 1
partition 2
partition 3
53

54.

Архитектура Kafka Broker
replication factor = 3
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
partition 1
partition 1
partition 1
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
54

55.

Архитектура Kafka Broker
Добавление partition
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
partition 1
partition 1
partition 1
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
55

56.

Архитектура Kafka Broker
broker 1 – leader для partition 0.
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
partition 1
partition 1
partition 1
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
leader
56

57.

Архитектура Kafka Broker
broker 2 – leader для partition 1
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
partition 1
partition 1
partition 1
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
leader
57

58.

Архитектура Kafka Broker
broker 3 – leader для partition 2
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
partition 1
partition 1
partition 1
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
leader
58

59.

Архитектура Kafka Broker
broker 3 – leader для partition 3
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
partition 1
partition 1
partition 1
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
leader
59

60.

Архитектура Kafka Broker
broker 2 – leader для partition 4
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
partition 1
partition 1
partition 1
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
leader
60

61.

Архитектура Kafka Broker
Репликация с лидера на другие брокеры
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
partition 1
partition 1
partition 1
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
leader
61

62.

Архитектура Kafka Broker
ISR (in sync replica) – реплика, синхронизированная с
лидероbrмoker 1
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
62

63.

Архитектура Kafka Broker
Все реплики синхронизированы
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
63

64.

Архитектура Kafka Broker
Недоступность лидера у partition 2
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
failed
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
64

65.

Архитектура Kafka Broker
Выбор нового лидера в случае недоступности
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
failed
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
65

66.

Архитектура Kafka Broker
Репликация с нового лидера
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
failed
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
66

67.

Архитектура Kafka Broker
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
failed
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
67

68.

Архитектура Kafka Broker
Синхронизация реплики с лидером после
восстаbнroоkвerл1ения
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
failed
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
68

69.

Архитектура Kafka Broker
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
failed
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
69

70.

Архитектура Kafka Broker
Перебалансировка лидеров
broker 1
broker 2
broker 3
partition 0
partition 0
partition 0
leader
partition 1
partition 1
partition 1
ISR
partition 2
partition 2
partition 2
failed
partition 3
partition 3
partition 3
partition 4
partition 4
partition 4
70

71.

Архитектура Kafka Producer
71

72.

Архитектура Kafka Producer
message = (key, value)
72

73.

Архитектура Kafka Producer
message = (key, value)
73

74.

Архитектура Kafka Producer
message = (key, value)
partition = murmur2(key) % partitions
74

75.

Архитектура Kafka Producer
message = (key, value)
partition = murmur2(key) % partitions // key != null
75

76.

Архитектура Kafka Producer
message = (key, value)
partition = murmur2(key) % partitions // key != null
https://ru.wikipedia.org/wiki/MurmurHash2
76

77.

Архитектура Kafka Producer
message = (key, value)
partition = murmur2(key) % partitions // key != null
partition = round_robin(partitions)
77

78.

Архитектура Kafka Producer
message = (key, value)
partition = murmur2(key) % partitions // key != null
partition = round_robin(partitions) // key == null
78

79.

Архитектура Kafka Producer
message = (key, value)
79

80.

Архитектура Kafka Producer
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
80

81.

Архитектура Kafka Producer
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
leader
81

82.

Архитектура Kafka Producer
replica 0
0 1 2 3 4 5 6 7 8
leader
replica 1
0 1 2 3 4 5 6 7 8
ISR
replica 2
0 1 2 3 4 5 6 7 8
ISR
82

83.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 0
83

84.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 0
84

85.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
0 1 2 3 4 5 6 7 8 9
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
процесс записи
acks = 0
85

86.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
0 1 2 3 4 5 6 7 8 9
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
процесс записи
acks = 0
86

87.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
процесс записи
acks = 1
87

88.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
0 1 2 3 4 5 6 7 8 9
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
процесс записи
acks = 1
88

89.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
89

90.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
90

91.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
replica 2
0 1 2 3 4 5 6 7 8 9
acks = 1
91

92.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = all
92

93.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = all
93

94.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = all
94

95.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
replica 2
0 1 2 3 4 5 6 7 8 9
acks = all
95

96.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
replica 2
0 1 2 3 4 5 6 7 8 9
acks = all
96

97.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
replica 2
0 1 2 3 4 5 6 7 8 9
acks = all
97

98.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
replica 2
0 1 2 3 4 5 6 7 8 9
acks = all
98

99.

Архитектура Kafka Producer
Acknowledgement (ack) – подтверждение записи
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
acks = all
replica 2
0 1 2 3 4 5 6 7 8 9
min.insync.replicas = 3
99

100.

Архитектура Kafka Consumer
100

101.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
101

102.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
след. сообщение
102

103.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
103

104.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
104

105.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
105

106.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
106

107.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
107

108.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
108

109.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
109

110.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
110

111.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
111

112.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
112

113.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
113

114.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
114

115.

Архитектура Kafka Consumer
partition 0
0 1 2 3 4 5 6 7
след. сообщение
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
115

116.

Архитектура Kafka Consumer
Commit offset
partition 0
0 1 2 3 4 5 6 7
116

117.

Архитектура Kafka Consumer
Commit offset
partition 0
0 1 2 3 4 5 6 7
прочитано
117

118.

Архитектура Kafka Consumer
Commit offset
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
118

119.

Архитектура Kafka Consumer
Commit offset
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
119

120.

Архитектура Kafka Consumer
Commit offset
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
120

121.

Архитектура Kafka Consumer
Commit offset
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
не закоммичено
121

122.

Архитектура Kafka Consumer
Commit offset
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
не закоммичено
122

123.

Архитектура Kafka Consumer
Commit offset
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
не закоммичено
123

124.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
124

125.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
125

126.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
126

127.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
127

128.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
128

129.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
129

130.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
130

131.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
131

132.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
132

133.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
133

134.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
134

135.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
135

136.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
136

137.

Архитектура Kafka Consumer
Consumer Group
partition 0
0 1 2 3 4 5 6 7
commit offset
прочитано
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
не закоммичено
137

138.

138

139.

Я
139

140.

МЫ ХОТИМ ВЫБРАТЬ
POSTGRESQL ДЛЯ
НОВОГО ПРОЕКТА…
Я
140

141.

МЫ ХОТИМ ВЫБРАТЬ
POSTGRESQL ДЛЯ
НОВОГО ПРОЕКТА…
НЕТ!
УЖЕ ЕСТЬ KAFKA!!!
Я
141

142.

МЫ ХОТИМ ВЫБРАТЬ
POSTGRESQL ДЛЯ
НОВОГО ПРОЕКТА…
НЕТ!
УЖЕ ЕСТЬ KAFKA!!!
НО У НАС ВСЕГО
100-500 RPS…
Я
142

143.

МЫ ХОТИМ ВЫБРАТЬ
POSTGRESQL ДЛЯ
НОВОГО ПРОЕКТА…
НО У НАС ВСЕГО
100-500 RPS…
НЕТ!
УЖЕ ЕСТЬ KAFKA!!!
ТОЛЬКО KAFKA!!!
И НЕЧЕГО ДУМАТЬ!!
Я
143

144.

МЫ ХОТИМ ВЫБРАТЬ
POSTGRESQL ДЛЯ
НОВОГО ПРОЕКТА…
НО У НАС ВСЕГО
100-500 RPS…
НЕТ!
УЖЕ ЕСТЬ KAFKA!!!
ТОЛЬКО KAFKA!!!
И НЕЧЕГО ДУМАТЬ!!
… И ДАННЫЕ В ОБЩЕМ-ТО
РЕЛЯЦИОННЫЕ…
Я
144

145.

МЫ ХОТИМ ВЫБРАТЬ
POSTGRESQL ДЛЯ
НОВОГО ПРОЕКТА…
НО У НАС ВСЕГО
100-500 RPS…
… И ДАННЫЕ В ОБЩЕМ-ТО
РЕЛЯЦИОННЫЕ…
НЕТ!
УЖЕ ЕСТЬ KAFKA!!!
ТОЛЬКО KAFKA!!!
И НЕЧЕГО ДУМАТЬ!!
KAFKA! KAFKA!
KAFKA!
Я
145

146.

Неочевидности в Kafka
146

147.

Неочевидности в Kafka
… или что мы пережили за год эксплуатации
147

148.

Неочевидности в Kafka
… или что мы пережили за год эксплуатации
(в очень кратком изложении)
148

149.

Настройки – Как разломать кластер
149

150.

Настройки – Как разломать кластер
log.dirs
150

151.

Настройки – Как разломать кластер
log.dirs
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7
151

152.

Настройки – Как разломать кластер
log.dirs
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7
152

153.

Настройки – Как разломать кластер
log.dirs
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7
153

154.

Настройки – Как разломать кластер
log.dirs
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7
154

155.

Настройки – Как разломать кластер
log.dirs
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7
unclean.leader.election.enable=false
155

156.

Настройки – Как разломать кластер
log.dirs
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7
unclean.leader.election.enable=false
KIP-106 - Change Default unclean.leader.election.enabled
from True to False (0.11)
156

157.

Настройки – Как разломать кластер
log.dirs
replica 0
replica 1
0 1 2 3 4 5 6 7
157

158.

Настройки – Как разломать кластер
log.dirs
replica 0
replica 1
0 1 2 3 4 5 6 7
158

159.

Настройки – Как разломать кластер
log.dirs
replica 0
replica 1
0 1 2 3 4 5 6 7
Брокер упал ☹
159

160.

Настройки – Как разломать кластер
log.dirs
replica 0
replica 1
0 1 2 3 4 5 6 7
https://issues.apache.org/jira/browse/KAFKA-3410
160

161.

Настройки – Как разломать кластер
log.dirs
replica 0
replica 1
0 1 2 3 4 5 6 7
(исправлено в 1.1)
https://issues.apache.org/jira/browse/KAFKA-3410
161

162.

Настройки – Настройки по
умолчанию (1)
162

163.

Настройки – Настройки по
умолчанию (1)
- default.replication.factor = 1
163

164.

Настройки – Настройки по
умолчанию (1)
- default.replication.factor = 1
- auto.create.topics.enable = true
164

165.

Настройки – Настройки по
умолчанию (2)
165

166.

Настройки – Настройки по
умолчанию (2)
- Настройки Broker, Consumer и Producer должны быть
166

167.

Настройки – Настройки по
умолчанию (2)
- Настройки Broker, Consumer и Producer должны быть
согласованы
167

168.

Настройки – Настройки по
умолчанию (2)
- Настройки Broker, Consumer и Producer должны быть
согласованы
- message.max.bytes
168

169.

Настройки – Настройки по
умолчанию (2)
- Настройки Broker, Consumer и Producer должны быть
согласованы
- message.max.bytes (Broker, 1_000_012)
169

170.

Настройки – Настройки по
умолчанию (2)
- Настройки Broker, Consumer и Producer должны быть
согласованы
- message.max.bytes (Broker, 1_000_012)
- max.request.size
170

171.

Настройки – Настройки по
умолчанию (2)
- Настройки Broker, Consumer и Producer должны быть
согласованы
- message.max.bytes (Broker, 1_000_012)
- max.request.size (Producer, 1_048_576)
171

172.

Настройки – Настройки по
умолчанию (2)
- Настройки Broker, Consumer и Producer должны быть
согласованы
- message.max.bytes (Broker, 1_000_012)
- max.request.size (Producer, 1_048_576)
- max.partition.fetch.bytes (Consumer, 1_048_576)
172

173.

Настройки – Умножение
- message.max.bytes (Broker, 1_000_012)
- max.request.size (Producer, 1_048_576)
- max.partition.fetch.bytes (Consumer, 1_048_576)
173

174.

Настройки – Умножение
- message.max.bytes (Broker, 1_000_012)
- max.request.size (Producer, 1_048_576)
- max.partition.fetch.bytes (Consumer, 1_048_576)
- batch.size (Producer, 16_384)
174

175.

Настройки – Умножение
- message.max.bytes (Broker, 1_000_012)
- max.request.size (Producer, 1_048_576)
- max.partition.fetch.bytes (Consumer, 1_048_576)
- batch.size (Producer, 16_384)
- KIP-126 - Allow KafkaProducer to split and resend
oversized batches (0.11)
175

176.

API – Блокирующий send
176

177.

API – Блокирующий send
- Если мета-данные не доступны – producer.send()
блокируется
177

178.

API – Блокирующий send
- Если мета-данные не доступны – producer.send()
блокируется
- max.block.ms = 60_000
178

179.

API – Блокирующий send
- Если мета-данные не доступны – producer.send()
блокируется
- max.block.ms = 60_000
- KIP-286: producer.send() should not block on metadata
update (discuss)
179

180.

API – Бесконечная десериализация
180

181.

API – Бесконечная десериализация
while(true)
{
ConsumerRecords<Key,
Event> records
consumer.poll(1_000);
for (var record : records)
{
/* do something */
}
}
=
181

182.

API – Бесконечная десериализация
try
{
/* parsing
*/
} catch (RuntimeException
e) {
throw new SerializationException(
"Error deserializing
key/value
for partition
" + partition
+
" at offset " + record.offset()
+
". If needed, please seek past the record to continue consumption.",
}
e);
182

183.

API – Бесконечная десериализация
try
{
/* parsing
*/
} catch (RuntimeException
e) {
throw new SerializationException(
"Error deserializing
key/value
for partition
" + partition
+
" at offset " + record.offset()
+
". If needed, please seek past the record to continue consumption.",
}
consumer.seek(partition,
e);
offset);
183

184.

API – Бесконечная десериализация
try
{
/* parsing
*/
} catch (RuntimeException
e) {
throw new SerializationException(
"Error deserializing
key/value
for partition
" + partition
+
" at offset " + record.offset()
+
". If needed, please seek past the record to continue consumption.",
}
e);
0 1 2 3 4 5 6 7 8
consumer.seek(partition,
offset);
184

185.

API – Бесконечная десериализация
try
{
/* parsing
*/
} catch (RuntimeException
e) {
throw new SerializationException(
"Error deserializing
key/value
for partition
" + partition
+
" at offset " + record.offset()
+
". If needed, please seek past the record to continue consumption.",
}
e);
0 1 2 3 4 5 6 7 8
consumer.seek(partition,
offset);
185

186.

API – Бесконечная десериализация
try
{
/* parsing
*/
} catch (RuntimeException
e) {
throw new SerializationException(
"Error deserializing
key/value
for partition
" + partition
+
" at offset " + record.offset()
+
". If needed, please seek past the record to continue consumption.",
}
e);
0 1 2 3 4 5 6 7 8
consumer.seek(partition,
offset);
186

187.

API – Бесконечная десериализация
try
{
/* parsing
*/
} catch (RuntimeException
e) {
throw new SerializationException(
"Error deserializing
key/value
for partition
" + partition
+
" at offset " + record.offset()
+
". If needed, please seek past the record to continue consumption.",
}
e);
0 1 2 3 4 5 6 7 8
consumer.seek(partition,
offset);
187

188.

API – Бесконечная десериализация
try
{
/* parsing
*/
} catch (RuntimeException
e) {
throw new SerializationException(
"Error deserializing
key/value
for partition
" + partition
+
" at offset " + record.offset()
+
". If needed, please seek past the record to continue consumption.",
}
e);
0 1 2 3 4 5 6 7 8
consumer.seek(partition,
offset);
188

189.

API – Бесконечная десериализация
try
{
/* parsing
*/
} catch (RuntimeException
e) {
throw new SerializationException(
"Error deserializing
key/value
for partition
" + partition
+
" at offset " + record.offset()
+
". If needed, please seek past the record to continue consumption.",
}
e);
0 1 2 3 4 5 6 7 8
consumer.seek(partition,
offset);
189

190.

API – Бесконечная десериализация
Наш выбор: кастомный десериализатор, который
вернёт null
в случае ошибки
190

191.

API – Бесконечная десериализация
Наш выбор: кастомный десериализатор, который
вернёт null
в случае ошибки
while(true)
{
ConsumerRecords<Key,
Event> records =
consumer.poll(1_000);
for (var record : records)
{
if (record.getValue()
== null)
{ continue; }
/* do something */
}
}
191

192.

API – Бесконечная десериализация
Наш выбор: кастомный десериализатор, который
вернёт null
в случае ошибки
while(true)
{
ConsumerRecords<Key,
Event> records =
consumer.poll(1_000);
for (var record : records)
{
if (record.getValue()
== null)
{ continue; }
/* do something */
}
}
192

193.

API – НЕчестное чтение
193

194.

API – НЕчестное чтение
Чтение по 3 сообщения
partition 0
0 1 2 3 4 5 6 7
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
194

195.

API – НЕчестное чтение
Чтение по 3 сообщения
partition 0
0 1 2 3 4 5 6 7
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
195

196.

API – НЕчестное чтение
Чтение по 3 сообщения
partition 0
0 1 2 3 4 5 6 7
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
196

197.

API – НЕчестное чтение
Чтение по 3 сообщения
partition 0
0 1 2 3 4 5 6 7
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
197

198.

API – НЕчестное чтение
Чтение по 3 сообщения
partition 0
0 1 2 3 4 5 6 7
partition 1
0 1 2 3 4 5 6 7 8
partition 2
0 1 2 3 4 5
198

199.

API – НЕчестное чтение
- KIP-41: KafkaConsumer Max Records (0.10)
199

200.

API – НЕчестное чтение
- KIP-41: KafkaConsumer Max Records (0.10)
- Жадный round-robin
200

201.

API – НЕчестное чтение
- KIP-41: KafkaConsumer Max Records (0.10)
- Жадный round-robin
- KIP-387: Fair Message Consumption Across Partitions in
KafkaConsumer (discuss)
201

202.

Рутина – Ограничение на размер
топика
202

203.

Рутина – Ограничение на размер
топика
- log.retention.bytes (Broker, unlimited)
203

204.

Рутина – Ограничение на размер
топика
- log.retention.bytes (Broker, unlimited)
- retention.bytes (Topic)
204

205.

Рутина – Ограничение на размер
топика
- log.retention.bytes (Broker, unlimited)
- retention.bytes (Topic) – per partition
205

206.

Рутина – Место на диске
206

207.

Рутина – Место на диске
- Нет автораспределения партиций по новым дискам
207

208.

Рутина – Место на диске
- Нет автораспределения партиций по новым дискам
- KIP-113: Support replicas movement between log
directories (1.1)
208

209.

Рутина – Место на диске
- Нет автораспределения партиций по новым дискам
- KIP-113: Support replicas movement between log
directories (1.1)
- Равномерное распределение партиций по
количеству
209

210.

Рутина – Место на диске
- Нет автораспределения партиций по новым дискам
- KIP-113: Support replicas movement between log
directories (1.1)
- Равномерное распределение партиций по
количеству
- KIP-178: Size-based log directory selection strategy
(discuss)
210

211.

Рутина – Новый Брокер
211

212.

Рутина – Новый Брокер
- Нет автораспределения партиций на нового Брокера
212

213.

Рутина – Новый Брокер
- Нет автораспределения партиций на нового Брокера
- Руками делать partition reassignment
213

214.

Рутина – Новый Брокер
- Нет автораспределения партиций на нового Брокера
- Руками делать partition reassignment
{ "version":
1,
"partitions":
[
{ "topic":
"topic",
"partition"
"replicas": [brokerIds]
},
...
]
}
: partition,
214

215.

Рутина – Новый Брокер
- Нет автораспределения партиций на нового Брокера
- Руками делать partition reassignment
{ "version":
1,
"partitions":
[
{ "topic":
"topic",
"partition"
"replicas": [brokerIds]
},
...
]
}
: partition,
215

216.

Рутина – Новый Брокер
- Нет автораспределения партиций на нового Брокера
- Руками делать partition reassignment
{ "version":
1,
"partitions":
[
{ "topic":
"hg2tg", "partition"
"replicas": [brokerIds]
},
...
]
}
: partition,
216

217.

Рутина – Новый Брокер
- Нет автораспределения партиций на нового Брокера
- Руками делать partition reassignment
{ "version":
1,
"partitions":
[
{ "topic":
"hg2tg", "partition"
"replicas": [brokerIds]
},
...
]
}
: 42,
217

218.

Рутина – Новый Брокер
{ "version":
1,
"partitions":
[
{ "topic":
"hg2tg", "partition"
"replicas": [1, 2,
3]
},
...
]
}
: 42,
218

219.

Рутина – Новый Брокер
- Preferred leader – первый брокер в списке реплик
{ "version":
1,
"partitions":
[
{ "topic":
"hg2tg", "partition"
"replicas": [1, 2,
3]
},
...
]
}
: 42,
219

220.

Выводы
220

221.

Выводы
- Внимательное отношение к настройкам
221

222.

Выводы
- Внимательное отношение к настройкам
- Особенности (недоработки?) клиентского API
222

223.

Выводы
- Внимательное отношение к настройкам
- Особенности (недоработки?) клиентского API
- Большое количество рутины
223

224.

Выводы
- Внимательное отношение к настройкам
- Особенности (недоработки?) клиентского API
- Большое количество рутины
- Документация о многом умалчивает
224

225.

Выводы
- Внимательное отношение к настройкам
- Особенности (недоработки?) клиентского API
- Большое количество рутины
- Документация о многом умалчивает
- Kafka – лучшее, что есть…
225

226.

Выводы
- Внимательное отношение к настройкам
- Особенности (недоработки?) клиентского API
- Большое количество рутины
- Документация о многом умалчивает
- Kafka – лучшее, что есть… И она классная
226

227.

* В СКОРОМ ВРЕМЕНИ *
227

228.

Я
228

229.

НОВЫЙ ПРОЕКТ НАМЕЧАЕТСЯ,
ДУМАЕМ НАД ВЫБОРОМ
ТЕХНОЛОГИЙ…
Я
229

230.

НОВЫЙ ПРОЕКТ НАМЕЧАЕТСЯ,
ДУМАЕМ НАД ВЫБОРОМ
ТЕХНОЛОГИЙ…
МНОГО ЖЕ ВСЕГО!
ДАВАЙ ДЕТАЛИ!
Я
230

231.

НОВЫЙ ПРОЕКТ НАМЕЧАЕТСЯ,
ДУМАЕМ НАД ВЫБОРОМ
ТЕХНОЛОГИЙ…
МНОГО ЖЕ ВСЕГО!
ДАВАЙ ДЕТАЛИ!
ОБЕЩАЮТ ХАЙЛОАД,
БИГ-ДАТУ,
ВОТ ЭТО ВСЁ!
Я
231

232.

НОВЫЙ ПРОЕКТ НАМЕЧАЕТСЯ,
ДУМАЕМ НАД ВЫБОРОМ
ТЕХНОЛОГИЙ…
ОБЕЩАЮТ ХАЙЛОАД,
БИГ-ДАТУ,
ВОТ ЭТО ВСЁ!
МНОГО ЖЕ ВСЕГО!
ДАВАЙ ДЕТАЛИ!
А-А-А!
К ЧЁРТУ ВСЁ!!!
Я
232

233.

НОВЫЙ ПРОЕКТ НАМЕЧАЕТСЯ,
ДУМАЕМ НАД ВЫБОРОМ
ТЕХНОЛОГИЙ…
ОБЕЩАЮТ ХАЙЛОАД,
БИГ-ДАТУ,
ВОТ ЭТО ВСЁ!
МНОГО ЖЕ ВСЕГО!
ДАВАЙ ДЕТАЛИ!
А-А-А!
К ЧЁРТУ ВСЁ!!!
KAFKA! KAFKA!
KAFKA!
Я
233

234.

Консистентность и доступность
234

235.

Консистентность и доступность
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
235

236.

Консистентность и доступность
replica 0
0 1 2 3 4 5 6 7 8
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
236

237.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
недоступность
237

238.

Консистентность и доступность
replica 0
0 1 2 3 4 5 6 7 8 9
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
процесс записи
acks = 1
238

239.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
239

240.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
240

241.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
недоступность
241

242.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
недоступность
242

243.

Консистентность и доступность
unclean leader election
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
недоступность
243

244.

Консистентность и доступность
unclean leader election (но это не точно)
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
acks = 1
недоступность
244

245.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 3
недоступность
245

246.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 3
недоступность
246

247.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 3
недоступность
247

248.

Консистентность и доступность
replica 0
0 1 2 3 4 5 6 7 8
процесс записи
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
replica 2
0 1 2 3 4 5 6 7 8
недоступность
248

249.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
249

250.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
250

251.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
251

252.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
252

253.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
253

254.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
254

255.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
255

256.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
256

257.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
257

258.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
258

259.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
259

260.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
260

261.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
261

262.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
262

263.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
263

264.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8
acks = all
replica 2
0 1 2 3 4 5 6 7 8
min.insync.replicas = 2
недоступность
264

265.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
acks = all
replica 2
0 1 2 3 4 5 6 7 8 9
min.insync.replicas = 2
недоступность
265

266.

Консистентность и доступность
replica 0
процесс записи
0 1 2 3 4 5 6 7 8 9
успешная запись
replica 1
0 1 2 3 4 5 6 7 8 9
acks = all
replica 2
0 1 2 3 4 5 6 7 8 9
min.insync.replicas = 2
недоступность
266
English     Русский Правила