Archive

Posts Tagged ‘keyspace’

Keyspace

January 16th, 2011 No comments

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 &amp;
$ ./bin/keyspaced keyspace.1.conf &amp;
$ ./bin/keyspaced keyspace.2.conf &amp;

База данных

$ 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&amp;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&lt;=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-&gt;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
Tags: