Теория проектирования баз данных для нескольких экземпляров приложений - PullRequest
2 голосов
/ 25 октября 2009

Я работаю над проектом SaaS, в котором каждый клиент будет иметь экземпляр приложения (customer1.application.com, customer2.application.com и т. Д.), И в идеале каждый клиент должен иметь свое «собственное» пространство в БД. Текущий план заключается в создании БД для каждого клиента и развертывании экземпляра приложения в веб-ферме. Идея состоит в том, что каждый клиент может отказаться от повышения класса обслуживания, чтобы сохранить статус-кво (что-то, что ДЕЙСТВИТЕЛЬНО хотел один из наших инвесторов, в основном потому, что он ненавидит то, как Facebook продолжает изменять свою работу.)

Прошлой ночью я попытался развернуть для моих двух тестовых учетных записей обновление, которое изменило базу данных. В то время как следующие ошибки были вызваны моей ошибкой (забыв о небольшом, но, по-видимому, очень важном изменении в DDL), я начинаю беспокоиться о своей общей теории работы, поскольку пропущено одно утверждение ALTER COLUMN и целый цикл обновления может быть взорван ад. Итак, после этого долгого наращивания вот мои вопросы:

1) Существует ли способ провести различие между двумя базами данных («тестовая» производственная база данных и фактическая производственная база данных), которая будет точно записывать каждое внесенное изменение?

2) Есть ли другая модель проекта базы данных (и / или приложения), которую я должен рассмотреть? Я знаю, что если я откажусь от поддержки нескольких версий приложения, то на самом деле устраню многие из долговременных проблем с поддержкой.

Ответы [ 5 ]

2 голосов
/ 25 октября 2009

Пища для размышлений:

Обновления кода происходят чаще, чем обновления схемы БД. Убедитесь, что у вас есть действительно хороший SCM для обработки обновлений кода. Мы используем git с большим успехом.

Код прост в управлении, базы данных - нет (для сравнения). Причина в том, что они изменчивы и меняются каждый момент. Кроме того, их действительно трудно откатить (возможно, но много времени и простоев). Таким образом, мы должны найти простой способ отслеживать обновления схемы (вместе с соответствующими изменениями данных) и иметь возможность применять их в будущем к другим аналогичным базам данных.

<ч />

Каждой версии схемы базы данных должен быть присвоен уникальный последовательный целочисленный номер версии. Начните со 100 за слово.

Каждый раз, когда вам нужно его обновить, пишите сценарии sql вроде

  • 100-101.sql
  • 101-102.sql
  • 102-103.sql

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

Вы можете применять любой данный сценарий много раз во время тестирования (на свежих данных), чтобы убедиться, что он будет работать должным образом.

<ч />

Поэтому, когда вам понадобится обновить клиент с версии 130 до 180, вы можете смело применять сценарии sql (В ПОРЯДКЕ), и вы попадете в правильный пункт назначения.

2 голосов
/ 25 октября 2009

Redgate's SQL Compare хорошо справляется со сравнением и анализом двух баз данных SQL Server (предупреждение: коммерческий сторонний продукт). Кроме того, я думаю, что есть бесплатные вещи, которые делают то же самое.

Если вы хотите оставить некоторых клиентов в старых версиях своего продукта, возможно, имело бы больше смысла поддерживать модель «одна база данных на клиента» со сценариями для построения каждой версии баз данных в исходном коде. контроль. Это держит ваших клиентов изолированными друг от друга и даже позволяет вам переключать поставщиков баз данных (например, с SQL Server на Oracle) или версии (то есть с SQL Server 2000 на Sql Server 2005) для некоторых клиентов, в то время как другие клиенты используют более старые версии.

2 голосов
/ 25 октября 2009

Скрипты ручного запуска не будут работать. Ни разные инструменты, к слову. Diff работает для 2,4 или 10 баз данных. Но не масштабируется, потому что вам нужна надежность при наличии сбоев (автономные базы данных, сервер перезапускает все это).

Развертывание осуществляется путем планирования сценариев обновления. Например, посмотрите, как MySpace делает это для более 1000 баз данных: MySpace использует SQL Server Service Broker для защиты целостности 1 петабайта данных . главное, что они используют гарантированный, надежный механизм доставки (SSB) для развертывания сценариев обслуживания схемы. Вам нужен асинхронный, надежный механизм для запуска сценариев, поскольку целевые базы данных могут быть автономными, выполнять плановое обслуживание, unreacahbe и т. Д., А также надежный механизм доставки, такой как Service Broker, может обрабатывать все повторные попытки и связанные с этим проблемы (обработка дубликатов, подтверждений и т. Д.). Вы также можете посмотреть Асинхронное выполнение процедуры , чтобы узнать, как обрабатывать выполнение скрипта через SSB.

Что касается самих сценариев, я рекомендую вам начать рассматривать схему базы данных и данные конфигурации как версионный ресурс. Я уже несколько раз решал эту проблему, например. см. Положите ли вы статические данные вашей базы данных в систему управления версиями? Как?

Обновление

Полагаю, у меня есть какое-то объяснение, почему я считаю неправильным подход. Просто чтобы прояснить ситуацию, я говорю о развертывании сотен серверов и тысяч баз данных. Оригинальный пост сравнивает себя с Facebook, и я желаю им успеха в достижении этого размера, но также задаются вопросы о принципах проектирования , поэтому я говорю, что обсуждение масштабирования на уровне облаков уместно.

Я вижу две проблемы с инструментами сравнения:

  • Доступность. Все инструменты сравнения работают, подключаясь как к «мастеру», так и к «копии», поэтому они могут выполнять свою работу только тогда, когда оба находятся в сети. Это создает «горячую точку», единственную точку отказа, «главную» копию, доступность которой становится критической для развертывания обновлений. Высокая доступность всегда приходит за плату. Это также оставляет проблему доступности «копии» как второстепенные детали реализации, схема обновления должна обрабатывать повторные попытки и тайм-ауты и отключаться от клиента самостоятельно (ни в коем случае не тривиальная проблема).

  • Атомарность. Инструменты diff ожидают стабильной схемы 'master'. Это фактически останавливает «мастера» во время обновления. Несмотря на то, что этим можно управлять в небольшом масштабе, в больших масштабах это становится проблемой, поскольку обновление самого мастера до v. N + 1 становится гонкой против всех тысяч баз данных, хотя некоторые из них все еще могут обновляться с v. N-1. .

Решения на основе сценариев, которые поставляют сценарий обновления в «копию», решают обе эти проблемы. Кроме того, инструменты сравнения, такие как vsdbcmd.exe , основанные на VSDB .dbschema, лучше, чем «живой» инструмент сравнения, поскольку файл «master» dbschema может быть доставлен на машину «копирования» и превращает весь процесс обновления в локальная операция.

В целом, я также верю, что обновление на основе сценариев с использованием управления версиями метаданных лучше, чем обновление на основе diff, из-за причин тестирования и контроля исходного кода, о которых я уже говорил в ссылке на Q1525591.

2 голосов
/ 25 октября 2009
  1. Вы никогда не должны менять БД вручную. Сделайте это с помощью скрипта, который выполняет все изменения DDL и т.д ...

    В идеале должен быть общий сценарий выпуска БД, который использует версию DDL в качестве конфигурации / ввода.

    (и изменения DDL должны быть помечены специальным тегом в системе управления версиями)

  2. Вы можете пойти по пути Microsoft: поддержка нескольких версий в качестве головной боли - просто обозначьте все версии до X (скажем, 2 версии назад) как неподдерживаемые. Таким образом, вы можете поддерживать последние 2-3 версии, но не тратить ресурсы на что-либо большее, в то же время обеспечивая гибкость для каждого клиента.

  3. Вы должны тщательно взвесить все за и против того, что у вас есть версионная система приложений / БД, как вы предлагаете.

    Перечислите плюсы (такие как утешение инвестора, положительный опыт для клиента при неожиданном изменении версии, о котором вы упомянули - переведено на предельную вероятность, чтобы сохранить / добавить новых клиентов, которым требуется такая функция , плюс простой способ выполнить тестирование BETA / UAT, плюс ошибочный способ откатить несоответствующие изменения схемы путем загрузки данных клиента в схему БД из предыдущей версии).

    Перечислите минусы (стоимость дискового пространства БД, затраты времени на внедрение, стоимость поддержки)

Сравните их и решите, что лучше для вашего бизнеса.

0 голосов
/ 25 октября 2009

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

Любое изменение, даже небольшое, может сломать что-то важное для кого-либо.

Так что, если у вас несколько клиентов, выкатывание исправления для клиента 1 расстроит клиента 2. Это даже не должно быть ошибочной версией; это может быть просто изменение поведения, с которым они не согласны. Для большинства клиентов неконтролируемое расписание выпуска просто недопустимо.

Так что я бы посоветовал вам использовать разные кодовые базы для каждого клиента. Выполняйте исправления только после согласования с клиентом.

Есть ряд клиентов, у которых этот подход не работает (например, почта Yahoo), но, читая ваш вопрос, я думаю, что вы в безопасности ниже этого числа. А что касается инструмента сравнения, я не могу не согласиться с сообщениями, в которых предлагается Redgate для SQL Compare.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...