Keyspace
About
Keyspace is a replicated key-value database, a product of Scalien, available at http://scalien.com.
Keyspace is set apart from other key-value database because it uses so-called consistent replication, which means that all nodes see the database going through the same states. In other words, no split-brain scenario can occur, where different nodes see different versions of the database.
Установка
Требует Berkeley DB >= 4.6.
$ wget http://scalien.com/releases/keyspace/keyspace-1.9.0.tgz $ tar zxvf keyspace-1.9.0.tgz $ cd keyspace-1.9.0 $ make
Генерация конфига
$ cd keyspace-1.9.0 $ keyspace-config Спросит несколько вопросов, а потом нарисует схему репликации. <pre lang="bash">client(s) client(s) client(s) ^ ^ ^ | | | | node 0 | node 1 | node 2 | +-------------------+ | +-------------------+ | +-------------------+ | + 127.0.0.1 | | + 127.0.0.1 | | + 127.0.0.1 | | | | | | | | | | | + /tmp/keyspace/0 | | + /tmp/keyspace/1 | | + /tmp/keyspace/2 | | | | | | | | | | | | | | | | | | | 7080 --+ Keyspace | 7081 --+ Keyspace | 7082 --+ Keyspace | | | | | | | | | | 8080 --+ HTTP | 8081 --+ HTTP | 8082 --+ HTTP | | | | | | | | | | | | | | | | | | | 10000 --+ Paxos | 10010 --+ Paxos | 10020 --+ Paxos | | | | | | | | | | 10001 --+ PaxosLease | 10011 --+ PaxosLease | 10021 --+ PaxosLease | | | | | | | | | | 10002 --+ Catchup | 10012 --+ Catchup | 10022 --+ Catchup | | | | | | | | | | | +-------------------+ | +-------------------+ | +-------------------+ | | | | | | | | | ----+-------- [replication] ----------+-------- [replication] ----------+-------- [replication] ------
Запуск нод
Создаем каталоги для баз:
$ mkdir /tmp/keyspace/{0..2}
Запускаем демонов:
$ ./bin/keyspaced keyspace.0.conf & $ ./bin/keyspaced keyspace.1.conf & $ ./bin/keyspaced keyspace.2.conf &
База данных
$ find /tmp/keyspace/0/ /tmp/keyspace/0/ /tmp/keyspace/0/log.0000000001 /tmp/keyspace/0/keyspace
HTTP интерфейс
Вывод инфомарции о ноде:
$ curl http://localhost:8080 Keyspace v1.9.0 Running in replicated mode with 3 nodes I am node 0 Master is node 1 I am in replication round 2 Last replication round was 32 bytes, took 497264 msec, thruput was 1 KB/sec
Установка значения (на мастера)
$ curl 'http://localhost:8081/set?key=testkey&value=testvalue'
OKЧтение значения (с мастера)
$ curl 'http://localhost:8081/get?key=testkey'
testvalueЧтение значения (с слейва)
$ curl 'http://localhost:8080/dirtyget?key=testkey' testvalue $ curl 'http://localhost:8082/dirtyget?key=testkey' testvalue
Репликация
Писать можно только в мастер
Читать методом get можно только с мастера
Читать методом dirtyget можно со всех
Если остается одна нода из трех – с неё можно только читать, но мастером она не становится
Каждая нода пишет номер цикла репликации, сравнивая которые можно судить о синхронизации нод.
I am in replication round 29
Интерфейс на Си например сам ищет мастера, для http это надо делать самостоятельно.
Производительность
Скорость записи с sync после каждой операции: 30-35 операций записи в секунду
Проведенный тест db4 подтвердил низкую скорость записи. Псевдокод теста:
dba_open() for($i=0;$i<=100;$i++) { dba_replace() dba_sync() } db_close()
Отключение sync после записи приводит к увеличение скорости записи и возможности потери данных при востановлении БД.
Ошибки
При выходе демон подвис и ушел в бесконечный цикл. Strace ничего не показал. ltrace показал:
memcpy(0x7fffebd290ef, "\n", 2) = 0x7fffebd290ef vsnprintf("", 4406034, "", 0x1f) = 47 memcpy(0x7fffebd290ef, "\n", 2) = 0x7fffebd290ef vsnprintf("", 4406034, "", 0x1f) = 47 memcpy(0x7fffebd290ef, "\n", 2) = 0x7fffebd290ef
Непонятки с базой данных:
$ ./bin/keyspaced keyspace.0.conf Encountered zero length records while traversing backwards PANIC: DB_RUNRECOVERY: Fatal error, run database recovery PANIC: DB_RUNRECOVERY: Fatal error, run database recovery process-private: unable to find environment Cannot initialize database!
Опять ошибки с базой данных:
DB_LOGC->get: LSN: 39/9324792: short read log file auto-remove: Input/output error
И еще:
PANIC: fatal region error detected; run recovery
И еще…:
$ ./bin/keyspaced keyspace.1.conf Ignoring log file: /dev/shm/keyspace/1/log.0000000019: magic number 29, not 40988 Invalid log file: log.0000000019: Invalid argument PANIC: Invalid argument process-private: unable to find environment Cannot initialize database!
Вывод
- Отсутствие мастера до 7 секунд (база пребыват в режиме read only)
- Много багов, продукт еще сырой
- Быстрая, работающая репликация
- Хорошая документация
- Множество готовых интерфейсов, включая HTTP
