Как решения типа NoSql поддерживают согласованность при распределении? - PullRequest
1 голос
/ 15 февраля 2012

Извините заранее, если этот вопрос ошибочен. Я довольно плохо знаком с базами данных (я настроил их, но не использовал их в процессе обучения).

BackGround: У меня есть процесс, который генерирует много тестовых данных, в основном это хеш-таблица с несколькими сотнями миллионов записей каждый день (но в конце дня я могу удалить эти записи). Генерация данных занимает слишком много времени на одной машине, поэтому я делю процесс на несколько серверов, которым в основном нужно искать базу данных (или в настоящее время хеш-таблицу), и если она существует, выполнить какую-то работу, а если ее нет, добавить Это. Я думаю (до сих пор) мои потребности в базе данных, которая может обрабатывать большое количество записей согласованным способом (т.е. обновления должны быть доступны мгновенно), и база данных должна иметь возможность эффективно передавать эту таблицу по сети на другие рабочие узлы (после того, как таблица создана, запускается другое задание, основанное на ней, но я не думаю, что один серверный сервер с таблицей 10+ на несколько серверов эффективен, поэтому я подумал, что его нужно распределить).

Проблема / Вопрос: Если я использую решение NoSql, такое как Hbase (с которым у меня есть небольшой опыт настройки), будет ли работать логика моего приложения? Если у меня есть 2 сервера, выполняющих запись в распределенную базу данных, есть ли вероятность, что server1 добавил запись, но когда server2 ищет ее, он не может найти ее, потому что еще не реплицировал хотя кластер? Кроме того, есть ли лучший способ сделать то, что я пытаюсь сделать? Будет ли лучше работать один сервер (я также рассматриваю только использование mysql) без распределения (я избегал его, потому что хотел решения, которое, если бы он был слишком медленным, я мог бы просто добавить больше рабочих серверов для записи в базу данных, я не Вы уверены, что мои показатели производительности снизятся, если я добавлю 100 рабочих для записи на один сервер)?

Любые советы или предложения будут великолепны.

Спасибо!

Обновление: я только что понял, что инфраструктура обмена сообщениями Facebook использует hbase. Если бы это не было последовательным, я бы сошел с ума из-за задержек при общении с друзьями. Так как же hbase остается непротиворечивым (или действительно непоследовательным, а facebook настолько быстр, что кажется таким)?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

Если у меня есть 2 сервера, пишущих в распределенную базу данных, есть ли вероятность того, что server1 добавил запись, но когда server2 ищет ее, он не может найти ее, потому что еще не реплицировал хотя кластер?

HBase, в частности, имеет гарантированную согласованность. Это означает, что после завершения операции записи записанные данные будут доступны всем клиентам. Эта операция записи, однако, не происходит мгновенно, поэтому ее необходимо учитывать.

Другие движки баз данных NoSQL, такие как Cassandra, поддерживают так называемую «конечную согласованность», которая обменивает абсолютную согласованность на скорость записи. Это означает, что часть данных, записанных в кластер, будет ВСЕГДА согласована между узлами, но это может занять некоторое время - как правило, этот период времени очень короткий. Более подробную информацию о таком обмене можно найти здесь .

Я предполагаю, что вы предпочли бы гарантированную согласованность HBase.

Кроме того, есть ли лучший способ сделать то, что я пытаюсь сделать?

Это зависит от того, как будут выглядеть ваши записи. Не могли бы вы предоставить больше информации о данных, которые вы будете хранить? Если ваши поля данных обслуживают модель документа - вам обычно требуются все поля при доступе к данным для данного ключа - тогда вы можете изучить различные хранилища данных на основе документов, такие как MongoDB. MongoDB предлагает различные уровни согласованности (по умолчанию, довольно удобно, для обеспечения согласованности, как HBase).

Если вы часто будете искать какое-то подмножество полей, хранящихся для каждого ключа, то HBase поможет минимизировать объем данных, отправляемых по сети, позволяя вам указать, какие столбцы вы хотите получить от сканируй или получай.

Будет ли один сервер ... без распределения работать лучше (я избегал его, потому что хотел решения, которое, если бы было слишком медленным, я мог бы просто добавить больше рабочих серверов для записи в базу данных, я не уверен, что мой производительность снизится, если я добавлю 100 рабочих для записи на один сервер)?

Механизмы распределенной базы данных, безусловно, будут работать лучше при одновременных операциях чтения / записи. Из-за вышеупомянутых свойств HBase считается сильным в сценариях с интенсивным чтением (записи не активны, пока они не синдицированы), в то время как Cassandra и другие, в конечном итоге, согласованные механизмы баз данных считаются сильными в сценариях с интенсивной записью (хотя последний выпуск Cassandra имеет видел значительный прирост производительности при чтении).

Традиционная база данных, работающая на одном сервере, пострадает, когда увеличится нагрузка чтения / записи, поскольку ей придется ставить в очередь как входящие соединения, так и операции с диском, как только они достигнут своих предельных значений скорости. Я считаю, что HBase (или MongoDB, если вы решите, что хранилище документов может работать на вас) наилучшим образом соответствует вашим потребностям в согласованности.

1 голос
/ 16 февраля 2012

Просто добавьте к предыдущему ответу:

Обратите внимание, что Cassandra поддерживает настраиваемую согласованность.

Для каждого чтения и записи вы можете выбрать желаемый уровень согласованности, т.е. выполнить чтение / запись для любого узла (возможная согласованность) или для всех узлов (полная согласованность), или «кворум» узлов (полная согласованность, если и чтение и запись выполняются на уровне кворума). Смотри http://wiki.apache.org/cassandra/API

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

Другой подход, для особого случая, когда вы знаете значение , если должно быть доступно, - это чтение с низким уровнем согласованности и повторение, если значение «отсутствует». Тогда вы получаете удар по производительности только для небольшого числа случаев, когда данные не распространялись.

...