CodeFest 2019. Григорий Кошелев (Контур) — А вы Кафку пробовали?

16b6c87229eaf58768d25ed7b2bbbf52?s=47 CodeFest
April 05, 2019

CodeFest 2019. Григорий Кошелев (Контур) — А вы Кафку пробовали?

Apache Kafka — распределённый программный брокер сообщений, применяемый в обработке в реальном времени данных большого объёма. К отличительным особенностям Apache Kafka можно отнести: надёжность, масштабируемость и высокую производительность. В докладе разберём основные архитектурные особенности и сценарии использования Apache Kafka. Рассмотрим неочевидные моменты и грабли, которые мы собрали на пути Востока.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 05, 2019
Tweet

Transcript

  1. А вы Кафку пробовали? Apache Kafka – распределённый брокер сообщений

    Григорий Кошелев СКБ Контур CodeFest, Новосибирск, 2019 =1
  2. План 1. Зачем нам Apache Kafka 2. Введение в Кафку

    3. Архитектура 4. Неочевидности 5. Выводы =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. Kafka Cluster Введение в Apache Kafka Producer Consumer Cluster =21

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

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

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

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

    Topic Broker Cluster =25
  26. Архитектура Apache Kafka - Topic - Broker - Producer -

    Consumer =26
  27. Архитектура Kafka Topic topic = {partition} 0 1 2 3

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

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

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

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

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

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

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

    4 5 6 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 partition 0 partition 1 partition 2 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 =45 Index record = (relative offset, posit
  46. Архитектура Kafka Topic segment = (base_offset, data, index, timeindex) 00000000001234567890.log

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

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

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

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

    00000000001234567890.index 00000000001234567890.timeindex =50
  51. Архитектура Kafka Broker broker 1 broker 2 broker 3 cluster

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

    – координирует работу кластера =52
  53. Архитектура Kafka Broker broker 1 partition 0 topic = {partition}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1 partition 2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 =70 leader ISR failed
  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 0 1 2 3 4 5 6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = all 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 min.insync.replicas = 3 =99 процесс записи успешная запись
  100. Архитектура Kafka Consumer =100

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =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 =118 commit offset прочитано
  119. Архитектура Kafka Consumer Commit offset partition 0 0 1 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =137 commit offset прочитано не закоммичено
  138. =138

  139. Я =139

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

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

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

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

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

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

    KAFKA!!! НО У НАС ВСЕГО 100-500 RPS… ТОЛЬКО KAFKA!!! И НЕЧЕГО ДУМАТЬ!! KAFKA! KAFKA! KAFKA! … И ДАННЫЕ В ОБЩЕМ-ТО РЕЛЯЦИОННЫЕ… Я =145
  146. Неочевидности в Kafka =146

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

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

    эксплуатации (в очень кратком изложении) =148
  149. Настройки – Как разломать кластер =149

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

  151. Настройки – Как разломать кластер log.dirs =151 0 1 2

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

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

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

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

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

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

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

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

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

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

    =161 0 1 2 3 4 5 6 7 replica 0 replica 1
  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 – Бесконечная десериализация =181 while(true) {
 ConsumerRecords<Key, Event> records

    =
 consumer.poll(1_000); for (var record : records) {
 /* do something */ } }
  182. API – Бесконечная десериализация =182 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);
 }

  183. API – Бесконечная десериализация =183 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);
 }
 consumer.seek(partition, offset);
  184. API – Бесконечная десериализация =184 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);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  185. API – Бесконечная десериализация =185 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);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  186. API – Бесконечная десериализация =186 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);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  187. API – Бесконечная десериализация =187 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);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  188. API – Бесконечная десериализация =188 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);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  189. API – Бесконечная десериализация =189 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);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  190. API – Бесконечная десериализация =190 Наш выбор: кастомный десериализатор, который

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

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

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

  194. Чтение по 3 сообщения API – НЕчестное чтение 0 1

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

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

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

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

    2 3 4 5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =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 =214 { "version": 1, "partitions": [ { "topic": "topic", "partition" : partition, "replicas": [brokerIds] }, ... ] }
  215. Рутина – Новый Брокер - Нет автораспределения партиций на нового

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

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

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

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

    в списке реплик =219 { "version": 1, "partitions": [ { "topic": "hg2tg", "partition" : 42, "replicas": [1, 2, 3] }, ... ] }
  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. Консистентность и доступность 0 1 2 3 4 5 6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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