Как базы данных в памяти обеспечивают долговечность?
В частности, существуют ли какие-либо базы данных, которым не требуется вторичное хранилище (например, HDD) для обеспечения долговечности?
Примечание: это продолжение моего предыдущего вопроса.
3 ответа
Если вы хотите, чтобы сохранение переходов записывалось в постоянное хранилище, это только реальный вариант (возможно, вы не хотите создавать много кластеров с независимыми источниками питания в независимых центрах обработки данных и все же молитесь, чтобы они никогда не выходили из строя одновременно). С другой стороны, это зависит от того, насколько ценны ваши данные. Если это невозможно, тогда может быть уместна чистая БД в памяти с достаточной репликацией. Кстати, даже жесткий диск может выйти из строя после того, как вы сохранили на нем свои данные, поэтому здесь нет идеального решения. Вы можете посмотреть на http://www.julianbrowne.com/article/viewer/brewers-cap-theorem чтобы выбрать компромиссные решения репликации.
Prevayler http://prevayler.org/ является примером системы в памяти, резервная копия которой имеет постоянное хранилище (а код очень прост). Долговечность обеспечивается через журналы транзакций, которые сохраняются на соответствующем устройстве (например, HDD или SSD). Каждая транзакция, которая изменяет данные, записывается в журнал, и этот журнал используется для восстановления состояния БД после сбоя питания или перезапуска базы данных / системы. Помимо Prevayler, я видел похожую схему, используемую для сохранения очередей сообщений. Это действительно похоже на то, как работает "классическая" СУБД, за исключением того, что журналы - это только данные, записанные в основное хранилище. Журналы также могут быть использованы для репликации, поэтому вы можете отправить одну копию журнала в оперативную реплику, а другую - на жесткий диск. Конечно, возможны различные комбинации.
In-memory означает, что все данные хранятся в памяти для доступа к ним. Когда данные читаются, они могут быть прочитаны с диска или из памяти. В случае баз данных в памяти он всегда извлекается из памяти. Однако, если сервер внезапно выключится, данные будут потеряны. Следовательно, считается, что базы данных в памяти не поддерживают ACID, обеспечивающую надежность. Однако во многих базах данных реализованы различные методы обеспечения надежности. Эти методы перечислены ниже.
- Моментальный снимок - Запишите состояние базы данных в данный момент времени. В случае Redis данные сохраняются на диске каждые две секунды для обеспечения надежности.
- Ведение журнала транзакций - изменения в базе данных записываются в файл журнала, что облегчает автоматическое восстановление.
- Использование NVRAM обычно в виде статической RAM с резервным питанием от батареи. В этом случае данные могут быть восстановлены после перезагрузки из последнего согласованного состояния.
Все базы данных требуют энергонезависимой памяти для обеспечения долговечности. Образ памяти не обеспечивает надежного носителя информации. Очень скоро после того, как вы потеряли власть, ваш образ памяти станет недействительным. Аналогичным образом, как только процесс базы данных завершается, операционная система освобождает память, содержащую образ в памяти. В любом случае вы потеряете содержимое вашей базы данных.
До тех пор, пока какие-либо изменения не будут записаны в энергонезависимую память, они не будут действительно долговечными. Это может состоять из либо записи всех изменений данных на диск, либо записи журнала изменений.
В критических случаях пространства или размера энергонезависимую память, такую как флэш-память, можно заменить жестким диском. Однако сообщается, что у flash есть проблемы с количеством циклов записи, которые могут быть записаны.
После просмотра вашего предыдущего поста репликация на нескольких серверах будет работать до тех пор, пока вы сможете поддерживать работу последнего сервера. Как только он падает, вы теряете свою очередь. Однако существует несколько альтернатив Oracle, которые можно рассмотреть.
КПК часто используют резервную батарею для хранения своих баз данных. Эти базы данных недолговечны, когда батарея разрядится. Резервные копии важны.
База данных classic in memory не может обеспечить классическую долговечность, но в зависимости от ваших требований вы можете:
- использовать memcached (или аналогичный) для хранения в памяти достаточного количества узлов, поэтому маловероятно, что данные будут потеряны
- Храните свою базу данных Oracle в файловой системе на основе SAN, вы можете выделить ей достаточно ОЗУ (скажем, 3 ГБ), чтобы вся база данных находилась в ОЗУ, и, таким образом, доступ с помощью поиска диска никогда не сохранит ваше приложение в недоступном состоянии. Затем SAN заботится о отложенной обратной записи содержимого кэша на диск. Это очень дорогой вариант, но он распространен в тех местах, где необходимы высокая производительность и высокая доступность, и они могут себе это позволить.
- если вы не можете позволить себе SAN, смонтируйте оперативный диск и установите на него свою базу данных, а затем используйте репликацию на уровне базы данных (например, logshipping) для обеспечения отработки отказа.
Любая причина, почему вы не хотите использовать постоянное хранилище?