Как настроить новую базу данных SQL Server для возможности возможной репликации в будущем?
Я создаю систему, которая может потребовать поддержки для 500 + одновременных пользователей, каждый из которых выполняет десятки запросов (выбирает, вставляет И обновления) каждую минуту. Основываясь на этих требованиях и таблицах со многими миллионами строк, я подозреваю, что в будущем потребуется использовать репликацию базы данных, чтобы уменьшить часть загрузки запроса.
Не использую репликацию в прошлом, мне интересно, есть ли что-то, что мне нужно рассмотреть в дизайне схемы?
Например, однажды мне сказали, что для включения репликации необходимо использовать GUID для первичных ключей. Это правда?
Какие особые соображения или рекомендации для проектирования баз данных существуют для базы данных, которая будет реплицироваться?
- Настройка базы данных SQL Server, доступная только для определенных пользователей
- Зачем использовать «не нулевой первичный ключ» в TSQL?
- Как массовое обновление базы данных SQL-сервера множеством активных читателей
- Имеют ли индексы DB те же объемы дискового пространства, что и данные столбца?
- Подготовка базы данных для кластеризации SQL Server
Из-за ограничений по времени в проекте я не хочу тратить время на выполнение репликации, когда это может быть не нужно. (На данный момент у меня достаточно определенных проблем, чтобы не беспокоиться о том, чтобы решить возможные.) Однако я не хочу, чтобы в будущем можно было избежать возможных изменений схемы, когда / если репликация требуется в будущем.
Любые другие рекомендации по этому вопросу, включая хорошие места для изучения внедрения репликации, также будут оценены.
- Проект Visual Studio Database + Развертывание + TFS Build + Multi Tenancy
- Каков наилучший способ получить данные из одной таблицы?
- Сбрасывается ли транзакция, лежащая в основе SqlTransaction или TransactionScope, если процесс неожиданно завершается?
- Индексация фрагментации быстро растет даже при использовании fillfactor
- Первичный ключ (два столбца)
- Почему / когда / как выбрано цельное кластерное сканирование индекса, а не полное сканирование таблицы?
- Разделение полного имени и запись его в другую таблицу в SQL Server 2008
- SQL Server: создавать динамические запросы для выбора всех связанных данных в БД на основе таблицы входа и идентификатора
Хотя каждая строка должна иметь столбец rowguid
, вам не требуется использовать Guid для вашего первичного ключа. На самом деле вам даже не требуется иметь первичный ключ (хотя вы будете забиты камнями до смерти за то, что не смогли создать его). Даже если вы определяете свой первичный ключ в качестве ориентира, не делая его столбец rowguid
это приведет к тому, что службы репликации будут создавать дополнительный столбец для вас. Вы определенно можете это сделать, и это неплохая идея, но она ни в коем случае не нужна и не особенно выгодна.
Вот несколько советов:
- Храните таблицы (или, точнее, строки ) малыми; если вы не используете репликацию на уровне столбцов, вы будете загружать / загружать все содержимое строки, даже если изменяется только один столбец. Кроме того, меньшие таблицы упрощают и реже разрешают конфликт.
- Не используйте последовательные или детерминированные первичные ключи, управляемые алгоритмом. Это включает столбцы идентификации . Да, службы репликации будут обрабатывать столбцы идентификации и выделять ключевые ассигнования сами по себе, но это головная боль, с которой вы не хотите иметь дело. Это само по себе является отличным аргументом в пользу использования Guid для вашего первичного ключа.
- Не позволяйте вашим приложениям выполнять ненужные обновления. На первый взгляд, это плохая идея, но эта проблема значительно ухудшается в сценариях репликации, как с точки зрения использования полосы пропускания, так и с точки зрения разрешения конфликтов.
Вы можете использовать GUID для первичных ключей – в реплицированных системных строках должны быть уникальными по всей вашей топологии, а GUID PK – один из способов достижения этого.
Вот краткая статья об использовании GUID в SQL Server
Я бы сказал, что ваш реальный вопрос заключается не в том, как обрабатывать репликацию, а в том, как справляться с масштабированием или, по крайней мере, масштабировать для запросов. И хотя есть различные ответы на эту загадку, один ответ будет выделяться: не использовать репликацию.
Проблема с репликацией, особенно с репликацией слиянием, заключается в том, что записи размножаются в репликации. Скажем, у вас есть система, которая обрабатывает нагрузку в 100 запросов (90 прочтений и 10 записей) в секунду. Вы хотите масштабировать, и вы выбираете репликацию. Теперь у вас есть 2 системы, каждая из которых обрабатывает 50 запросов, 45 просмотров и 5 записей. Теперь эти записи должны быть реплицированы, поэтому фактическое количество записей не 5 + 5, а 5 + 5 (оригинальная запись), а затем еще 5 + 5 (реплика записывает), поэтому у вас есть 90 и 20 записей. Таким образом, в то время как нагрузка на каждую систему была уменьшена, отношение записей и чтений увеличилось. Это не только изменяет шаблоны ввода-вывода, но, что наиболее важно, это изменяет шаблон согласованности нагрузки. Добавьте третью систему, и у вас будет 90 прочтений и 30 записей и т. Д. И т. Д. Вскоре у вас будет больше записей, чем чтение, а латентность обновления репликации в сочетании с проблемами конфиденциальности и конфликтами слияния приведет к сбою вашего проекта. Суть в том, что «скоро» намного раньше, чем вы ожидаете. Скорее всего, чтобы оправдать поиск в масштабах вместо этого, поскольку в любом случае вы говорите о масштабе из 6-8 сверстников, и в 6-8 раз увеличение емкости с использованием масштабирования будет быстрее, намного проще и возможно даже дешевле начните с.
И имейте в виду, что все это всего лишь чисто теоретические числа. На практике происходит то, что инфраструктура репликации не является бесплатной, она добавляет свою собственную нагрузку на систему. Необходимо отслеживать записи, изменения должны быть прочитаны, дистрибьютор должен существовать для хранения изменений до тех пор, пока они не будут распространены среди подписчиков, затем изменения должны быть записаны и опосредованы для возможных конфликтов . Вот почему я видел очень мало развертываний, которые могут претендовать на успех с помощью стратегии масштабирования на основе репликации.
Один из вариантов заключается в том, чтобы масштабировать только чтения, и здесь репликация действительно работает, обычно используя транзакционную репликацию, но также выполняет обработку журналов или зеркалирование с помощью моментального снимка базы данных.
Реальной альтернативой является разбиение (т. Е. Сложение). Запросы маршрутизируются в приложении на соответствующий раздел и помещаются на сервер с соответствующими данными. Изменения на одной части, которые должны отражаться на другом разделе, отправляются через асинхронные (обычно на основе обмена сообщениями) средства. Данные могут быть объединены только в раздел. Для более подробного обсуждения того, что я говорю, прочитайте, как это делает MySpace . Разумеется, такая стратегия оказывает большое влияние на дизайн приложения и не может быть просто приклеена после v1.