RethinkDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:36, 27 мая 2018.
RethinkDB
Выпущена: 24 July 2009 (2009-07-24)
Постоянный выпуск: 2.3.6 / July 17, 2017 (2017-07-17)
Состояние разработки: Active
Написана на: C++, JavaScript, Bash
Операционная система: UNIX, Linux, OS X, BSD
Локализация: English
Лицензия: ASLv2.0
Веб-сайт rethinkdb.com

RethinkDB — это open source база данных для real-time приложений. Она располагает встроенной системой уведомления об изменениях, которая беспрерывно транслирует обновления для вашего приложения. Вместо постоянного запрашивания новых данных, позвольте базе данных самой отправлять вам последние изменения. Возможность «подписываться» на потоковые обновления может сильно упростить архитектуру вашего приложения и работу с клиентами, поддерживающими постоянный коннект к вашей серверной части.[Источник 1]

Описание

RethinkDB является безсхемным хранилищем JSON документов, но также поддерживает и некоторые особенности реляционных БД. RethinkDB также поддерживает кластеризацию, что делает её очень удобной в расширении. Вы можете настроить шардинг и копирование через встроенный веб-интерфейс. Последняя версия RethinkDB также включает в себя автоматический «fail-over» для кластеров с тремя и более серверами. Язык запросов в RethinkDB, который называется ReQL, нативно встраивается в код на том языке, на которым вы пишите своё приложение. Таблицы базы данных хранят JSON-документы, допускающие любой уровень вложенности. Каждый документ имеет уникальный для таблицы-родителя первичный ключ «id», ссылаясь на который можно получить конкретный документ. Каждая функция ReQL-запроса работает с данными, полученными из предыдущей функции цепочки. [Источник 2]

История

После закрытия одноименной компании RethinkDB, группа бывших сотрудников и членов сообщества сформировала временную команду руководства и приступила к разработке плана по сохранению проекта программного обеспечения с открытым исходным кодом RethinkDB, переведя его в сообщество. 6 февраля 2016 года Cloud Native Computing Foundation (CNCF) приобрела права на исходный код RethinkDB и внесла свой вклад в Linux Foundation под разрешающей лицензией ASLv2.0.

Столь долгая задержка с решением судьбы проектов (помимо СУБД RethinkDB, CNCF приобрела права на проект Horison) связана с заморозкой исходных кодов проектов кредиторами, которые изъяли последние в следствие финансовых трудностей компании RethinkDB.

17 июля 2017 года была опубликована новая версия RethinkDB 2.3.6 - первая обновленная версия с момента перехода к ASLv2.0 лицензии, коей радостью незамедлительно поделились в официальном блоге продукта.

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

Также у сообщества имеются виды и на более длительный срок - версия RethinkDB 2.5 может потенциально привести к некоторым улучшениям производительности, которые повышают надежность записи.

Поддерживаемые языки программирования

RethinkDB поддерживает следующие языки программирования:

Кроме четырех официальных языков, есть также много сторонних драйверов, поддерживаемых сообществом RethinkDB (все приведенные ниже языки поддерживают как минимум версию 2.0):

  • C#/.NET: RethinkDb.Driver, rethinkdb-net (полностью поддерживает версию 2.3)
  • C++
  • Clojure: clj-rethinkdb (протестирована на версии 2.0.х, но должно работать со всеми версиями, поддерживающими протокол JSON, т.е. 1.13+)
  • Elixir: rethinkdb-elixir (ведутся работы по стабилизации Roadmap Version 1.0.0, на данный момент актуальна версия 0.4.0)
  • Go: GoRethink (Текущая версия: v4.0.0 (RethinkDB v2.3); Обратите внимание, что эта версия драйвера поддерживает только версии RethinkDB с использованием протокола v0.4 - любые версии драйвера старше RethinkDB 2.0 работать не будут)
  • Haskell: haskell-rethinkdb (Поддерживаемая версия 2.2.0.10)
  • PHP: php-rql
  • Scala: rethink-scala (Реализован не весь функционал версии 2.0)
  • Objective-C (Реализован не весь функционал версии 2.0)
  • Common Lisp: cl-rethinkdb
  • Dart (обновлен до версии 2.3)
  • Swift (Драйвер реализует протокол V1_0 (который поддерживает аутентификацию имени пользователя и пароля с помощью SCRAM и доступен в RethinkDB 2.3.0). Кроме того, вы также можете использовать V0_4. Некоторые команды и необязательные аргументы могут отсутствовать, но, как правило, их легко добавить в код. Драйвер написан для Swift 3, также можно найти рабочий драйвер для версии Swift 2.2)
  • Delphi (протестировано на версии 1.15, должно работать со всеми версиями, поддерживающими протокол JSON, т.е. 1.13+)
  • Erlang
  • Lua (Поддерживает версии 2.3 и выше)
  • Nim
  • Perl
  • R (Главным недостатком является поддержка соединений шифрования, ключей auth и протокола 1-Wire. Все это сводится к тому, что R не поддерживает криптографические примитивы и не связывает соединения с TLS)
  • Rust

Язык запросов ReQL

RethinkDB содержит в себе таблицы, в которых хранятся традиционные JSON документы. Структура самих JSON объектов может иметь глубокую вложенность. Каждый документ в RethinkDB имеет свой основной ключ (primary key) — свойство «id» с уникальным для таблицы-родителя значением. Ссылаясь на primary key в своём запросе вы можете получить конкретный документ.

Написание ReQL запросов в приложении похоже на использование API конструктора SQL запросов. Ниже, на языке JavaScript, представлен простой пример ReQL запроса для определения количества уникальных фамилий в таблице users [Источник 3]:

    r.table("users").pluck("last_name").distinct().count()

В ReQL запросе каждая функция цепочки работает с данными, полученными из предыдущей функции. Если быть точным, то порядок выполнения данного запроса таков:

  • table запрашивает определнную таблицу в базе данных
  • pluck достаёт определенное свойство (или несколько свойств) из каждой записи
  • disctinct убирает повторяющиеся значения, оставляя только по одному уникальному
  • count подсчитывает и возвращает количество полученных элементов

ReQL включает в себя функцию insert, которую можно использовать для добавления новых JSON документов в таблицу:

     r.table("fellowship").insert([
         { name: "User1", species: "host1" },
         { name: "User2", species: "host2" },
      ])

Функция filter достаёт документы, которые соответствуют определённым параметрам:

     r.table("fellowship").filter({species: "host1"})

Принцип работы ReQL

RethinkDB client libraries (далее «драйвера») отвечают за интеграцию ReQL в тот язык программирования, на котором ведется разработка приложения. Драйвера внедряют функции для всевозможных запросов, поддерживаемых базой данных. ReQL выражения расцениваются как структурированные объекты, которые похожи на абстрактное синтаксическое дерево. Но для того чтобы выполнить запрос, драйвера переводят эти объекты запроса в специальный формат "RethinkDB's JSON wire protocol format", в котором затем передаются в базу данных.

Функция "run", замыкающая цепочку, переводит запрос, выполняет его на сервере и возвращает результат. Как правило вы будете передавать в эту функцию соединение с сервером, чтобы она смогла выполнить операцию. В официальных драйверах работа с соединением выполняется в ручном режиме. Это значит что вам нужно создавать соединение и закрывать его после выполнения операции.

В следующем примере показано как выполнить запрос в RethinkDB из-под Node.js с установленным драйвером ReQL для JavaScript. Этот запрос достаёт всех хафлингов (halflings) из таблицы fellowship и отображает их в консоли:

    var r = require("rethinkdb");

    r.connect().then(function(conn) {
    return r.table("fellowship")
         .filter({species: "halfling"}).run(conn)
    .finally(function() { conn.close(); });
    })
    .then(function(cursor) {
    return cursor.toArray();
    })
    .then(function(output) {
    console.log("Query output:", output);
    })

Модуль rethinkdb обеспечивает доступ и использование драйверов RethinkDB. Вы можете использовать этот модуль для составления и отправки запросов к базе. Метод connect устанавливает соединение, который затем используется функцией run. для выполнения запроса. Сам по себе запрос возвращает курсор, который является чем-то вроде открытого окошка в содержимое базы. Курсоры поддерживают «ленивую выборку» (lazy fetching) и предлагают эффективные способы перебора больших объёмов данных.

Шардинг и репликация

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

RethinkDB использует алгоритм шардинга, параметризованный на первичном ключе таблицы для разделения данных. Когда пользователь заявляет, что хочет, чтобы данная таблица использовала определенное количество шардов, система проверяет статистику для таблицы и находит оптимальный набор точек разделения для равномерного разбиения таблицы. В настоящее время все шарды выполняются на основе первичного ключа таблицы и не могут быть выполнены на основе любого другого атрибута (в RethinkDB первичный ключ и ключ шарда - фактически то же самое).

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

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

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

Шардинг и репликация настраиваются с помощью конфигураций таблиц, которые позволяют вам просто указывать количество шардов и реплик для каждой таблицы или для всех таблиц в базе данных. Пользователям не нужно вручную связывать серверы с таблицами. RethinkDB использует набор эвристик для оптимального удовлетворения конфигураций таблиц. Он будет копировать данные для новых реплик с доступного сервера, равномерно распределять реплики данных по кластеру, распределять нагрузку равномерно и т. д. [Источник 4]

Масштабирование и управление кластером RethinkDB

RethinkDB является распределённой базой данных, нацеленной на кластеризацию и простое расширение. Чтобы добавить новый сервер к кластеру, достаточно просто запустить его из командной строки с опцией --join и указанием адреса уже существующего сервера. Если у вас в распоряжении кластер с несколькими серверами, вы можете настраивать шардинг и копирование индивидуально для каждой таблицы. Любые настройки и особенности, работающие на одном экземпляре БД будут работать в точности также и на кластере.

Сервер RethinkDB включает в себя также и веб-интерфейс администратора, открыть который вы можете прямо в браузере. С помощью этого интерфейса можно легко управлять и мониторить работу кластера. Вы даже можете настроить шардинг и копирование в несколько кликов.

RethinkDB позволяет применять ReQL-подход для конфигурации кластера, который идеально подходит для тонкой настройки и автоматизации. ReQL включается в себя простую функцию reconfigure, которую можно привязать к таблице для установки настроек шардинга. Также кластер предоставляет большую часть внутренней информации о своём состоянии и настройках через набор специальных таблиц в RethinkDB. Вы можете делать запросы к системным таблицам, чтобы изменять настройки или получать информацию для мониторинга. Практически весь функционал, предоставляемый через веб-интерфейс, построен на ReQL API. [Источник 5]

Установка

Одна особенность, которая выделяет RethinkDB среди других NoSQL баз данных - проста в использовании с различными языками программирования. Эта СУБД поддерживает множество драйверов, таких как: php, python, ruby и т.д, что позволяет разработчикам взаимодействовать с базой данных, используя наиболее знакомый язык программирования.

Ниже описан процесс настройки и установки RethinkDB на Ubuntu 16. Взаимодействие с этой СУБД будет производится с помощью драйвера на Python.

Есть два компонента, которые должны быть установлены, чтобы получить полную отдачу от архитектуры RethinkDB. Первый - это сама СУБД. Второй - драйвер клиента, который предоставляет поддержку доступа к серверу БД с помощью выбранного языка программирования.

Установка RethinkDB

Чтобы установить сервер, вы должны добавить репозиторий RethinkDB в свой список репозиториев и установить через apt-get . Для этого вставьте следующие строки в терминал: [Источник 6]

source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME  main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list 
wget -qO- https://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add - 

Чтобы добавить PPA (личный архив пакетов) Ubuntu, мы должны сначала установить python пакет python-software-properties, который включает в себя команды, которые нам необходимы для установки базы.

Обновим индекс пакетов и затем установим PPA:

sudo apt-get update
sudo apt-get install python-software-properties

Сейчас у нас есть установленный пакет python-software-properties, теперь мы можем добавить PPA проекта RethinkDB. Введите следующую команду, чтобы добавить этот репозиторий в вашей системе:

sudo add-apt-repository ppa:rethinkdb/ppa

Теперь, мы должны обновить индекс пакетов в системе, для сбора информации о новых пакетах. После этого, мы можем установить RethinkDB:

sudo apt-get update
sudo apt-get install rethinkdb

Теперь нужно настроить один экземпляр базы (инстанс) и перезапустить ёё.

sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/instance1.conf
sudo /etc/init.d/rethinkdb restart

Установка драйвера клиента

После выполнения вышеописанных действий, необходимо установить драйвер клиента. Клиентские драйвера есть почти для каждого языка программирования. Официально поддерживаемые языки JavaScript, Ruby и Python. Сообщество также добавило поддержку многих других языков, включая C, Clojure, Lisp, Erlang, Go, Haskell, Java, Perl, PHP, Scala и другие.

Установим драйвер Python-клиента с помощью pip. Чтобы соответствовать рекомендациям при работе с программным обеспечением в Python мы будем использовать virtualenv, чтобы изолировать среду Python. При установке virtualenv, pip будет установлен автоматически.

sudo apt-get install python-virtualenv

Итак, мы имеем установленный virtualenv и pip, теперь мы можем создать каталог в нашей домашней директории для установки виртуального окружения:

cd ~
mkdir rethink

Перейдите в этот каталог и затем используйте команду virtualenv для создания новой виртуальной среды:

cd rethink
virtualenv venv

Мы можем активировать среду, введя команду:

source venv/bin/activate

Это позволит нам устанавливать компоненты в изолированной среде. Если нужно покинуть виртуальную среду, введите:

deactivate

Итак, сейчас имеется включённая виртуальная среда, теперь можно установить пакет RethinkDB, для этого необходимо ввести:

pip install rethinkdb

Python клиент установлен и готов к использованию.

Web интерфейс RethinkDB

Если мы посетим IP адрес сервера http://localhost:8080, на порту: 8080, то увидим веб-интерфейс RethinkDB:

Web интерфейс RethinkDB[Источник 7]

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

Также видно некоторую статистику о базе данных. Возле синих иконок есть информация о названии базы данных и информация о текущих найденных неполадках (issues).

Кроме того, можно видеть, что RethinkDB имеет собственное управление серверами и центрами обработки данных. Ещё одна особенность этой базы - лёгкое масштабирование.

Если нажать на "Tables", расположенную в верхней части страницы, то можно увидеть, какие базы и таблицы были созданы на данный момент:

Вкладка Tables[Источник 8]

Здесь можно видеть все базы данных, которые есть на сервере. Для каждой базы можно просмотреть список таблиц. В обзоре, также говорится нам о шардинге и репликации, которые были настроены для каждого компонента. Имеется возможность добавлять базы данных и таблицы прямо с этой страницы.

Если нажать на вкладку Servers, то можно увидеть список серверов СУБД:

Вкладка Servers[Источник 9]

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

Если ввести запрос или команду, то можно увидеть результаты ниже. Можно просматривать информацию в различных форматах, а также сделать профилирование запроса:

Вкладка Data Explorer[Источник 10]

Взаимодействие с помощью Python

Для начала взаимодействия запустим интерпретатор Python:

python

Отсюда, необходимо импортировать драйвер клиента в окружающую среду:

import rethinkdb as r

Теперь можно соединиться с локальной базой данных с помощью команды connect:

r.connect("localhost", 28015).repl()

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

Создадим базу, выполнив команду:

r.db_create("food").run()

Теперь мы имеем базу данных под названием "food". Команда .run() находится в конце. RethinkDB команды выглядят как обычный код, но на самом деле они трансформируются клиентским драйвером RethinkDB в машинный код базы данных и выполняются удаленно на сервере. Команда run отправляет все это на сервер.

Создадим таблицу:

r.db("food").table_create("favorites").run()

Затем мы можем добавить некоторые данные в таблицу. RethinkDB использует гибкую структуру для документов, так что можно добавить любые виды пары ключ/значение.

Добавим некоторых людей и их любимые продукты:

r.db("food").table("favorites").insert([
  { "person": "Randy", "Age": 26,
    "fav_food": [
      "banana",
      "cereal",
      "spaghetti"
    ]
  },
  { "person": "Thomas", "Age": 8,
    "fav_food": [
      "cookies",
      "apples",
      "cake",
      "sandwiches"
    ]
  },
  { "person": "Martha", "Age": 52,
    "fav_food": [
      "grapes",
      "pie",
      "avocado"
    ]
  }
]).run()

Это позволит создать три JSON документа в нашей таблице "favorites" . Каждый объект определяет человека, возраст, и его любимую еду.

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

Каждой из тех записей, добавленных в таблицу "favorites" был присвоен идентификационный номер. Это делается автоматически и используется для индексации содержимого каждой таблицы. Можно распечатать документы с помощью запроса. Например, мы можем вывести всех людей, у которых более трех любимых блюд:

c = r.db("food").table("favorites").filter(r.row["fav_food"].count() > 3).run()
for x in c:
    print x

Установка и пример работы с RethinkDB

Заключение

В ходе данной работы были рассмотрены основные особенности базы данных RethinkDB, а также была произведена ее установка на ОС Ubuntu 16. Был продемонстрирован процесс создания простой базы данных с помощью CLI RethinkDB и взаимодействие с Web-интерфейсом программы.

На основе проделанной работы можно сделать вывод о том, что RethinkDB имеет удобный интерфейс, а процесс установки и взаимодействия с базой данных покажется простым даже для неопытного пользователя. Кроме того, драйвера RethinkDB интегрируют язык ReQL в тот язык программирования, на котором ведется разработка приложения, что является несомненным преимуществом данной БД. Вместо постоянного запрашивания новых данных, база данных сама отправляет вам последние изменения, что делает ее удобной для работы с клиентами, поддерживающими постоянное соединение с серверной частью.

Ссылки

Источники

  1. Официальный сайт RethinkDB. [2017—2017]. Дата обращения: 17.01.2018. Режим доступа: http://rethinkdb.com.
  2. RethinkDB [Электронный ресурс] — Дата обращения: 30.04.2018. Режим доступа: https://ru.wikipedia.org/wiki/RethinkDB.
  3. Установка и настройка NoSQL субд RethinkDB [Электронный ресурс] — Дата обращения: 30.04.2018. Режим доступа: http://devacademy.ru/posts/ustanovka-i-nastrojka-nosql-subd-rethinkdb/
  4. RethinkDB. Sharding and replication[Электронный ресурс] — Дата обращения: 30.04.2018. Режим доступа: https://rethinkdb.com/docs/architecture/.
  5. Строим real-time веб-приложения с RethinkDB [Электронный ресурс] — Дата обращения: 30.04.2018. Режим доступа: https://habr.com/post/266085/.
  6. Install RethinkDB on Ubuntu[Электронный ресурс] — Дата обращения: 05.05.2018. Режим доступа: https://rethinkdb.com/docs/install/ubuntu/.
  7. Веб-интерфейс RethinkDB [Электронный ресурс] — Дата обращения: 13.05.2018. Режим доступа: http://devacademy.ru/media/files/2014/08/19/rethink_db_main_2.png
  8. Веб-интерфейс RethinkDB. Вкладка "Tables" [Электронный ресурс] — Дата обращения: 13.05.2018. Режим доступа: http://devacademy.ru/media/files/2014/09/24/rethink_db_and_tables.png
  9. Веб-интерфейс RethinkDB. Вкладка "Servers" [Электронный ресурс] — Дата обращения: 13.05.2018. Режим доступа: http://devacademy.ru/media/files/2014/08/19/rethinkdb_servers.png
  10. Веб-интерфейс RethinkDB. Вкладка "Data Explorer" [Электронный ресурс] — Дата обращения: 13.05.2018. Режим доступа: http://devacademy.ru/media/files/2014/09/24/rethinkdb_data_explorer_profile.png