Go: LevelDB размер файлов

Go: LevelDB размер файлов

LevelDB - это высокопроизводительная NoSQL система для хранения данных в формате ключ/значение, разработанная компанией Google.   В целом  хранилище хорошо показало себя на практике. Как следствие этого оно используется на низком уровне в  BigTable от Google (в формате LevelDB хранятся конечные записи), в распределенной БД Riak (LevelDB может использоваться как хранилище для конечных узлов) и др.

В LevelDB со стандартными настройками используются  файлы размером 2МБ для хранения SS-таблиц на файловой системе. При этом хранилище хорошо себя ведет на размерах до 40-50ГБ. С большими объемами не сталкивался лично. Минусом в таких случаях является то, что одной директории находится порядка 20К фалов , что не есть хорошо.

Если мы работаем на языке Go и используем github.com/syndtr/goleveldb/leveldb, то для увеличения размера файлов на диске до 16МБ нужно открыть LevelDB со следующими параметрами:

import "github.com/syndtr/goleveldb/leveldb"
import "github.com/syndtr/goleveldb/leveldb/opt"
...
db,_ = leveldb.OpenFile( "database", &opt.Options{
    CompactionTableSize: 16 * opt.MiB,
    WriteBuffer:         32 * opt.MiB,
    Compression:  opt.SnappyCompression,
} )

Если отключить компрессию данных, то WriteBuffer нужно выставить равным CompactionTableSize. Обусловлено это тем что в случае сжатия половина буфера используется как источник данных, а вторая как получатель.

Я провел сравнение на записи 100 млн уникальных ключей размером 8 байт со значениями 8 байт. На моей тестовой  несильно мощной машинке скорость записи до изменения размера составила ~ 179K записей/с, после увеличения ~ 197К, что примерно увеличило производительность на 10% при этом в значительной степени сократило число файлов в 8 раз и снизило интенсивность мерджей SS-таблиц.

 

Тэги: go golang leveldb nosql базы данных


 


 
архив

подписка