Мудрость слияния 100 экземпляров Oracle в один экземпляр

Наше приложение работает в Интернете, в основном это инструмент запроса, выполняет некоторые транзакции. Мы размещаем базу данных Oracle. У приложения всегда был отдельный экземпляр Oracle для каждого клиента. Клиент - это компания, которая платит нам за предоставление наших услуг сотрудникам компании, обычно от 10 000 до 25 000 человек на одного клиента. Мы намерены иметь несколько сотен клиентов. Мы делаем основной выпуск каждые несколько лет, и переход на этот новый выпуск является сложным: у нас может быть команда на сайте клиента в течение пары недель, объясняя новые функции и настраивая данные о поездке в соответствии с этим клиентом.

Мы планируем использовать мультиклиент, в результате чего все наши клиенты будут объединены в один общий экземпляр Oracle 11g на большом сервере "Windows Server 2008", чтобы снизить затраты. Мне интересно, насколько это целесообразно.

Есть несколько преимуществ наличия отдельных экземпляров для каждого клиента. Скажите, пожалуйста, если это подделка. В моем приблизительном предположении о снижении важности:

  • Наши клиенты MyCorp и YourCo могут быть перенесены отдельно, когда нарушаются изменения в схеме. (С мульти-клиентом мы будем переносить 300+ клиентов за одну ночь!?!)

  • Данные MyCorp могут быть легко скопированы и (!!!) восстановлены, не затрагивая других клиентов.

  • Данные MyCorp надежно отделены от данных своих конкурентов YourCo, не завися от разработчиков, чтобы получить правильный код и/или администраторы баз данных, получившие правильную конфигурацию.

  • Несколько экземпляров представляют собой более низкий риск, потому что катастрофа с одним клиентом (кто-то случайно удваивает зарплату и обнаруживает ошибку после дня оплаты) не влияет на других клиентов. Бедствие, которое затронуло ВСЕ наших клиентов (крики, новый администратор баз данных и вдруг каждый участник имеет тот же SSN!?!), Может поставить нашу компанию под себя.

  • Наличие одного экземпляра на одном сервере представляет собой единую точку сбоя, при этом вся наша клиентская база выходит из бизнеса, если ураган сбивает здание. Несколько экземпляров на нескольких серверах допускают географическое рассеивание: никакая катастрофа не будет влиять на слишком большую часть наших клиентов, а незатронутые серверы в других регионах могут взять на себя нагрузку на неудавшиеся серверы.

  • Производительность лучше, потому что база данных меньше (10 000 против 2000 000 строк в ~ 50 таблицах).

  • Если офисы MyCorp (в основном) расположены только в одном регионе, то экземпляр MyCorp может быть географически размещен там, поэтому сетевое отставание не ухудшает производительность. По той же причине мы можем обеспечить лучший сервис для глобальных клиентов.

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

  • Балансировка загрузки проще, поскольку экземпляры могут размещаться на разных серверах (это с веб-фермой).

  • Когда нужен экземпляр DEV или QA, проще клонировать реальный экземпляр и анонимизировать данные, потому что гораздо меньше данных.

  • Поскольку они достаточно малы, разработчики могут иметь свой собственный экземпляр, работающий локально, поэтому они могут работать над кодом во время ожидания в аэропорту и во время полета, не сражаясь с проблемами VPN.

Q1: Каковы другие преимущества отдельных экземпляров?

Мы рассматриваем изменение схемы базы данных и объединение всех наших клиентов в один экземпляр Oracle, работающий на одном мощном сервере.

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

  • Меньшая работа для администраторов баз данных, поскольку им нужно поддерживать только один экземпляр вместо сотен. Меньшая работа DBA переводит на более дешевый, наш основной мотив для этого изменения.

  • Только с одним экземпляром администраторы баз данных могут лучше выполнять оптимизацию производительности. У них будет время добавить соответствующие индексы и посмотреть наш SQL.

  • Разработчикам будет проще отлаживать и улучшать приложение, потому что есть только одна схема и одно приложение (могут быть десятки версий схемы, если есть сотни экземпляров, с другой версией приложения для каждой версии схемы). Это также снижает затраты. Альтернативой является запуск каждого сеанса отладки с помощью: (1) какой версии этот клиент работает и (2) препятствовать воссозданию соответствующей среды разработки, кода и базы данных. (Нам нужна виртуальная машина, которая включает в себя экземпляр кода AND и каждого патча и выпуск!)

  • Лицензирование Oracle дешевле, потому что оно оценивается за сервер независимо от его работы (или что-то - я ничего не знаю о предмете).

  • База данных становится жизнеспособным постоянным хранилищем данных веб-сеанса, потому что есть только один экземпляр.

  • Некоторые операции с базой данных проще с одним экземпляром нескольких клиентов, например, поиск участника, когда они туманны относительно того, к какому клиенту они (или их супруга, возможно) работают: все имена находятся в одной таблице. Отчетность между клиентами проста.

Q2: Каковы другие преимущества наличия нескольких клиентов в одном экземпляре?

Q3: Какой подход, по вашему мнению, лучше (почему)? Экземпляр для каждого клиента или всех клиентов в одном экземпляре?

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

... если не существует компромиссного решения, такого как наличие двух экземпляров нескольких клиентов, старого и нового. В этом случае мы разработали решения с несколькими экземплярами для поиска участников, отчетности и т.д., Чтобы клиенты могли перейти от одного экземпляра нескольких клиентов к другому без каких-либо взломов.

Ответы

Ответ 1

Если вы не используете Oracle XE (ограниченная бесплатная версия) с одной базой данных на один сервер, она будет очень дорого стоить, даже если вы покупаете одноядерные ящики с одним процессором. Наличие нескольких баз данных на сервере неэффективно, поскольку каждая база данных несет накладные расходы на использование ЦП и ОЗУ. Настройка сложнее, потому что конкуренция сложнее диагностировать.

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

Рассмотрим вариант Разделение, если вы можете себе это позволить. Это касается ваших проблем в отношении резервного копирования и восстановления, поскольку каждый раздел может иметь собственное табличное пространство. Таким образом (с учетом разбиения на разделы client_id) становится возможным резервное копирование или восстановление отдельных данных клиента, не затрагивая других клиентов. Мы можем экспортировать и импортировать отдельные разделы. Я удивлен тем, что Дэвид заметил, что разделение разделов не работает с VPD. Но я не пробовал эту комбо, поэтому я возьму его слово за это.

Единственное, что вы можете потерять от консолидации, - это возможность поддержки разных клиентов в разных версиях вашего приложения. Однако это не обязательно плохо. Как вы заметили, поддержание нескольких сотен клиентов будет намного проще, если вы откажетесь от индивидуализированных версий приложения. Если вам нужно предложить некоторые специальные функции - даже если вы просто хотите протестировать некоторые функции с помощью отдельного клиента, - тогда взгляните на "Редизайн на основе выпусков" в 11gR2: это действительно отличная функция. Также он доступен для всех лицензий Oracle, а не только для Enterprise.

Ответ 2

Когда вы говорите "отдельные экземпляры", вы говорите об одном экземпляре с несколькими схемами на нем? Или вы действительно имеете в виду несколько экземпляров, запущенных на одной машине? Существует мало оснований для запуска нескольких экземпляров на одной машине, в отличие от запуска нескольких схем в одном экземпляре - каждая схема все равно будет иметь свой собственный набор таблиц, индексов и т.д.

В любом случае у меня нет полного ответа, но нужно помнить о стоимости лицензирования Oracle и о том, как это может повлиять на оптимальное решение.

В соответствии с хранилищем Oracle

  • Стандартная версия Oracle - $5,800.00/Процессор (где на x86 процессор - это сокет, и вы можете перейти в 2 сокета).
  • Стандартная версия Oracle составляет 17 500 долларов США/процессор (где на x86 процессор - это сокет, и вы можете перейти в 4 сокета).
  • Корпоративная версия Oracle составляет 47 500 долл. США/Процессор (где на x86 процессор равен 2 CORES - поэтому вам нужно удвоить эту цену для четырехъядерных процессоров).

Итак, если, например, вам нужно 8 четырехъядерных процессоров для обработки 100 клиентов, лицензирование того, что в одной базе данных VASTLY дороже, чем наличие 4 отдельных баз данных, каждая из которых имеет 2 четырехъядерных процессора, каждый из которых работает 25 клиентов.

8 четырехъядерных процессоров требуют корпоративной версии и имеют прейскурантную цену 16 x 47 500 = 760 000 долларов США. 4 машины, каждая из которых работает по стандартной версии, и каждая с двумя четырехъядерными процессорами CPUS, имела бы прейскурантную цену в 8 x $5,800.00 = $46,400 - разницу в 16 раз. Теперь имейте в виду, что никто не платит цену списка для корпоративного выпуска, но по-прежнему существует огромная разница.

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

Ответ 3

Возможно, стоит исследовать salesforce, а слово buzz, которое вы ищете, - это архитектура с несколькими арендаторами.

Это хорошо читается:

http://blog.dayspring-tech.com/2009/02/forcecom-multitenant-architecture-under-the-covers/

Это хороший пример, потому что Salesforce использует Oracle db под обложками.

Ответ 4

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

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

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

До VPD у нас был класс Java, который привязал "where customer_id =?" или "и customer_id =?" по каждому запросу прямо перед тем, как он попал в базу данных, чтобы клиент мог видеть только их данные. Чтобы реализовать это в VPD при входе в БД, мы бы установили приложение в переменной приложения в контексте приложения, которое будет использоваться политиками VPD, чтобы сеанс мог видеть только их записи. Так что да, вам нужно правильно закодировать его и назначить политики VPD для таблиц, а также доверять тому, что Oracle завершает свою сделку.

Так было хорошо для нас? Теоретически было приятно разгрузить обработку предикатов SQL на что-то вне нашего приложения, но на практике преимущества не избавили от недостатков.

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

  • Мы развлекали объект Old instance/New instance для обновлений, но перенос данных был рискованным, а связанный с ним простор не делал клиентов счастливыми. Мы выполнили собственную процедуру, которая будет проходить через таблицы и экспортировать данные... Но, конечно, это не так просто, как быстрое или экспортное задание.

  • У нас также были проблемы с анализом предикатов VPD, когда дело дошло до раздела. Как и многие другие функции Oracle, они могут работать нормально самостоятельно, но как только вы объединитесь с другими функциями, все становится непредсказуемым. Для нас разделы, не связанные с текущим client_id, не устранялись, потому что анализ предикатов слишком поздно заканчивался обработкой инструкции SQL. Мы работали над этим, перейдя от статических к динамическим политикам VPD, но наше время, проведенное синтаксический анализ, взлетели.

Итак, после всего, что я на это навязываю? Я бы потратил время на то, чтобы наше приложение хорошо использовало переменные связывания и продолжалось со старым механизмом, который добавил customer_id в оператор SQL.

Ответ 5

Oracle предназначен для обработки такой нагрузки.

Мой вопрос - Что вы делаете, когда у вас тысячи клиентов и говорят десять тысяч?
Сохраняете ли вы отдельные экземпляры/схему?

Я сомневаюсь, что кто-то это сделает. Я работал раньше в месте, где у каждого клиента была отдельная база данных, а также копия в центральном месте.
Управление изменениями становится головной болью, вам нужно будет поддерживать очень хорошую информацию о том, какой клиент/компания использует версию, схему, версию приложения и все эти вещи. Это стало само по себе программным обеспечением.
Я бы предложил создать программное обеспечение/дизайн, основанный на модели SaaS, что позволит вам легко обслуживать и та же база данных/схема для всех пользователей.

Для надежности вы все равно можете использовать кластеризацию - Oracle RAC.

Ответ 6

Я должен был рассмотреть одно и то же решение несколько раз. В нашем случае мы используем MySQL, поэтому нет никаких затрат, связанных с запуском всех клиентов в отдельной базе данных.

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

Изменения в базе данных могут занять очень много времени в больших базах данных mysql. Поскольку у всех наших клиентов есть своя база данных, мы можем сохранить все наши наборы данных небольшими. Резервные копии также очень быстры.

Наши экземпляры разработки ведут себя одинаково, поэтому этот метод позволяет нам одновременно запускать множество схем баз данных при разработке и тестировании новых функций. Мы часто работаем с клиентами, чтобы они попробовали новую функцию, прежде чем мы ее распространим на остальные наши экземпляры. Единственное правило, которым мы придерживаемся (во избежание некоторых из недостатков, которые вы упоминаете), заключается в том, что все клиенты должны быть в одной версии друг от друга. Сохранение более чем нескольких версий для клиентов будет иметь большие накладные расходы.

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

Если бы не потенциальные проблемы с затратами, я бы определенно рекомендовал вам придерживаться отдельного подхода к базе данных.