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