Распределенные базы данных. Цели и проблемы
Набор требований к распределенным базам данных, которых хотят достигнуть
Требования по децентрализации
- Локальная независимость - узел должен функционировать даже в изоляции
(имеется в виду отвечать как на запросы на чтение, так и на изменение).
- Отсутствие центрального узла, так как при его наличии и отключении не выполнится локальная независимость.
- Непрерывное функционирование;
- Надежность, то есть все наши изменения будут применены и никогда не потеряются;
- Доступность, даже при отсутствии связности.
- Надежность, то есть все наши изменения будут применены и никогда не потеряются;
Вынуждены использовать стратегию равноправности узлов, но могут выбираться локальные временные координаторы, которые будут координировать запросы, затрагивающие несколько узлов.
Требования по прозрачности
- Независимость от расположения;
- Программы могут работать на любом узле (данные действительно хранятся распределенно в отличие от репликации);
- Удаленный доступ к данным (должны уметь сделать любой запрос на любом узле);
- Программы могут работать на любом узле (данные действительно хранятся распределенно в отличие от репликации);
Распределенная БД должна логически себя вести как одна большая БД, хотя временные задержки скрыть не удастся.
Независимость от фрагментации
- Программы не знают на каком узле находятся данные.
- Унифицированный доступ к данным, неважно, на локальном ли они узле или удаленном.
- Географическое секционирование, некоторые узлы могут быть географически удаленных и это надо учитывать.
Независимость от репликации
- Автоматическая поддержка репликации.
- Выбор узла для обновления.
Могут как реплицироваться отдельные узлы, так и целиком вся БД.
Распределенные транзакции
Участвует несколько узлов. Транзакция должна быть либо зафиксирована на всех узлах, либо на всех откачена. Бывают сбои как самих участников, так и каналов коммуникаций между ними.
- Поддержка распределенных запросов.
- Один запрос получает данные с разных узлов;
- Несколько узлов могут участвовать в одной транзакции;
- Должна быть согласованность фиксаций и отката.
- Один запрос получает данные с разных узлов;
Независимость от окружения
- От аппаратуры, то есть должны быть унифицированное представление данных;
- От ОС, то есть должна быть конвертация данных и поддержка разных ОС;
- От сети, например, в дата центрах будет быстрая локальная связь;
- От типа СУБД, хотелось бы уметь делать распределенную БД, которая обслуживается разными системами управления БД (Oracle, Postgres, etc). Но в реальности все очень печально.
Проблемы распределенных баз данных
CAP теорема
Можем удовлетворить только двум из следующих трем свойств одновременно:
- Consistency — информация на разных узлах согласована;
- Availability — система отвечает на запросы в любой момент времени;
- Partition tolerance — связи между узлами могут обрываться.
Но свойства не бинарные, а доказательство верно только для бинарных свойств.
То есть зачастую согласованность нужна не во всех случаях, не в всегда нельзя пережить без ответа системы и так далее, а значит, что не попадаем под условие CAP-теоремы.
Чаще всего компромиссы рассматривают с точки зрения partition tolerance. В случае разрыва связи можем:
- Частично отказаться от доступности, поэтому функционировать
будет только одна часть системы (например, самая большая);
- Частично отказаться от согласованности, поэтому не все узлы будут в согласованном состоянии,
но при объединении системы будут протоколы, приводящие всю систему в согласование.
Без обрыва связи система не разделена и будет полностью выполняться как доступность, так и согласованность.
Есть подход BASE, ослабляющий CAP
Принцип BASE
- Basically Available - сбой узла приводит к отказу только для части пользователей
(тех, которые присоединены были в данному узлу);
- Soft-state - изменение состояния без внешнего вмешательства, данные могут поменяться без изменений со стороны пользователя;
- Eventual consistency - временная несогласованность.
Soft-state происходит только в ситуации, когда клиенты отдельно изменяли данные при обрыве соединений, и при восстановлении связи у каждого из клиентов будут изменения произошедшие без его вмешательства.
Eventual consistency нужен для того, чтобы была гарантия, что мы узнаем обо всех изменениях после применения протокола объединения при восстановлении оборванной связи.
Последние два свойства нужны для того, чтоб при восстановлении связи система постепенно (не мгновенно) приходила в согласованное состояние.
Этот подход возможно реализовать в реальном мире.
Разрешение несогласованности
Если разрешать при чтении, то замедляется чтение.
Можем узнавать, не появилось ли на каком-то удаленном узле изменение наших данных, о котором он еще не успел сообщить, что небыстро.
При записи - замедляется запись.
Можем запрещать изменять удаленные данные в случае разрыва соединения, но локальные изменять свободно.
Может быть отдельный асинхронный процесс, приводящий систему к согласованию, но это тоже ресурсы.
Будет честно запрашивать изменения, объединять их и доносить новое состояние до всех узлов БД.
Итого, у нас будет несколько изменений, которые нужно как-то объединить.
Можно, например, с помощью меток времени или векторных часов.
Оптимизация вопросов
В распределенном случае еще сложнее, поскольку нужны новые механизмы агрегации, которые будет учитывать планировщик запросов.
К тому же мы не можем предсказать какой объем данных придет от удаленного узла, а предзапрос для выяснения этого требует дополнительных ресурсов.
Цели
Хотим того же, что и при наличии всего одного узла:
- Минимизация время выполнения;
- Минимизация количества затронутых данных (в том числе удаленных), чтобы не загружать лишний раз каналы.
- Минимизация количества коммуникаций, так как сходить лишний раз на удаленный узел - потеря производительности.
Средства
- Выбор узлов получения и обработки данных;
Обычно либо данные напрямую пересылаются к клиенту, либо выбирается один из узлов на которых данные исходно хранятся, но могут быть и более сложные схемы, на которых в теории некий промежуточный узел может агрегировать все данные и уже он их отошлет клиенту.
- Полусоединения (половины будущего объединения) - один узел может от другого узла спросить id только те, которые ему нужны для построения соединения и делается это за одну коммуникацию;
- Применение репликации, тогда зачастую клиентскому узлу нужно будет запросить у исходных узлов, нет ли у них изменений в запрашиваемых данных.
Управление параллельностью
Большое количество узлов может дать как ускорение получение данных, но так и дает большие сложности по синхронизации, все проблемы распределенных систем находят свое место и в распределенных БД.
Цели
- Распараллеливание запроса (достижим гораздо более высокий параллелизм благодаря наличию кучи различных узлов из которых параллельно достаем данные, что быстро);
- Изоляция транзакций или удаленные распределенные блокировки, что очень непросто;
- Детектирование распределенных взаимных блокировок тоже усложняет задачу.
Средства
- Распределенные транзакции;
- Распределенные блокировки;
- Стратегия основной копии.
При связной системе можно обойти сложности засчет основной копии, но нужно все равно решать вышеуказанные сложности, так как есть потенциальный отказ коммуникации в системе.
Управление каталогом
Для каталога (мета-описания наших данных) невозможна Soft-state синхронизация, потому что могут прийти данные, не описанные в каталоге, поэтому с ними действия должны быть синхронны.
Цели
- Независимость от расположения (независимо от узла запрос должен вернуть одни и те же данные);
- Независимость от фрагментации;
- Возможность переноса данных.
Методы
- Централизованное хранилище;
- Полная репликация;
- Локальное секционирование;
- Секционирование и репликация.
Вынуждены хранить реплики каталога во всех местах, но его объем небольшой, поэтому это не проблема. Для изменения делаем одну большую синхронную операцию.
БД секционирована по конкретным узлам, на которых хранятся данные, и в каталоге явно указано где какие данные хранятся.
Можем добавлять, удалять узлы
Обычно запрещается менять каталог БД, если не все узлы доступны, так как объединить изменение каталогов на практике обычно является нерешаемой задачей.
Независимость от окружения
Используется механизм шлюзов — разные СУБД могут общаться друг с другом за данными несмотря на разные форматы хранения данных, запросов.
Задачи шлюза
- Реализация протоколов с помощью семантического взаимодействия;
- Конвертация данных, запросов, каталога;
- Поддержка распределенных транзакций, блокировок.
Одна СУБД является координатором запроса, через шлюз достает данные другой СУБД.
При запросе шлюз притворяется, что является удаленной копией инициировавшей запрос БД, но получив запрос, транслирует его синтаксис или конвертирует один бинарный протокол в другой, после чего шлюз исполняет запрос на реальной БД другого типа,
конвертирует ответ в вид, понятный первой БД и отдает.
На практике таких решений очень мало.