itmo_conspects

Лекция 10. Распределенные хранилища

Зачем нам нужны распределенные хранилища? Есть 3 причины:

  1. Посмотрим на File-Server архитектуру: в ней мы выделили недостаток с тем, что файл блокируется при попытке доступа к нему. Тогда мы сделали прослойку “Приложение”, к которому обращаются наши клиенты.

    Client-App-Data

    В этом случае приложение становится бутылочным горлышком. Тогда мы можем разделить слой приложения на несколько узлов:

    Client-Apps-Data

    Здесь, как гласит еврейская пословица:

    Если проблему можно решить деньгами, то это не проблема, а затраты

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

  2. Хорошо, так как мы не можем уменьшить количество транзисторов на чипе из-за физики, мы можем купить огромный сервер и поставить туда огромные плашки памяти.

    Возникает проблема: подводя к серверу N кВт, мы должны эти N кВт в виде тепла отвести от сервера, иначе полупроводники расплавятся.

    Так как затраты энергии возрастают экспоненциально, мы не можем сделать огромный компьютер, но можем сделать много маленьких

  3. Естественная распределенность данных: зачем хранить данные про питерский склад маркетплейса в центральном сервере в Москве? Не проще ли их хранить там, где они непосредственно нужны.

    В случае маркетплейса мы не можем клиентскую базу разделить на какие-то части, но данные логистики мы можем разделить так, чтобы они действовали в едином информационном поле


Получается, что нам надо сделать распределенную систему:

Decentralized Data

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

Как же это сделать? Мы можем распологать таблицы по разным узлам, но тогда сделаем операцию JOIN еще медленнее.

Но мы можем сделать с табличками фрагментацию

Также мы можем применять репликацию. Реплика - копия объекта, для которого поддерживается синхронизация с исходным объектом

Есть 3 стратегии репликации

Здесь мы приходим к определению распределенной СУБД

Распределенная СУБД - комплекс программ, предназначенный для управления базой данных и позволяющий сделать распределенность информации прозрачной для конечного пользователя

“Прозрачная” в определении означает, что распределенная база данных ощущается как единое целое. Тут можно выделить 4 уровня прозрачности:

Распределенные баз данных бывает:

Дальше Дейт конкретизировал требования прозрачных СУБД, вышло 12 правил:

  1. Локальная автономность: локальные данные принадлежат локальным владельцам и сопровождаются локально (данные не могут передаваться горизонтально)

  2. Отсутствие опоры на центральный узел: в системе не должно быть ни одного узла, без которого не может функционировать система

  3. Непрерывное функционирование: в системе не должна возникать потребность в плановой остановке ее функционирования

  1. Независимость от расположения фрагментов: пользователь должен получать доступ, начиная с текущего узла

  2. Независимость от репликации

  3. Независимость от фрагментации

  4. Обработка распределенных запросов: система должна поддерживать обработку запросов с данными, расположенных более чем на одном узле

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

  6. Независимость от типа оборудования

  7. Независимость от сетевой архитектуры

  8. Независимость от операционной системы

  9. Независимость от типа СУБД

И при составлении запроса к распределенном СУБД нужно знать ответы на такие вопросы:

И здесь возникают проблемы с распределенными транзакциями: пусть есть 2 реплики одного фрагмента, одна транзакция пишет что-то в одну реплику, из-за этого она блокируют к чтению все реплики, но в это время вторая транзакция пишет что-то во вторую реплику, которая еще не успели заблокировать. Тогда придумали 2-фазное выполнение транзакции

1 фаза: любая транзакция пытается блокировать все ресурсы, которые ей понадобятся, если где-то не получается заблокировать, то предпринимается откат

2 фаза: выполняются изменения в базу данных


И чтобы решить все эти проблемы с реляционными базами данных приходят NoSQL решения, о которых будет следующая лекция