Комментарии 32
Валидации нет, только бэкап: https://godoc.org/github.com/recoilme/pudge#BackupAll
Итого, когда Вы покупаете сервер, обычно в «довесок» дарят небольшой ftp сервер для бэкапов, физически размещенный на другом сервере. И единственный путь минимизировать потери — это делать бэкапы, зиповать и отправлять их на этот другой сервер и периодически проверять. Либо писать «живую» реплику — если простой на время востановления бэкапа ведет к ощутимым убыткам/недопустим. Тема репликации немного выходит за рамки движка для хранения данных.
Обьясните что это значит? Вроде ж бд встраиваемая, что значит «сервер»?
Скорее всего сервер будет в виде отдельного проекта и будет поддерживать grps, http и, возможно, memcache протокол (текстовую версию)
Ссылки ведут на примеры реализаций серверов, не на описания протоколов.
Или это планируется как ответвление для других языков, а текущий «встроенный» функционал оставить как есть?
Ну и кстати по скорости редис переплюнуть не так уж и сложно, он же однопоточный. Редис хитёр, но не так уж и быстр. Вот бенчмарк чтения/записи в мемкеш в 100 потоков (они примерно сопоставимы, где то мемкеш даже быстрее)
А вот чтение/запись в 100 потоков пудж и это в режиме ежесекундного fsync в персистенс моде. В инмемори моде пудж намного быстрее. Другое дело что в редисе масса других ништяков и врятли они пересекаются с пуджем
3) Немного не честно, что в pudge в принципе не делает fsync после каждой записи, а сравниваемый bolt запускается без NoSync
. Я думаю, с этой опцией и аналогичным ручным Commit()
производительность значительно вырастет.
У болта включён режим nosync.
https://github.com/recoilme/pogreb-bench/blob/master/cmd/pogreb-bench/bolt.go#L19
У пуджа, в той версии, по дефолту был включён принудительный fsync, ежесекундный
Те все ровно наоборот)
1) Болт коварный. Отлично спроектировано апи. Прекрасно работает на маленькой бд и плох, когда база перестаёт вмешаться в память целиком. Вставка деградирует особенно сильно. Кстати, проверить можете сами, элементарно заменив путь в пакете импорта. Там нет отличий. Для него нет бенчмарков на десятках миллионов, так как он очень медленный. Причём даже с выключенным fsync, на ssd. Бболт это тот же болт с мелкими фиксами. Я и код сравнивал и проверял. Постараюсь завтра прогнать хотя-бы десяток миллионов, если не верите, но боюсь это займёт более часа(
2) Префикс скан требует сортировки. Сортировка миллиона 8 байтных ключей занимает до секунды. Скан в уже отсортированном массиве ключей около 10 ms
Ps если вы относитесь скептически к пуджу, посмотрите лучше баджер. Я не юзал его в проде, но на бенчмарках он показал себя лучше всех. Только пухнет сильно, ну и учтите что будет копмпакшен, ибо лсм. Но все же думаю он лучше
Хм, играюсь вот с такой базой и не замечал:
Page count statistics
Number of logical branch pages: 12306
Number of physical branch overflow pages: 0
Number of logical leaf pages: 1247368
Number of physical leaf overflow pages: 431
Tree statistics
Number of keys/value pairs: 45381603
Number of levels in B+tree: 4
Page size utilization
Bytes allocated for physical branch pages: 50405376
Bytes actually used for branch data: 33244240 (65%)
Bytes allocated for physical leaf pages: 5110984704
Bytes actually used for leaf data: 3518247189 (68%)
Bucket statistics
Total number of buckets: 2
Total number on inlined buckets: 0 (0%)
Bytes used for inlined buckets: 0 (0%)
SSD, оперативки 1gb на все, база весит уже 4gb. Пойду смотреть, сколько занимают времени вставки.
Vadims-MacBook-Pro:bin recoilme$ ./pogreb-bench -c 100 -d bench -e pudge -n 500000 -mink 8 -maxk 8 -minv 64 -maxv 64
Number of keys: 500000
Minimum key size: 8, maximum key size: 8
Minimum value size: 64, maximum value size: 64
Concurrency: 100
Running pudge benchmark...
Put: 12.707 sec, 39349 ops/sec
Get: 0.140 sec, 3569360 ops/sec
Put + Get time: 12.847 sec
File size: 41.96MB
Vadims-MacBook-Pro:bin recoilme$ ./pogreb-bench -c 100 -d bench -e buntdb -n 500000 -mink 8 -maxk 8 -minv 64 -maxv 64
Number of keys: 500000
Minimum key size: 8, maximum key size: 8
Minimum value size: 64, maximum value size: 64
Concurrency: 100
Running buntdb benchmark...
Put: 9.385 sec, 53273 ops/sec
Get: 0.553 sec, 904339 ops/sec
Put + Get time: 9.938 sec
File size: 0.00B
На мой взгляд выглядит интересно. Как оценить объем хранимых данных без учета удаленных записей? Например, чтобы запускать очистку при достижении определенного значения.
Ключи хранятся в индексах, занимают размер ключа + 16 байт на ключ
pudge встраиваемая база данных в 500 строк на golang