Для обеспечения отказоустойчивости программной части серверной инфраструктуры важно позаботиться о регулярном правильном создании резервных копий данных и о доступности баз данных.
Резервное копирование (бэкапирование)
Пожалуй, лучшая практика которую мы хотим порекомендовать — это бэкапирование. Однако надо не просто «делать бэкапы», а сохранять проверенные, консистентные бэкапы, на которые ориентируется мониторинг.
Пример. К нам часто приходят аварийные проекты, в которых бэкапы собираются, но они испорчены. Их никто никогда не проверял, а оказалось, что бэкапы не консистентны. Это значит, что при аварии их нельзя будет развернуть или разворачивание будет происходить крайне долго — до нескольких суток. У бизнеса часто нет этого времени, потому что сутки простоя могут стоить ему миллиардов.
Нужно постоянно проверять данные на консистентность. Такую процедуру можно запускать во время каждого бэкапа. Также важно периодически проверять время восстановления и в целом возможность восстановления: как именно оно будет происходить, по какой процедуре. Если этого не делать, то может сложиться ситуация с накоплением бэкапа большого размера (например, 1 ТБ), который не сможет быстро развернуться по обычным интернет-системам.
Отказоустойчивость и высокая доступность СУБД Чтобы обеспечить работоспособность системы управления базами данных в почти любых условиях, нужно внедрить кластеры баз данных, в том числе географически распределенные. Отказоустойчивые кластеры — это группа независимых серверов, гарантирующих минимальное время простоя.
Кластеры высокой доступности бывают следующими:
- Кластер с репликацией данных (Data Replication Cluster). В таком кластере данные реплицируются на несколько узлов (нод), обычно распределенных на разных физических серверах или виртуальных машинах. Каждый узел содержит полную копию данных, что обеспечивает отказоустойчивость. В случае сбоя одного узла, остальные узлы продолжают обслуживать запросы. Репликация данных может быть синхронной или асинхронной, в зависимости от требований к согласованности данных и задержки.
- Кластер с мастер-слейв архитектурой (Master-Slave Cluster). В таком кластере существует один узел-мастер, который обрабатывает записи и обновления, и несколько узлов-слейвов, которые реплицируют данные от мастера. Узлы-слейвы используются для чтения данных или для обработки запросов в случае отказа мастера. При сбое мастера один из узлов-слейвов может быть повышен до роли мастера.
- Кластер с распределенными транзакциями (Distributed Transaction Cluster). В этом кластере данные распределяются по различным узлам, а транзакции выполняются и согласовываются между узлами. Это позволяет обрабатывать транзакции, включающие данные из разных узлов. Если один из узлов недоступен, остальные узлы могут продолжать выполнять транзакции.
- Кластер с кворумом (Quorum Cluster). В таком кластере узлы формируют группу, и принятие решений основывается на большинстве голосов. Кластер требует кворум (определенное количество узлов), чтобы продолжать работу. Если число доступных узлов падает ниже кворума, кластер может остановиться или перейти в режим «только для чтения».
Между серверами происходит синхронизация данных методом потоковой репликации, который позволяет передавать изменения с активного на пассивные серверы так, чтобы в каждый момент времени на Slave-сервере хранилась полная и консистентная копия БД.