Подтвердить что ты не робот

Самый быстрый, хранимый в памяти, многозадачный хранилище ключей для Node.js

Какое самое быстрое хранилище ключей для хранения без памяти для Node.js, поддерживающих несколько процессов?

Мне нужно хранить простые строки строки/строки для ключей (не документы или JSON, просто строки).
Вот несколько примеров (их было бы миллионы):

  • 12345678 - abcdefghijklmnopabcdefghijklmnop
  • 86358098 - ahijklmnopbcdefgahijklmnopbcdefg
  • abcdefghijklmnopabcdefghijklmnop - 12345678
  • ahijklmnopbcdefgahijklmnopbcdefg - 86358098

Я пробовал:

  • Redis: он очень быстрый и делает все, что мне нужно, но потребляет слишком много оперативной памяти.
  • LevelDB: он быстрый и не слишком тяжелый в ОЗУ, но только один процесс.

Обходной путь для LevelDB - multilevel, который предоставляет один процесс LevelDB, хотя HTTP.
Но это, конечно, стоит дорого; Мне нужно что-то быстро.

Есть ли какое-либо хранилище ключей, которое:

  • поддерживает Node.js или имеет привязки для него;
  • хранит пары строк/строк;
  • поддерживает несколько процессов;
  • не полностью находится в памяти;
  • быстро?

Я только забочусь о чтении. Быстрое чтение нескольких процессов необходимо, но не писать.
Я доволен текущей скоростью LevelDB, просто не с тем, что это однопроцесс.


Дополнительная информация:

  • Я говорю о 50 миллионах пар ключ/значение, с ключами и значениями между 8 и 500 символами.
  • Код будет запущен на обычном сервере Linux.
  • Использование памяти должно быть ограничено несколькими гигабайтами (4 ГБ в порядке, допустимо 8 ГБ).
  • Чтение будет происходить больше, чем писать; на самом деле, я мог обойтись без написания.
  • Скорость важнее всего (учитывая, что память и ограничение нескольких процессов соблюдаются).
4b9b3361

Ответ 1

Я бы предложил посмотреть LMDB (который является наиболее эффективным движком для OpenLDAP и используется в ряде других open- исходные проекты).

LMDB - это встроенное хранилище ключей/значений с API Berkeley-DB или LevelDB, не нужно хранить все в памяти и поддерживать доступ к нескольким процессам. Есть привязки Node.js:

Ответ 2

Вы можете попробовать ssdb, базу данных, совместимую с протоколом redis, построенную на leveldb.

https://github.com/ideawu/ssdb

Вы можете использовать существующий клиент node-redis, хотя некоторые из команд могут отличаться.

тесты:

                  Redis (100.000x)
      13,540 op/s ⨠ set small
      13,289 op/s ⨠ set medium
      13,279 op/s ⨠ set large
      13,651 op/s ⨠ get large
      13,681 op/s ⨠ get medium
      14,428 op/s ⨠ get small

                  SSDB (100.000x)
      12,252 op/s ⨠ set small
      11,824 op/s ⨠ set medium
      11,720 op/s ⨠ set large
      13,810 op/s ⨠ get large
      13,593 op/s ⨠ get medium
      12,696 op/s ⨠ get small


                  lmdb (100.000x)
       4,616 op/s ⨠ set small
      11,104 op/s ⨠ set medium
      17,283 op/s ⨠ set large
      13,778 op/s ⨠ get large
      16,002 op/s ⨠ get medium
      50,562 op/s ⨠ get small

                  multilevel (100.000x)
       6,124 op/s ⨠ set small
       5,900 op/s ⨠ set medium
       5,944 op/s ⨠ set large
       6,215 op/s ⨠ get large
       6,125 op/s ⨠ get medium
       6,310 op/s ⨠ get small

Как вы можете видеть, ssdb работает почти так же быстро, как redis, и он предназначен для постоянного хранения. lmdb @didier-spezia упоминается очень быстро для получения небольших данных, но установка одного происходит медленно.

Ответ 3

Существует FaceBook RocksDB, который должен быть быстрым (особенно в хранилище SSD), а также есть другие, такие как LMDB ( уже упоминалось) и WiredTiger

Вы упомянули Redis. Если вы хотите использовать Redis API, но в качестве хранилища вместо вашей оперативной памяти есть одна из вышеперечисленных баз данных Key/Value, есть два проекта, которые я знаю (хотя они их не тестировали): LedisDB (написано на Go) и ardb (написано на С++).

Недавно я начал тестировать то, что кажется очень многообещающим, хотя и менее известным (хотя я уверен, что это изменится) библиотека значений ключевых значений с именем CuttDB. Он имеет очень высокую производительность и предназначен для обработки больших объемов данных на жестком диске. Он даже включает интерфейс сервера Memcached.

Ответ 4

Проблема, с которой вы столкнетесь, заключается в том, что "молниеносно" и диск не смешиваются, особенно если вы читаете произвольный доступ, как и в системе с ключом. Вам нужно получить как можно больше данных в памяти, так как чтение из памяти на несколько величин быстрее, чем чтение с диска.

Является причиной, по которой вы хотите минимизировать память, потому что это будет встроенная база данных? Если это так, вы можете посмотреть на Empress - http://www.empress.com. Использовали его в нескольких проектах, и вы можете настроить, сколько будет загружено. Тем не менее, он получил накладные расходы на РСУБД, поэтому не уверен, что он будет таким худым, как вы хотите.

Вы также можете рассмотреть MySQL с аддоном Memcache. Это позволяет использовать MySQL в качестве хранилища ключевых значений. Гораздо быстрее, чем обычный MySQL, поскольку вы пропускаете обработку уровня SQL. Кроме того, с MySQL вы можете поворачивать ручки для воспроизведения с использованием объема памяти.

Firebird - это еще одно использование низкой памяти db - http://www.firebirdnews.org/docs/fb2min.html.

В любом случае, надеюсь, что это поможет. Без более глубокого объяснения ваших потребностей (встроено ли это, почему необходимо экономить память, и если память драгоценна, что вы считаете низким потреблением памяти, вам нужна кислота, избыточность, что вы считаете молниеносной и т.д.) Ее трудно дать больше анализа.

Ответ 5

Почему бы вам не использовать MySQL (или MariaDB) с репликацией Master-slave. Исходя из ваших требований. Архитектура master-slave MySql подходит вам.

В принципе, для NoSQL требуется много серверов. Например, минимальная настройка MongoDB требует три сервера, для HBase требуется четыре сервера.

В этой точке зрения, если вам нужна более читаемость, добавьте новый подчиненный сервер в архитектуру mysql.

Мы предполагаем, что производительность чтения mysql составляет 2 тыс. tps. Тогда четыре node производительности чтения mysql составляют 8k tps.

Это зависит от результата теста и использования службы (соотношение чтения/записи).

проверьте ниже ссылку, то есть "Марко Чеккони - Архитектура StackOverflow". http://www.youtube.com/watch?v=t6kM2EM6so4