Выбор лучшего решения высокой доступности для базы данных отчетов и внешнего интерфейса приложения
Я унаследовал систему с 3 базами данных, работающими на одном сервере (SQL Server 2012):
StagingDB
(250GB)ReportingDB
(350GB)AppDB
(500 Гбайт).
Каждый день происходит следующий процесс:
- Несколько ГБ данных в формате CSV в виде простого текста хранятся на сервере сторонним процессом.
- Агент SQL Server берет данные и импортирует их в
StagingDB
- Агент SQL Server выполняет несколько заданий, которые перестраивают
ReportingDB
с нуля на основе текущего содержанияStagingDB
, Эта сборка занимает 5-6 часов. - Агент SQL Server запускает агрегированные сводные KPI из
ReportingDB
и хранит их вAppDB
, Этот процесс занимает 1-2 часа.
ПРОБЛЕМЫ
- Доступность: в то время как (3) выше работает, мы должны закрыть раздел приложения от доступа конечного пользователя, так как этот раздел отображает сетки с данными об активности из
ReportingDB
, Пока работает (4), мы должны полностью закрыть приложение. - Производительность: поскольку все БД находятся на одном сервере, производительность любой хранимой процедуры, работающей на
ReportingDB
или жеAppDB
в то время как процесс сборки - ужасный опыт для конечных пользователей.
ЦЕЛИ
Мы исследуем решения, которые могут решить эту проблему для нас. т.е. мы хотим:
- Постоянно обслуживайте ранее построенные данные, пока ВСЕ последние данные не будут доступны.
- Обеспечьте производительность во время сборки, разделив сборку на другой физический сервер.
ПОДХОД
Мы исследуем эти потенциальные решения:
- Используйте Merge Replication. Создайте все данные на издателе и затем синхронизируйте их с подписчиком, вызвав агент слияния с использованием репликации по требованию.
- Построить все данные на
Build
экземпляр сервера, а затем вручную скопировать таблицы вProduction
экземпляр сервера. - Ни в коем случае не копируйте данные ежедневной сборки. Имейте 2 экземпляра сервера SQL с флагом, установленным в таблице, которая определяет
active
база данных. Когда ежедневная сборка завершается на сервере, скопируйте на него только пользовательские транзакционные данные изactive
экземпляр, а затем установите новый экземпляр вactive
а другой кinactive
, Приложения будут проверять наличие активного сервера при каждой загрузке.
(1) выше, кажется, не очень хорошо для нас, так как кажется невозможным выполнить объединение внутри моментального снимка изоляции транзакции (2), кажется довольно громоздким и включает в себя копирование нескольких сотен ГБ объемных данных внутри одной массивной транзакции на ежедневно.
Каковы лучшие практики для достижения наших целей? Мы хотели бы получить совет от сообщества..!
1 ответ
Мало что пришло мне в голову / не очень понятно в посте:
Почему вы полностью перестраиваете всю базу данных? Нет ли способа построить только часть, которая изменилась, или все данные изменились?
Проблема в том, что вам приходится закрывать приложение частично / полностью только из-за доступа к тем же таблицам?
Если блокировка и / или доступ к одним и тем же таблицам не будут проблемой, будет ли в противном случае производительность в порядке? Не могли бы вы просто собрать его на одном и том же сервере в разных таблицах, возможно, настроив MAXDOP так, чтобы он не был слишком тяжелым для ресурсов.
Если у вас есть только одна база данных, можете ли вы собрать данные в отдельную таблицу, а затем просто заменить старые данные новыми?
- Если вы используете корпоративную версию, переключение между разделами может оказаться простым делом.
- В противном случае я могу просто придумать маленькие или большие хаки в зависимости от вашей среды (установка новых версий представлений / псевдонимов / процедур для доступа к таблицам, sp_rename, другой схемы и т. Д.)
Этот вопрос довольно широкий и не так уж сильно связан с программированием, сайт dba может даже лучше подойти для этого.