Редкие базы данных: Riak

One ring to rule them all
25 июля 2016225057Андрей Никифоров132239

Здравствуйте!

В прошлой статье «Транзакции, ACID, CAP» я обещал рассказать о редких базах данных. Сегодня речь пойдет о распределенной базе данных типа «ключ-значение» — Riak.

Riak придумали ребята из Basho, которые занимались разработкой разного энтерпрайзного распределенного ПО. Написан он на Erlang, код открыт и лежит на Гитхабе: github.com/basho/riak.

Как работает

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

Когда пользователь пишет в Riak данные (ключ-значение), от ключа берется SHA-1 хеш, и на основе хеша данные пишутся сразу на несколько нод. Так как ноды распределены по кругу между машинами, то данные попадают на несколько разных физических машин. Количество нод, на которые пишутся данные, называется N. Запомните его, оно нам пригодится. Для кластера из четырех машин N обычно равно трем.

Данные записали, теперь их надо прочесть. Riak хранит у себя таблицу распределения промежутков хешей по нодам, и знает, где какие данные располагаются. По умолчанию он постарается прочесть данные со всех трех нод, но при настройке указывается еще один параметр R. Он определяет, с какого количества нод нужно успешно прочесть данные, чтобы можно было их отправить клиенту.

И наконец для записи есть параметр W. Он определяет, на сколько нод нужно успешно записать данные, чтобы можно было ответить клиенту, что все хорошо.

Три параметра N, W и R определяют баланс между надежностью и скоростью работы кластера.

Riak и CAP

Riak реализует AP-часть CAP-теоремы: гарантирует доступность и устойчивость к разделению кластера ценой согласованности данных. Вот как это происходит.

Представим кластер из четырех машин — две машины в одном дата-центре и две в другом с N=3, R=2, W=2. Все идет хорошо, пока связь между центрами не рвется.

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

Для его разрешения применяется алгоритм last write wins: для каждой пары ключ-значение хранятся временные метки и запись, которая была последней, выигрывает и становится истинной.

Гибкость Riak

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

Кроме того, кольцевая организация нод позволяет делать прекрасную вещь: можно добавить или удалить машины из кластера, не останавливая его. Вот как это работает:

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

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

Почему Riak — редкая база данных

Дело в том, что Riak избыточен для большинства проектов, и имеет свои подводные камни. Избыточность заключается в том, что для небольших проектов MySQL или Postgresql покрывает все требования к хранению данных, а грамотная репликация дает хорошую отказоустойчивость.

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

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

Таким образом, Riak вам нужен, если у вас действительно много данных и вы точно знаете, что делаете. Или просто поиграться. Хорошая книга по Riak для тех, кто заинтересовался: littleriakbook.com

В следующей статье — Cassandra.

 

базы данныхriakweb_developer
Нашли ошибку в тексте? Напишите нам.

Популярные статьи

Новые комментарии