/leveldb-daemon

Primary LanguageC++GNU General Public License v2.0GPL-2.0

Общая информация

Levedb-daemon - сетевой интерфейс для key-value хранилища leveldb, работающий по протоколу JSON-RPC.

Особенности

  • Параллельный доступ
  • Асинхронные операции
  • Поддержка репликации
  • Пакетные изменения

Методы работы с хранилищем

  • get(keyList) - получение данных по списку ключей
  • set(key2valueList) - запись данных по списку ключей
  • del(keyList) - удаление по списку ключей
  • inc_add(incrementList, defaultList) - инкремент со значением по умолчанию
  • inc(incrementList) - инкремент
  • update_packed({key: string, inc: key2intList, set: key2valueList, def: key2valueList}) - обновление json-упакованной структуры
  • get_range(fromKey, toKey, limit, skipCount) - получение диапазона значений
  • rep_status() - статус репликации. Запрос к мастеру.

Установка и настройка

Требования

В Gentoo нужно установить dev-libs/leveldb, dev-cpp/tbb, dev-libs/boost, dev-util/cmake

В Debian: libleveldb-dev, libtbb2, libtbb-dev, libboost-dev, libboost-thread-dev, libboost-program-options-dev, cmake

Установка

git clone git://github.com/mambaru/leveldb-daemon.git
cd leveldb-daemon
make all
./release/leveldb.json --help

API

Примеры кода для общения с демоном смотри в каталоге example проекта

get(keyList)

Параметры:

  • список ключей

Возвращает ассоциативный массив ключ => значение.

set(key2valueList)

Параметры:

  • ассоциативный массив ключ => значение

Возвращает true/false в случае успеха/ошибки.

del(keyList)

Параметры:

  • список ключей

Возвращает ассоциативный массив ключ => true/false.

inc(incrementList)

Параметры:

  • ассоциативный массив ключ => целое значение для инкремента

Возвращает ассоциативный массив ключ => значение с обновленными после инкремента данными.

inc_add(incrementList, defaultList)

Параметры:

  • inc - ассоциативный массив ключ => целое значение для инкремента
  • def - ассоциативный массив ключ => целое значение. Эти значения используются в качестве стартовых. Если ключ не указан в def, инкремент начинается с нуля.

Возвращает ассоциативный массив ключ => значение с обновленными после инкремента данными.

update_packed({key: string, inc: key2intList, set: key2valueList, def: key2valueList})

Функция используется для атомарного обновления json сериализованной структуры. Часто возникает необходимость одновременного обновления данных в нескольких связанных элементах данных. Если для хранения каждого элемента данных использовать отдельный ключ, это приводит к необходимости выполнения множественных запросов для одного пакета обновлений.

Допустим есть 1 000 000 записей о счетчиках сообщений в 10 папках каждого пользователя.

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

Если для одного пользователя использовать структуру хранящую все его счетчика, данные будут расположены более компактно. Запросы обновления будут затрагивать одну запись в БД за раз.

Параметры:

  • key - ключ обновляемой структуры
  • inc - ассоциативный массив ключ => целое значение для инкремента полей структуры
  • set - ассоциативный массив ключ => значение для установки полей структуры
  • def - ассоциативный массив ключ => целое значение. Эти значения используются в качестве базовых для операции инкремента полей.

Возвращает ассоциативный массив с обновленной структурой или false в случае ошибки.

get_range(fromKey, toKey, limit, skipCount)

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

Параметры:

  • fromKey - ключ или префикс ключа, с которого начинается диапазон
  • toKey - ключ или префикс ключа, которым заканчивается диапазон. Если пуст, значит выборка продолжается до конца базы.
  • limit - целое положительное значение. Количество ключей для выборки.
  • skipCount - целое положительное значение. Количество ключей, которые необходимо пропустить от начала выборки.

Возвращает ассоциативный массив ключ => значение.

rep_status

Метод без параметров. Возвращает информацию о статусе репликации для всех известных мастеру потоков репликации.

Возвращает ассоциативный массив replication.id => ассоциативный массив с описанием статуса потока репликации.

Репликация

Чтобы реплицировать данные необходимо:

Мастер

  • Указать порт для подключения слейвов (параметр запуска --rport)

Слейв

  • Указать хост мастера (параметр запуска --replication.host)
  • Указать порт мастера для репликации (параметр запуска --replication.port). Равен --rport у мастера.
  • Указать уникальный идентификатор этого потока репликации (параметр запуска --replication.id). Текст [a-zA-Z_0-9]+. Один мастер может быть источником данных для нескольких слейвов.

Логирование ошибок

При запуске можно указать параметр --log_file={filename}, чтобы получить больше информации, почему что-то не работает.

Лицензия

Программа-демон разработана в компании "Мамба" и распространяется по лицензии GNU GPL ver. 2. Разработчик - Илья Шаповалов. В демоне используются следующие библиотеки:

  • levelDb - New BSD License. (c) Google
  • faslib - GPL2. (c) Владимир Мигашко, компания "Мамба"
  • intel tbb - GPL2. (c) Intel
  • boost - Boost License.