Общая информация
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() - статус репликации. Запрос к мастеру.
Установка и настройка
Требования
- LevelDb 1.7+
- Intel Threading Building Blocks
- GCC 4.5+
- Boost
- CMake
В 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. Разработчик - Илья Шаповалов. В демоне используются следующие библиотеки: