Kyoto Tycoon

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:26, 30 января 2019.
Kyoto Tycoon
Kyoto tycoon logo 1.png
logo 1
Kyoto tycoon logo 2.png
logo 2
Разработчики: FAL Labs
Выпущена: 25 December 2009 года; 10 years ago (2009-12-25)
Постоянный выпуск: 0.9.56[1] / 10 April 2017 года; 3 years ago (2017-04-10)
Состояние разработки: Active
Написана на: C++ (язык программирования)[2]
Операционная система: Linux, UNIX-подобные ОС BSD, CentOS
Локализация: Japanese, English
Тип ПО: Сервер Базы данных
Лицензия: GNU General Public License, Free software
Веб-сайт fallabs.com/kyototycoon/

Kyoto Tycoon (Киотский Магнат) - это легкий сервер базы данных с механизмом автоматического истечения срока действия, оптимальный для обработки данных кеша и постоянных данных различных приложений. Разработан компанией FAL Labs, нынешняя разработка ведется другой компанией - Altice Labs. Kyoto Tycoon также представляет собой пакет сетевого интерфейса для DBM (DataBase Manager), который называется Kyoto Cabinet[3]. Хотя DBM имеет высокую производительность и высокий уровень параллелизма, Вы можете захотеть, чтобы несколько процессов не использовали одну и ту же базу данных, или чтобы удаленные процессы не обращались к базе данных. Продукт позволяет это сделать. Kyoto Tycoon предоставляет API для удаленного подключения к Kyoto Cabinet. "Магнат" состоит из сервера, управляющего несколькими базами данных и его библиотеки доступа для клиентских приложений.

Между сервером и клиентами используется протокол HTTP, что позволяет писать клиентские приложения и клиентские библиотеки практически на всех популярных языках. Сервер может обрабатывать более 10 тысяч запросов одновременно, поскольку он использует современные средства уведомления о событиях ввода-вывода, такие как "epoll" и "kqueue" базовых систем. Сервер поддерживает механизмы высокой доступности, которые представляют собой горячее резервное копирование[4], ведение журнала обновлений и асинхронную репликацию[5]. Сервер поддерживает Lua, - легкий язык сценариев, для удобства определения произвольных операций базы данных.

Серверная программа Kyoto Tycoon написана на языке C++. Он доступен на платформах, которые имеют API, соответствующий C++ 03, с расширениями библиотеки TR1. Kyoto Tycoon - это бесплатное программное обеспечение, лицензированное по лицензии GNU General Public License. Возможно также написание клиентских приложений, которые не контролируются лицензией, посредством простого общения приложения с сервером по HTTP без использования основной библиотеки.[Источник 1]

Обзор

Ключевые особенности[Источник 2] Kyoto Tycoon (см. рисунок 1):

Рисунок 1 – Компоненты Kyoto Tycoon

Кеш-сервер на основе Kyoto Cabinet

Рисунок 2 – Архитектура Kyoto Tycoon

Автоматическое завершение работы

  • "Срок годности" может быть задан для каждой записи - записи удаляются неявно после истечения срока действия
  • "GC-курсор"[6] постепенно устраняет области с истекшим сроком действия

Высокая производительность

  • Может обрабатывать более 10 тысяч подключений одновременно с помощью epoll / kqueue
  • 1000000 запросов выполняется за 25 секунд (40 000 запросов/сек или более)

Высокая доступность

Протокол на базе HTTP

  • Доступность на большинстве популярных языков
  • Предоставляет библиотеку доступа для инкапсуляции протокола
  • Поддерживает массовые операции также и в эффективном бинарном протоколе
  • Поддерживает "подключаемый сервер" и общение с Kyoto Tycoon по memcached-like протоколу

Различные схемы базы данных

  • Использование API полиморфной базы данных Kyoto Cabinet
  • Доступны почти все операции Kyoto Cabinet
  • Поддерживает "подключаемую базу данных"

Рисунок 3 – Расширение для Lua

Расширение скриптов

  • Поддержка функций Lua для определения произвольных операций - (см. рисунок 3)
  • Поддерживает курсоры и транзакции

Библиотека сетевых утилит

  • Абстракция сокета, уведомления о событиях и пул потоков
  • Структуры TCP-сервера, HTTP-сервера и сервера RPC

Абстракция системно-зависимых механизмов

  • Инкапсуляция потоковых механизмов
- thread, mutex, rwlock, spinlock, condition variable, TLS, и atomic integer
- Очередь задач с пулом потоков
  • Инкапсулированы сокет Berkeley и сокет Win32[7]
- Клиентский сокет, серверный сокет и распознаватель имен
  • Инкапсулированы уведомления о событиях
- epoll в Linux, kqueue на BSD, select на других POSIX и Win32
- Заменители для libevent или libev

TSV-RPC (удаленный вызов таблиц БД)

  • Легкая замена для XML-RPC
  • Входные и выходные данные являются ассоциативными массивами строк
- Сериализован в виде табулированных значений

Интерфейс RESTful

- GET как db::get, PUT как db::set, DELETE как db::remove

Установка

(На последних версиях компиляторов gcc установить не получается)

Kyoto Tycoon поддерживается в UNIX-подобных системах (Linux 2.6, Mac OS X 10.5 и более поздние версии). В настоящее время разработка для других платформ, включая Windows, продолжается. Для установки с исходным пакетом также необходимы GCC (сборник компиляторов GNU) 4.2 или новее и make (GNU Make). Они устанавливаются по умолчанию на Linux, FreeBSD и т. д.

Поскольку Kyoto Tycoon зависит от следующих библиотек, установите их заранее.

- ZLIB: для сжатия данных без потерь. 1.2.3 или новее.
- Kyoto Cabinet: легкая библиотека баз данных. 1.2.42 или новее.

Для начала заходим сюда и переходим по ссылке "Source Packages of the core library (C/C++)" в пункте "Packages" (см. рисунок 4).

Рисунок 4 – Фрагмент сайта FAL Labs - Kyoto Tycoon

Выбираем "kyototycoon-0.9.56.tar.gz" и после загрузки архива на компьютер извлекаем его в удобную директорию(см. рисунок 5).

Рисунок 5 – Фрагмент сайта FAL Labs - Index of /kyototycoon/pkg

Когда архив Kyoto Tycoon успешно извлечен, заменяем текущий рабочий каталог на сгенерированный каталог и выполняем установку в него. Далее следует запуск сценария конфигурации.

 $./configure

Построение программы, проверка построения и сама установка (от имени рута):

$ make
$ make check
$ make install 

Когда установка закончится, установятся следующий файлы:

/usr/local/include/ktcommon.h
/usr/local/include/ktutil.h
/usr/local/include/ktsocket.h
/usr/local/include/ktthserv.h
/usr/local/include/kthttp.h
/usr/local/include/ktrpc.h
/usr/local/include/ktulog.h
/usr/local/include/ktshlib.h
/usr/local/include/kttimeddb.h
/usr/local/include/ktremotedb.h
/usr/local/include/ktplugserv.h
/usr/local/include/ktplugdb.h
/usr/local/lib/libkyototycoon.a
/usr/local/lib/libkyototycoon.so.x.y.z
/usr/local/lib/libkyototycoon.so.x
/usr/local/lib/libkyototycoon.so
/usr/local/lib/pkgconfig/kyototycoon.pc
/usr/local/libexec/ktplugservmemc.so
/usr/local/libexec/ktplugdbvoid.so
/usr/local/bin/ktutiltest
/usr/local/bin/ktutilmgr
/usr/local/bin/ktutilserv
/usr/local/bin/kttimedtest
/usr/local/bin/kttimedmgr
/usr/local/bin/ktserver
/usr/local/bin/ktremotetest
/usr/local/bin/ktremotemgr
/usr/local/man/man1/...
/usr/local/share/doc/kyototycoon/...

Следующие параметры сервера могут быть указаны с помощью ./configure.

--enable-debug: построение для отладки. Включить отладочные символы, не выполнять оптимизацию, выполнять статическую линковку.
--enable-devel: построить для разработки. Включить отладочные символы, выполнить оптимизацию, выполнить динамическую линковку.
--enable-profile: построить для профилирования. Включить профильные символы, выполнить оптимизацию и выполнить динамическую линковку.
--enable-static: строить статической линковкой.
--disable-shared: избегать билда общих библиотек.
--disable-event: избегать использования системных уведомлений о событиях.
--enable-lua: включить расширение Lua-скриптов.
--prefix и другие параметры также доступны, как и в обычных пакетах программного обеспечения UNIX. Если вы хотите установить Kyoto Tycoon в / usr, а не / usr / local, укажите --prefix = / usr . Кроме того, путь поиска библиотеки не включает / usr / local / lib, для этого необходимо установить переменную окружения LD_LIBRARY_PATH для включения / usr / local / lib перед запуском приложений Kyoto Tycoon.

Как использовать библиотеки

Kyoto Tycoon предоставляет API языка C ++ и доступен по программам, соответствующим стандарту C++ 03. Поскольку заголовочные файлы Kyoto Tycoon предоставляются как "ktutil.h", "ktremotedb.h" и т. д., приложения должны включать один или несколько из них, соответственно, для использования API. Поскольку библиотека предоставляется как "libkyototycoon.a" и "libkyototycoon.so", и они зависят от базовых системных библиотек, для команды сборки требуются соответствующие команды линковщика. Команда сборки выглядит следующим образом:

$ g ++ -I / usr / local / include example.cc -o example \
   -L / usr / local / lib -lkyototycoon -lkyotocabinet -lz -lstdc ++ \
   -lresolv -lnsl -ldl -lrt -lpthread -lm -lc

Если вы используете не основную библиотеку C ++, а HTTP-библиотеку на другом языке, Вам не нужны вышеуказанные правила. [Источник 3]

Руководство пользователя

Запуск

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

$ ktserver
2010-10-03T16:24:38.467252+09:00: [SYSTEM]: ================ [START]: pid=19069
2010-10-03T16:24:38.467473+09:00: [SYSTEM]: opening a database: path=:
2010-10-03T16:24:38.467645+09:00: [SYSTEM]: starting the server: expr=:1978
2010-10-03T16:24:38.467751+09:00: [SYSTEM]: server socket opened: expr=:1978 timeout=30.0
2010-10-03T16:24:38.467775+09:00: [SYSTEM]: listening server socket started: fd=3

Команда ktserver запускает сетевую услугу, принимающую команды от клиентов на локальных или удаленных машинах. По умолчанию, безымянная база данных в памяти открывается и управляется сервером через порт 1978. Чтобы отключить сервер, введите Ctrl-C в терминал или отправьте SIGINT или SIGTERM из другого терминала.

Вставим некоторые записи в базу данных. Выполните следующую команду на другом терминале. Соответствующие журналы доступа будут показываться в терминале сервера.

 $ktremotemgr set japan tokyo
 $ktremotemgr set korea seoul
$ktremotemgr set china beijing

Команда ktremotemgr - это набор инструментов для управления базой данных в качестве клиента. Подкомандой set устанавливается запись. Первый аргумент рядом с именем подкоманды является ключом записи, а второй аргумент - значением записи.

Извлечем записи с помощью ключа, используя подкоманду get.

$ ktremotemgr get japan
 tokyo
$ ktremotemgr get korea
 seoul
$ ktremotemgr get china
 beijing

Удалим запись по ключу, используя подменю remove.

$ ktremotemgr remove japan

Выведем ключи всех записей, используя подменю список.

$  ktremotemgr list
 korea
 china

Использование HTTP-клиента

Поскольку каждая операция базы данных вызывается через HTTP, вы можете использовать любую утилиту HTTP-клиент, такую как "Curl" для управления базой данных.

# запись данных
$ curl "http://localhost:1978/rpc/set?key=japan&value=tokyo"

# извлечение данных
$ curl "http://localhost:1978/rpc/get?key=japan"
value tokyo

# удаление данных
$ curl "http://localhost:1978/rpc/remove?key=japan"

Интерфейс стиля RESTful также поддерживается в дополнение к вышеупомянутому интерфейсу в стиле RPC.

# запись данных
$  echo -n tokyo | curl -X PUT -T - "http://localhost:1978/japan"

# извлечение данных
$  curl "http://localhost:1978/japan"
 tokyo

# удаление данных
$  curl -X DELETE "http://localhost:1978/japan"

Конечно, Вы можете использовать свои любимые языки и библиотеки сценариев для более сложных случаев использования. Поскольку Kyoto Tycoon поддерживает механизм подключения "keep-alive", настоятельно рекомендуется использовать библиотеки, поддерживающие "keep-alive", для повышения производительности.

Мониторинг сигналов и обновлений

Каждый вызов RPC[8] может дождаться сигнала перед его работой и может отправить сигнал после его работы (см. рисунок 6). Каждый сигнал привязан к именованной условной переменной. Если Вы хотите получить новое значение записи «привет» сразу после отправки сигнала «hello», выполните следующую команду:

$ ktremotemgr get -swname hello -swtime 60 hello

Если вы хотите обновить запись «hello», а затем отправить сигнал «hello», выполните следующую команду:

$ ktremotemgr set -ssname hello -ssbrd hello world

Рисунок 6 – Мониторинг обновления по сигналу

Механизм сигнала полезен для реализации очереди заданий. В этом случае вы должны выбрать одну из баз данных на B+ деревьях в качестве хранилища и сохранить данные задания, ключи которых являются отметками времени, чтобы записи всегда сортировались в соответствии с временными отметками. Исполнители задач должны хранить данные задачи и посылать сигнал для каждой операции. Каждая задача ожидает сигнал, а затем извлекает первую запись в очереди (см. рисунок 7). Если Вам нужна одна очередь на сервере, используйте пустую строку в качестве имени сигнала. Если вы хотите, чтобы на сервере было множество очередей, откройте множество баз данных в соответствии с очередями и используйте разные имена сигналов, чтобы различать типы задач.

Рисунок 7 – Устройство потокового TCP-сервера

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

Асинхронное копирование

Даже если используется горячее резервное копирование и устанавливаются все обновления, все данные могут быть потеряны, если устройство хранения или сам компьютер сломался. Для преодоления такой критической ситуации поддерживается репликация данных. Это механизм синхронизации двух или нескольких серверов баз данных для обеспечения высокой доступности и высокой целостности. Исходный сервер репликации называется "ведущим" - master, и каждый целевой сервер называется "подчиненным" - slave (см. рисунок 8). Для репликации требуются условия:

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

Рисунок 8 – Асинхронное копирование

Подключаемые модули

Рисунок 9 – Подключаемые модули

Если вам нужны другие протоколы, кроме HTTP, механизм "Подключаемый сервер" (см. рисунок 9) может вам помочь. Сервер загружает общую библиотеку, которая задействует произвольные сетевые службы и управляет объектами базы данных, совместно используемыми основным сервером. Разделяемая библиотека "ktplugservmemc.so", установленная в разделе / usr / local / libexec, реализует протокол memcached.

Наиболее важным преимуществом подключаемого серверного механизма является совместное использование объектов базы данных с основным сервером. Операции обновления с помощью подключаемого сервера немедленно отражаются на главном сервере и наоборот. Более того, операции обновления записываются в журнал как логи обновлений и собираются slave-серверами репликации. Можно даже реализовать свой собственный подключаемый сервер.

Если Вам нужны другие реализации баз данных, кроме Kyoto Cabinet, полезен механизм "подключаемой базы данных". Сервер может загружать общую библиотеку, которая запускает службы произвольного хранения, соответствующие интерфейсу ассоциативного массива. Общая библиотека "ktplugdbvoid.so", установленная в разделе / usr / local / libexec, реализует механизм "void database", который похож на "blackhole storage engine" в MySQL. Это так называемая база данных "no-op" не выполняющая ничего, кроме занесения записей логов в сетевые журналы.

Наиболее важным преимуществом механизма подключаемых баз данных является предоставление сетевых функций другим библиотекам баз данных в формате DBM, таким как BerkeleyDB[9] и GDBM[10]. Предусмотрена реализация для пользователя своей собственной подключаемой базы данных. [Источник 4]

Особенности архитектуры

Использование MapReduce

В Kyoto Tycoon поддерживается вычислительная модель MapReduce (см. рисунок 10). Сама функция выглядит так: db: mapreduce (map, reduce, tmppath, opts, dbnum, clim, cbnum, log, proc) (выполняет процесс MapReduce), где параметры:

  • map: функция для отображения данных записи. Он вызывается для каждой записи в базе данных и получает ключ, значение и функцию для извлечения сопоставленных записей. Функция эмиттера получает ключ и значение. Функция должна возвращать true или false.
  • reduce: функция для уменьшения данных записи. Он вызывается для каждой записи, сгенерированной исходящими записями, функцией map и получает ключ и функцию для итерации, чтобы получить каждое значение. Функция должна возвращать true или false.
  • tmppath: путь к каталогу для временного хранения данных. Если параметр опускается, временные данные обрабатываются в памяти.
  • opts: дополнительные функции для поразрядным или: DB.XNOLOCK, чтобы избежать блокировки операций обновления другими потоками, DB.XNOCOMP, чтобы избежать сжатия временных баз данных.
  • dbnum: количество временных баз данных. Если параметр не задан, задается настройка по умолчанию.
  • clim: максимальный размер внутреннего кеша. Если параметр опускается, задается настройка по умолчанию.
  • cbnum: номер ведра внутреннего кеша. Если параметр не задан, задается настройка по умолчанию.
  • log: функция для регистрации каждого сообщения о каком-либо действии. Если параметр опускается, сообщения журнала игнорируются.
  • proc: функция, вызываемая перед "map", между "map" и "reduce", а также после "reduce". В первых двух вызовах функция получает функцию для извлечения сопоставленных с помощью map записей. Если параметр опущен, такие триггеры игнорируются.

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

Рисунок 10 – MapReduce в Lua

RESTful интерфейс

Хотя имя процедуры описано в URL-адресе в вышеупомянутом интерфейсе в стиле RPC, оно определяется с помощью таких методов, как GET, HEAD, PUT, DELETE в интерфейсе стиля RESTful. Объектная запись описана в URL-адресе. Поскольку многие пользователи предпочитают интерфейс RESTful стилю RPC, Kyoto Tycoon поддерживает оба.

Бинарный протокол

Для достижения максимальной производительности поддерживаются несколько команд в эффективном бинарном протоколе. Поскольку они доступны в том же порту, что и другие HTTP-команды, они могут быть идентифицированы с помощью первого байта каждого запроса. Каждое числовое значение выражается в порядке big-endian. Если на сервере возникла некоторая ошибка, будет выдана на выход строка 0xBF без какой-либо другой информации.[Источник 5]

Сравнение

Сравнение с Tokyo Tyrant

Плюсы:
  • Использование Kyoto Cabinet
- Наследует все плюсы Kyoto Cabinet против Tokyo Cabinet
  • Автоматическое отключение
- Легкий в использовании в качестве сервера кеша
  • Несколько баз данных
- Один сервер может управлять несколькими экземплярами базы данных
- Сервер базы данных на сервере TSV-RPC на HTTP-сервере на TCP-сервере
- Простота в реализации клиентских библиотек
  • Портативность: поддержка non- POSIX платформ
- Поддержка Win32 (work-in-progress)
Минусы:
  • Функции, от которых отказались: база данных фиксированной длины, таблицы базы данных

Сравнение с MemcacheDB

Характеристики сервера для теста — Opteron-2218, 2.6GHz, 8G ОП, HDD 73G+143G sas. На 73-Гбайтном диске лежит файл с импортируемыми данными, а на 143-Гбайтном - базы MemcacheDB и Kyoto Tycoon. Исходные данные — 10226086 записи, суммарным объемом (ключ+значение) 1.4Гбайт.

Результаты:[Источник 6]
1. Импорт данных:

- Kyoto Tycoon — 18 мин 52 сек.
- MemcacheDB — 32 мин 39 сек.

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

- Kyoto Tycoon — 9 мин 46 сек.
- MemcacheDB — 19 мин 35 сек.

3. "Наперегонки" (одновременно запускаются оба скрипта импорта данных):

- Kyoto Tycoon — 1 час.
- MemcacheDB — 1 час 38 мин.

К моменту финиша Tycoon в MemcacheDB была загружена треть от общего количества записей. Возможно, MemcacheDB показала такой результат из-за большего числа пользователей, следовательно большей нагрузки на сервер. 4. Размер файлов данных:

- Kyoto Tycoon — 2.15G. (на следующий день размер снизился до 1.87G без потери данных, возможно, освободив пустые блоки).
- MemcacheDB — 4.56G.

5. Размер занимаемой оперативной памяти:

- Kyoto Tycoon — 2.45G. (честно занял сколько потребовалось, плюс память под код и операции)
- MemcacheDB — 208Mb.

Выигрыш по скорости и размеру БД на диске у Kyoto Tycoon достаточно ощутима, но по использованию памяти - проигрыш.

Источники

  1. Kyoto Tycoon: a handy cache/storage server // FAL Labs [2010-2018]. Дата обновления: 09.10.2018. URL: https://fallabs.com/kyototycoon/ (дата обращения: 09.10.2018)
  2. Introduction to Kyoto Products // FAL Labs [2010-2018]. Дата обновления: 09.10.2018. URL: http://fallabs.com/kyotocabinet/kyotoproducts.pdf (дата обращения: 09.10.2018)
  3. Fundamental Specifications of Kyoto Tycoon Version 1: Installation // AlticeLabs [2018-2018]. Дата обновления: 10.10.2018. URL: http://alticelabs.github.io/kyoto/kyototycoon/doc/spex.html#installation (дата обращения: 10.10.2018)
  4. Fundamental Specifications of Kyoto Tycoon Version 1: Tips and hacks // AlticeLabs [2018-2018]. Дата обновления: 10.10.2018. URL: http://alticelabs.github.io/kyoto/kyototycoon/doc/spex.html#tips (дата обращения: 10.10.2018)
  5. Fundamental Specifications of Kyoto Tycoon Version 1: Protocol // AlticeLabs [2018-2018]. Дата обновления: 11.10.2018. URL: http://alticelabs.github.io/kyoto/kyototycoon/doc/spex.html#protocol (дата обращения: 11.10.2018)
  6. MemcacheDB против Kyoto Tycoon — экспресс тестирование // Habr [2001-2018]. Дата обновления: 10.10.2018. URL: https://habr.com/post/112253/ (дата обращения: 10.10.2018)

Примечания

  1. FAL Labs [Электронный ресурс]: Индекс kyototycoon/pkg / Дата обращения: 08.10.2018. Режим доступа: http://fallabs.com/kyototycoon/pkg/
  2. FAL Labs [Электронный ресурс]: Kyoto Tycoon: a handy cache/storage server / Дата обращения: 08.10.2018. Режим доступа: http://fallabs.com/kyototycoon/
  3. Altice Labs [Электронный ресурс]: Kyoto Cabinet: простая реализация DBM / Дата обращения: 08.10.2018. Режим доступа: http://alticelabs.github.io/kyoto/kyotocabinet/doc/
  4. Habr [Электронный ресурс]: Box Backup – горячие резервные копии / Дата обращения: 08.10.2018. Режим доступа: https://habr.com/post/8156/
  5. Wiki Microinvest [Электронный ресурс]: Репликация данных / Дата обращения: 08.10.2018. Режим доступа: https://wiki.microinvest.su/index.php?title=Репликация_данных
  6. Academic [Электронный ресурс]: Курсор (базы данных) / Дата обращения: 09.10.2018. Режим доступа: https://dic.academic.ru/dic.nsf/ruwiki/254278
  7. Academic [Электронный ресурс]: Win32 / Дата обращения: 10.10.2018. Режим доступа: https://dic.academic.ru/dic.nsf/ruwiki/754765
  8. Beefchunk [Электронный ресурс]: Remote Procedure Calls (RPC) / Дата обращения: 10.10.2018. Режим доступа: http://beefchunk.com/documentation/sys-programming/unix-programming/c_unix/node33.html
  9. Oracle [Электронный ресурс]: Oracle Berkeley DB / Дата обращения: 10.10.2018. Режим доступа: https://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.htm
  10. GNU [Электронный ресурс]: GDBM / Дата обращения: 10.10.2018. Режим доступа: https://www.gnu.org.ua/software/gdbm/