Нужна распределенная система поиска ключ-значение

Мне нужен способ поиска ключ-значение в (потенциально) сотнях ГБ данных. В идеале что-то основанное на распределенной хеш-таблице, которая прекрасно работает с Java. Он должен быть отказоустойчивым и с открытым исходным кодом.

Хранилище должно быть постоянным, но в идеале оно должно кэшировать данные в памяти, чтобы ускорить процесс.

Он должен поддерживать одновременное чтение и запись с нескольких машин (однако чтение будет в 100 раз более распространенным). В основном цель состоит в том, чтобы выполнить быстрый первоначальный поиск пользовательских метаданных для веб-службы.

Кто-нибудь может что-нибудь порекомендовать?


person sanity    schedule 13.10.2008    source источник
comment
Для чего вы оптимизируете? Например, пропускная способность при чтении (одновременное чтение с нескольких машин), отказоустойчивость в случае недоступности машин, малое количество машин... Нужны ли вам также записи?   -  person Alexander    schedule 13.10.2008
comment
Спасибо, я отредактировал вопрос с этой информацией.   -  person sanity    schedule 13.10.2008
comment
Как вы хотите, чтобы ваши данные распространялись? Должны ли все данные быть доступны на/на/с каждого узла или нет? В первом случае возникает следующий вопрос: почему распределенный поиск?   -  person Alexander    schedule 13.10.2008


Ответы (10)


Вы можете проверить Hazelcast. Он распределенный / разделенный, супер легкий, простой и бесплатный.

java.util.Map map = Hazelcast.getMap ("mymap");
map.put ("key1", "value1");

С уважением,

-талип

person Community    schedule 29.10.2008

Open Chord — это реализация CHORD в Java. Это протокол распределенной хэш-таблицы, который должен идеально соответствовать вашим потребностям.

person Nicholas Mancuso    schedule 13.10.2008

В зависимости от варианта использования Terracotta может оказаться именно тем, что вам нужно.

person Alex Miller    schedule 15.10.2008

Вероятно, вам следует указать, должен ли он быть постоянным или нет, в памяти или нет и т. д. Вы можете попробовать: http://www.danga.com/memcached/

person carson    schedule 13.10.2008
comment
Спасибо, я добавил примечание о том, что он должен быть постоянным, что, я думаю, исключает memcached. - person sanity; 13.10.2008
comment
memcached также был моей первой мыслью, но сотые доли ГБ — это слишком много для оперативной памяти. - person Javier; 13.10.2008

Распределенные хеш-таблицы включают Tapestry, Chord и Pastry. Один из них должен соответствовать вашим потребностям.

person Community    schedule 13.10.2008

OpenChord звучит многообещающе; но я бы также рассмотрел BDB или любой другой не -SQL хеш-таблица, сделать ее распределенной может быть очень легко (если количество узлов хранения (почти) постоянно, по крайней мере), просто хешируйте ключ на клиенте, чтобы получить соответствующий сервер.

person Javier    schedule 13.10.2008


nmdb похоже, это именно то, что вам нужно. Распределенный, в кеше памяти, с постоянным хранилищем на диске. Текущие серверные части включают qdbm, berkeley db и (недавно добавленный после короткого письма разработчику) tokyo кабинет . Размер ключа/значения ограничен, но я считаю, что его можно снять, если вам не нужна поддержка TICP.

person Phillip B Oldham    schedule 23.10.2008

Попробуйте распределенную структуру Map от Redisson, она основана на сервер Redis. Используя конфигурацию кластера Redis, вы можете разделить данные на 1000 серверов.

Пример использования:

Redisson redisson = Redisson.create();

ConcurrentMap<String, SomeObject> map = redisson.getMap("anyMap");
map.put("123", new SomeObject());
map.putIfAbsent("323", new SomeObject());
map.remove("123");

...

redisson.shutdown();
person Nikita Koksharov    schedule 12.01.2014

У DNS есть возможность сделать это, я не знаю, насколько велика каждая из ваших записей (8 ГБ тонн небольших данных?), но это может сработать.

person Ryan Stille    schedule 13.10.2008
comment
DNS предполагает иерархическую структуру данных, боюсь, она не будет делать то, что мне нужно. - person sanity; 13.10.2008