Главная > Блог > Kyoto Tycoon - ещё одно хранилище типа «ключ-значение».

Kyoto Tycoon - ещё одно хранилище типа «ключ-значение».

1. Описание

Kyoto Tycoon - ещё один сервер, реализующий хранилище «ключ-значение». В отличие от Memcached данные хранит на диске (альтернатива Memcachedb). Высокопроизводительный и не требует много ресурсов для работы. Может обрабатывать запросы по протоколу Memcached.

Подробно:

Kyoto Tycoon (киотский магнат) - сервер, реализующий хранилище «ключ-значение». Отлично подходит для хранения кэша, т.к. обладает возможность указывать время хранения ключа. Сервер создавался таким образом чтобы иметь производительность DBM (реализовано с помощью Kyoto Cabinet), но при этом была возможность обрабатывать несколько подключений одновременно.

Kyoto Tycoon поддерживает взаимодействие через свой бинарный протокол, протокол HTTP, а также по протоколу Memcached (ограниченный набор команд). Сервер может одновременно работать с 10 000 соединениями, т.к. обработка соединений происходит через методы «epoll» и «kqueue». Сервер поддерживает «горячее резервное копирование» - возможность сделать резервные копии данных без остановки сервера при копировании файлов базы данных. Кроме того, сервер реализует асинхронную репликацию.

В сервер встроена поддержка языка сценария Lua. Если вам недостаточно функций предоставляемые API вы можете на сервере написать свою функцию использую язык Lua.

Kyoto Tycoon написан на С++, под лицензией GNU General Public License.

2. Установка

Установку буду производить на операционную систему Debian 8.2.0 (amd64). Команды указаны под пользователем root.

2.1. Установка через менеджер пакетов

aptitude install kyototycoon

3. Запуск

Создаём пользователя «kt» с группой «kt», под которым будем запускать сервер. И создаём папку «/var/kt», в которой будут хранится файлы для работы «ktserver».

groupadd kt
useradd -g kt -s /usr/sbin/nologin kt
mkdir /var/kt
chown kt:kt /var/kt

Запускаем «ktserver».

sudo -u kt /usr/bin/ktserver -host 127.0.0.1 -port 1978 -log /var/kt/main.log -dmn -pid /var/kt/main.pid -plsv /usr/lib/x86_64-linux-gnu/ktplugservmemc.so -plex 'host=127.0.0.1#port=2010' '/var/kt/main.kch#msiz=32m'

Подробнее:

  • «-host 127.0.0.1 -port 1978» - сервер будет доступен только локально и под портом 1978
  • «-log /var/kt/main.log» - отчёт по работе
  • «-dmn» - Запускаем в фоне
  • «-plsv /usr/lib/x86_64-linux-gnu/ktplugservmemc.so» - плагин для работы по протоколу Memcached.
  • «-plex 'host=127.0.0.1#port=2010'» - сообщаем что сервер будет доступен по протоколу Memcached только локально и по порту 2010.
  • «'/var/kt/main.kch#msiz=32m'» - опции подключения файла с базой данных. Подробнее здесь.

Проверяем, запустился ли.

netstat -l4tpn | grep "ktserver"

tcp        0      0 127.0.0.1:2010          0.0.0.0:*               LISTEN      1545/ktserver
tcp        0      0 127.0.0.1:1978          0.0.0.0:*               LISTEN      1545/ktserver

1978 - порт для собственного протокола, 2010 - порт для Memcached. При указании порта больше 9999 выдаёт ошибку. Жаль что нет возможность указания unix-сокета, как у Memcached опция «-s».

Опции подключения файла базы.

Опции записаны в оригинальном стиле, так что будет не привычно. Каждая опция разделена через символ «#». Например вот так: «/var/kt/main.kch#opts=l#bnum=100000#msiz=32m#dfunit=8». Обязательным параметром является указание полный путь к файлу «/var/kt/main.kch» остальные параметры «#opts=l#bnum=100000#msiz=32m#dfunit=8» являются необязательны. Опции указывают параметры подключения к файлам Kyoto Cabinet.

От суфикса имени файла зависит тип базы:

  • «.kch» - HashDB - данные в файле хранятся в виде хэш таблицы. Типичный DBM.
  • «.kct» - TreeDB - данные в файле хранятся в виде B+ дерева. DBM с сортировкой
  • «.kcd» - DirDB
  • «.kcf» - ForestDB

У каждого типа есть свои плюсы и минусы, но меня заинтересовало именно тип «HashDB» т.к. он самый производительный. Производительность типов в порядке по уменьшению: HashDB > TreeDB > DirDB > ForestDB. Подробнее по типам смотрите здесь и здесь.

Параметр «opts» используют что уменьшить размер БД за счёт небольшого уменьшения производительности:

  • «s» - размер ключа снижен с 6 байт до 4 байт. В результате размер каждой записи уменьшится с 16 до 12 байт, а максимальный размер базы не превысит 16 ГБ.
  • «l» - меняется механизм разрешения коллизий. Размер каждой записи уменьшается с 16 до 10 байт и скорость становится чувствительная от количества записей.
  • «c» - размер каждой записи сжимается если превышает 1 кб.

Можно использовать несколько параметров одновременно, типа «opts=slc». По умолчанию отключен.

Параметр «apow» указывает чему должен быть кратный размер записи (1 = 2 байта, 2 = 4 байта, 3 = 8 байт и т.д.). По умолчанию «3» (8 байт). Если база редко меняется ставим «0», если размер записи в среднем больше 1 Кбайт, ставим «8» или более.

Параметр «fpow» - размер пула свободных блоков (1 = 2 байта, 2 = 4 байта и т.д). По умолчанию «10» (1024 байта). Лучше не трогать.

Параметр «bnum» - размер корзины в хэш-таблицах. Желательно чтобы это число было в 2 или 4 раза больше кол-ву записей. Если меньше то скорость чтения немного снижается. По умолчанию «1048576».

Параметр «msiz» - максимальный размер оперативной памяти, который может использовать сервер. По умолчанию «64MB» (64 МБайт). Для указания гигабайтов и терабайтов указываем суффиксы (GB, TB). Чем больше тем лучше.

Если указан параметр «dfunit», то будет производиться автоматическая дефрагмантация блока. «dfunit=8» означает что дефрагматация будет производиться через каждые 8 операций записи. При включенном «dfunit» скорость записи немного снижается, но экономится место на диске. По умолачанию «dfunit» отключен, но дефрагмантация всё равно происходит, только постепенно не влияя на производительность.

4. Тестирование

Тестировать производительность, я буду на языке PHP через модуль Memcache, Memcached и класс, который поддерживает бинарный протокол. Буду записывать и считывать 100 000 записей. Буду тестировать на VPS (виртуализация через Xen), процессор 2000 МГц, 512 МБайт оперативки, винчестер как написано: сочетание SSD и SATA. Файловая система: ext4. Операционная система Linux Debian 8.2 (amd64), PHP 5.6.14. Запускаю сервер с параметрами как указано здесь.

header("Content-type: text/plain");

$type = ["Memcache", "Memcached", "KyotoTycoon"];
foreach ($type as $v)
{
	echo "Тип: " . $v . "\n";
	
	$obj = "";
	if ($v === "Memcache")
	{
		$obj = new Memcache();
		$obj->connect("127.0.0.1", 2010);
	}
	elseif ($v === "Memcached")
	{
		$obj = new Memcached();
		$obj->addServer("127.0.0.1", 2010);
	}
	elseif ($v === "KyotoTycoon")
	{
		require "KyotoTycoon.php";
		$obj = KyotoTycoon::get_connection("127.0.0.1", 1978);
	}

	$time_start = microtime(true);
	for ($i = 1; $i <= 100000; $i++)
	{
		if ($v !== "KyotoTycoon")
		{
			$obj->set("key_" . $i, "value_" . $i);
		}
		else
		{
			$obj->set("key_" . $i, "value_" . $i, 0);
		}
	}
	$time_end = microtime(true);
	$time = $time_end - $time_start;
	echo "\tСкорость записи: " . $time . "\n"; 

	$time_start = microtime(true);
	for ($i = 1; $i <= 100000; $i++)
	{
		if ($v !== "KyotoTycoon")
		{
			$obj->get("key_" . $i);
		}
		else
		{
			$obj->get("key_" . $i, 0);
		}
	}
	$time_end = microtime(true);
	$time = $time_end - $time_start;
	echo "\tСкорость чтения: " . $time . "\n"; 
}

Результат:

Тип: Memcache
	Скорость записи: 8.7523441314697
	Скорость чтения: 8.0056140422821
Тип: Memcached
	Скорость записи: 7.5840740203857
	Скорость чтения: 7.3908162117004
Тип: KyotoTycoon
	Скорость записи: 9.299565076828
	Скорость чтения: 9.9802069664001

Источник: fallabs.com

kyoto tycoon, kyoto cabinet, memcached, php

Комментарии:

Константин
от
17.06.2016 - 11:39:57
Хорошая альтернатива Memcached!
Комментировать
hharek
от
17.06.2016 - 11:52:45
Верятно вы имели MemcacheDB, KT немного правда проигрывает по скорости, зато много административных команд в консоли.
Комментировать
Роман
от
14.02.2017 - 03:27:34
А в чем же смысл такого кэша, если он медленней, да ещё и крутилок больше? Ладно бы тонкая настройка позволила увеличить производительность. Не понимаю
Комментировать

Добавить комментарий

x

Добавить