Примечания: Распределенные системы в одном уроке Тима Берглунда

Вот некоторые заметки по этому оригинальному видео от Тима Берглунда. Посмотрите его!

С точки зрения клиента, распределенная система — это набор компьютеров, которые действуют как единое целое.

Характеристики

  • Работают одновременно
  • Выходят из строя независимо друг от друга
  • У них нет общих глобальных часов

Три темы


1) Хранение

Начните с одной реляционной базы данных, обычно вы получаете больше чтений, чем записей.

Репликация чтения

Чтобы снизить чрезмерную нагрузку на БД, когда чтения становится слишком много, вы можете использовать репликацию чтения. Один главный узел для записи и несколько для чтения. Это хорошо, пока главный узел не насытится (обычно на записи, так как чтение может масштабироваться).

Более подробная информация о репликации чтения здесь

Шардинг

Sharding. Вы разделяете схему репликации чтения по ключу (скажем, по фамилии, поэтому от A-F — один шардинг, от F-N, затем N-Z).

✅ Решает ❌ Создает проблему
— Теперь у вас больше пространства для распределения записей — Нарушена согласованность
— Нарушена модель данных (нет JOIN между шардами).

Для решения проблем с задержками вы можете рассмотреть денормализацию вашей БД (ака удаление связей между таблицами). Пожалуйста, не делайте этого.

Более подробная информация о шардинге здесь

Последовательное хеширование

Допустим, у вас есть база данных ключ/значение. Вы хэшируете ключ и храните его в соответствии с определенными вами шардами. В данном примере

Каждый шард индексирует 1/8 часть содержимого, индексируемого по первой цифре хэша. Если я хочу хранить

{key: "Tim", value: "Americano"}
Войти в полноэкранный режим Выход из полноэкранного режима

Я бы сначала хэшировал ключ

{hashedKey: "9F72", value: "Americano"}
Вход в полноэкранный режим Выход из полноэкранного режима

найти соответствующий узел (в данном случае A000, поскольку A000 > 9F72 > 8000) и сохранить его там.

Репликация

Если нам нужно обеспечить отсутствие проблем при сбое системы (например, при выходе из строя одного узла), вы можете реплицировать данные в других узлах (скажем, в следующих двух узлах).
❌ Проблема, которая возникает при этом, заключается в непоследовательности, поскольку теперь вы записываете данные на более чем один узел. Что, если вы хотите написать в 3 узла, но один из них не работает? Это будет непоследовательно, когда он снова заработает.

Непоследовательность или R+W>N

Если количество узлов, на которые я пишу + количество узлов, с которых я читаю, больше, чем количество реплик, у вас сильная согласованность.

Теорема CAP

  • Последовательность: Когда я что-то читаю, я хочу, чтобы это была последняя версия.
  • Доступно
  • Толерантность к разделам: Если часть системы падает, вся система должна работать.Теорема в основном утверждает, что иногда в реальных приложениях нужно отказаться от одной из трех частей.Пример: Если раздел падает, и поступает запрос на чтение, вы можете либо:
  • a) Дать лучший ответ, на который вы способны, хотя он может быть непоследовательным
  • b) Пожертвовать доступностью и вернуть ошибку, чтобы гарантировать, что не будет отправлен непоследовательный ответ.

2) Вычисления

Распределенные вычисления по сути похожи на переход от однопоточных вычислений к многопоточным, но в несколько раз хуже.

Представьте, что у вас есть куча данных, хранящихся на множестве компьютеров, и вам нужно что-то с ними сделать.

Старый способ: MapReduce

Проталкивает все ваши данные через две функции

  • Map
  • Reduce

Пример: Допустим, у вас есть предложение

I want to eat two burgers with fries
and drink two sodas with ice
Войти в полноэкранный режим Выйти из полноэкранного режима

Карта

Когда вы вызываете функцию map, она, по сути, производит «безэталонный» подсчет каждого слова (поскольку у нее еще нет памяти, поэтому все числа будут равны 1).

  • {I, 1}
  • {want, 1}
  • {to, 1}
  • {eat, 1}
  • {two, 1}
  • {burgers, 1}
  • {with, 1}
  • {and, 1}
  • {drink, 1}
  • {two, 1}
  • {sodas, 1}
  • {with, 1}
  • {ice, 1}

Перемешивание

Поскольку это распределенное вычисление, иногда вам может понадобиться перемещать эти слова по сети, записывать их рядом друг с другом и так далее.

Reduce

Функция reduce в данном случае правильно подсчитает все использования одного слова.

  • {I, 1}
  • {want, 1}
  • {to, 1}
  • {eat, 1}
  • {two, 2}
  • {burgers, 1}
  • {with, 2}
  • {and, 1}
  • {drink, 1}
  • {sodas, 1}
  • {ice, 1}

Теперь нам удалось разделить работу map и работу reduce между многими компьютерами.

Более подробная информация о map-reduce здесь

Spark

map-reduce становится transform-action. Та же парадигма «разбросать/собрать».
По сравнению с Hadoop, Spark также не зависит от хранилища данных.

Kafka

В kafka все представляет собой поток в реальном времени.


3) Обмен сообщениями

  • Системы могут общаться друг с другом вместо того, чтобы общаться друг с другом через общие базы данных.
  • Сообщения потребляются подписчиками
  • Создаются производителями
  • Организованы в темы
  • Обрабатываются брокерами
  • Обычно сохраняются в долгосрочной перспективе, но вы можете изменить период хранения на любой, какой захотите.

❌ Проблемы, с которыми вы можете столкнуться:

  • Тема становится слишком большой (огромный период хранения, сообщения огромные, чтение и запись слишком быстрые…).
  • Надежность
  • Гарантируйте доставку, даже если компьютер не работает

Apache Kafka

⚠ При масштабировании теряется общесистемный порядок. У вас все еще есть порядок в масштабе раздела.

Производители будут создавать события и случайным образом распределять их по разделам (не совсем случайным образом, но ради аргументации предположим, что это так). Эти разделы будут иметь потребителя на другой стороне, обрабатывающего то событие, которое стоит первым в очереди.

Замечательно то, что если после создания события вы захотите сохранить его, вы сможете это сделать! Любой может подписаться на эту тему, и после создания события у вас может быть потребитель, который хранит информацию в MySQL DB, и другой, который делает какую-то форму обработки в реальном времени.

Более подробная информация о kafka здесь

Готово!

Надеюсь, эти короткие заметки помогут вам! Не забудьте посмотреть оригинальное видео и поделиться им!

Хорошего дня!

Оцените статью
devanswers.ru
Добавить комментарий