Подходящий сервер для хранения данных для приложения Erlang, когда данные не умещаются в памяти
Я изучаю возможные варианты организации хранения данных для приложения Erlang. Данные, которые он должен использовать, представляют собой огромную коллекцию двоичных двоичных объектов, индексируемых с помощью коротких строковых идентификаторов. Каждый блоб меньше 10 Кб, но их много. Я ожидаю, что в общей сложности они будут иметь размер до 200 Гб, поэтому очевидно, что они не помещаются в память. Типичная операция с этими данными - либо чтение большого двоичного объекта по его идентификатору, либо обновление большого двоичного объекта по его идентификатору, либо добавление нового. В каждый данный период дня используется только подмножество идентификаторов, поэтому производительность доступа к хранилищу данных может быть полезной благодаря кэш-памяти в памяти. Говоря о производительности - это довольно критично. Цель состоит в том, чтобы иметь около 500 операций чтения и 500 обновлений в секунду на обычном оборудовании (скажем, на виртуальной машине EC2).
Любые предложения, что использовать здесь? Как я понимаю, dets не может быть и речи, так как он ограничен 2G (или 4G?). Mnesia, вероятно, тоже не подлежит сомнению; У меня сложилось впечатление, что он был в основном предназначен для случаев, когда данные умещаются в памяти. Я подумываю попробовать драйвер EDTK Berkeley DB для этой задачи. Будет ли это работать в приведенном выше сценарии? У кого-нибудь есть опыт использования его на производстве в аналогичных условиях?
5 ответов
Церл вышел из такого же размера. Я не использую Erlang в эти дни, но это звучит как то, что вы ищете.
Вы смотрели на то, что делает CouchDB? Это может быть не совсем то, что вам нужно в качестве продукта, но есть много кода erlang для хранения данных. Также ведутся разговоры о предоставлении собственного интерфейса erlang вместо API REST.
Есть ли причина, по которой вы не можете просто использовать файловую систему, рассматривая имя файла как идентификатор строки, а содержимое файла как двоичный двоичный объект? Вы можете выбрать одну (файловую систему), которая соответствует вашим требованиям к производительности, и вы должны получить кеширование в основном бесплатно, предоставляемое вашей ОС.
Я бы порекомендовал Apache CouchDB.
Он отлично подходит для Erlang, и, исходя из его звучания (вы упоминаете BLOB-объекты на основе идентификаторов и не упоминаете никаких реляционных требований), вы ищете документно-ориентированную базу данных.
Поскольку интерфейс является REST, вы можете очень просто добавить обычный HTTP-кеш перед ним, если вам нужно кеширование.
Документация для CouchDB очень высокого качества.
Также есть встроенная Map-Reduce:)
Mnesia может отлично хранить данные на диске. Есть также dets (дисковое хранилище терминов), которое примерно аналогично Berkeley DB. Это в стандартной библиотеке: http://www.erlang.org/doc/apps/stdlib/index.html