Skip to content

Хранилища данных в Node.js: Tokyo Cabinet/Tokyo Tyrant

26/01/2010

Этим постом я начинаю серию о key-value stores, доступных из Node.js. Вообще то первым должен был быть пост о Redis, но т.к. сам Redis недавно обновился до 1.2 а соответствующий модуль для node — ещё не успел, мы начнём с Tokyo Tyrant.

Tokyo Cabinet, Tokyo Tyrant

Вкратце: Tokyo Cabinet — встраиваемое хранилище данных, очень продуманное и быстрое. В отличие от memcached или redis данные могут сбрасываться на диск. Таким образом, убирается ограничение «весь набор данных должен помещаться в RAM». Сам по себе Tokyo Cabinet существует в виде библиотеки и для непосредственного использования в Node малопригоден. Но существует ещё сервер Tokyo Tyrant, который превращает то же хранилище в удобный TCP-процесс со своим протоколом (и поддержкой протокола memcache). Коннектор для Tokyo Tyrant разрабатывается Github-пользователем waveto.

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

Устанавливается эта парочка достаточно просто. Качаем нужные архивы:

wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.42.tar.gz
wget http://1978th.net/tokyotyrant/tokyotyrant-1.1.40.tar.gz

Есть ещё движок полнотекстового поиска Tokyo Dystopia, но его мы разберём как нибудь в другой раз. Распаковываем полученное (я выделил для них отдельную папку):

mkdir ~/tokyo
mv ./tokyocabinet-1.4.42.tar.gz ~/tokyo/
mv ./tokyotyrant-1.1.40.tar.gz ~/tokyo/
cd ~/tokyo
tar -xvzf tokyocabinet-1.4.42.tar.gz
tar -xvzf tokyotyrant-1.1.40.tar.gz

Возможно, когда Вы будете ставить эту связку, версии уже изменятся (работа над ними идёт довольно активно). Для сборки tokyo Cabinet потребуются пакеты libbz2-dev и zlib1g-dev. Если не установить первый, на стадии конфигурации Вы получите сообщение configure: error: bzlib.h is required. Если второй — сообщение будет zlib.h is required. Поэтому поставим оба сразу, чтобы потом к этому не возвращаться:

apt-get install libbz2-dev
apt-get install zlib1g-dev

Вот теперь мы готовы. Сначала нам надо собрать Tokyo Cabinet, потом Tokyo Tyrant:

cd tokyocabinet-1.4.42
./configure
make
make install
make clean

cd ../tokyotyrant-1.1.40
./configure
make
make install
make clean

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

Итак, если всё прошло правильно, сервер Tokyo Tyrant должен быть готов к работе. В той же директории, где мы его собирали, выполняем:

./ttservctl start

Сервер запустится на всех интерфейсах и на порту по умолчанию 1978. Его можно будет увидеть в списке процессов: ps ax.

Подключение и использование коннектора

Скачиваем сам коннектор со страницы загрузок. Если Вы используете последние версии Tokyo Cabinet/Tokyo Tyrant, коннектор тоже должен быть последней стабильной версии. На момент написания статьи я использую v0.1.3. Можно скачать на хост-машину и передать в виртуальную, можно скачать сразу из виртуальной wget’ом. Распаковываем, пробуем запустить:

node demo.js

Если сервер запущен, и для него указан порт по умолчанию, demo.js должен вывести статус сервера. Если подключиться не удастся, скрипт просто молча завершится. Если это произошло, найдите процесс ttserver в выводе ps ax и проверьте параметр -port. Если процесса нет, запустите сервер.

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

var tyrant = require("./tyrant");
tyrant.connect();
tyrant.addListener('connect', function() {
    tyrant.put('value', 'Record number');
    tyrant.get('value').addCallback(function(value) {
        sys.puts('Result '+i+' : '+value);
    });
});

Функция connect() может принимать порт и имя сервера (именно в таком порядке). К сожалению, похоже сейчас не поддерживается расширенный тип записей Tokyo Tyrant — таблицы. Завтра постараюсь прояснить этот вопрос.

UPD: Режимы работы Tokyo Tyrant

Сегодня покопался в документации по Tokyo Cabinet/Tokyo Tyrant по поводу режима таблицы. Оказывается, один сервер TT может обслуживать только одну базу данных, со вполне определённым типом. Если тип не указан, по умолчанию подразумевается In-memory hash (как в Redis). Честно говоря, сейчас это кажется не совсем удобным для повседневного применения, но я всё равно попробую что нибудь с этим написать.

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

  • .tch : хеш-таблица
  • .tcb : B+ дерево
  • .tcf : база данных фиксированной длины
  • .tct : табличная база данных

Если расширение отличается от указанных, сервер не запустится.

Ссылки по теме

Руководство по установке от ruoto, которое я использовал в качестве основы
Свежая версия Tokyo Cabinet
Свежая версия Tokyo Tyrant
Коннектор node-tyrant от waveto

Реклама

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: