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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


person hoytster    schedule 08.03.2010    source источник


Ответы (6)


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

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

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

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

person APC    schedule 09.03.2010
comment
Спасибо, АПК. Вы дали мне много пищи для размышлений. Полезные функции Oracle: это именно то, на что я надеялся. Разделение и выпуски, кажется, говорят о ряде моих проблем. Не совсем легко понять, но у нас есть администраторы баз данных, так что грокинг в полном объеме не требуется (это выражение показывает мой возраст?). И я выучил новое слово: bespoke, то есть сделанный на заказ по спецификации заказчика. Хорошее слово. Было бы здорово, если бы мы могли провести пилотный проект, чтобы убедиться, что эти расширенные функции Oracle работают. Я отчитаюсь, если/когда. - person hoytster; 10.03.2010

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

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

Согласно магазину Oracle,

  • Одна стандартная версия Oracle стоит 5 800,00 долларов США за процессор (где на x86 процессор — это сокет, и вы можете использовать до 2 сокетов).
  • Стандартная версия Oracle стоит 17 500,00 долларов США за процессор (где на x86 процессор — это сокет, и вы можете использовать до 4 сокетов).
  • Корпоративная версия Oracle составляет 47 500,00 долларов США за процессор (где на x86 процессор составляет 2 ядра, поэтому вам нужно фактически удвоить эту цену для четырехъядерных процессоров).

Так что, если, например, вам нужно 8 четырехъядерных процессоров для обслуживания 100 клиентов, лицензирование для одной базы данных будет ЗНАЧИТЕЛЬНО дороже, чем иметь 4 отдельные базы данных, каждая из которых имеет 2 четырехъядерных процессора, каждая из которых работает с 25 клиентами.

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

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

person kwyjibo    schedule 09.03.2010
comment
Вау, отличная информация, kwyjibo. Спасибо! Например, я имею в виду то, к чему я подключаюсь с помощью пользователя/пароля/сервера; его данные полностью отделены от любого другого экземпляра. Это точно схема? 16-ти кратная разница в цене - ВЕШИЙ аргумент!! Я полагаю, вы говорите мне, что цена/транзакция намного ниже для стандартной версии по сравнению с корпоративной версией, но нам нужна корпоративная версия, чтобы получить необходимую нам емкость всего с одной коробкой? У нас нет большой потребности в операциях с БД между клиентами. Я спрошу о том, какое оборудование мы имеем в виду. - person hoytster; 09.03.2010
comment
Я был бы очень осторожен, принимая это за чистую монету... Насколько я могу судить, SEone и SE по-прежнему должны учитывать ядра. 1 4-ядерный процессор x86 != 1 лицензия, это 2 лицензии (коэффициент лицензирования ядра * ядра процессора .5). Вы также не могли бы запустить SEone на 2-х четырехъядерном компьютере, поскольку он фактически имеет 4 процессора, если говорить о оракуле. Соответствие лицензии Oracle — это самостоятельная должностная обязанность. Я предлагаю прочитать oracle.com/corporate/pricing/pricelists.html. и oracle.com/corporate/contracts/library/< /а> - person Matthew Watson; 09.03.2010
comment
Согласно oracle.com/corporate/pricing/sig.html на стр. 15. в PDF-файле есть предложение При лицензировании программ Oracle с Standard Edition One или Standard Edition в названии продукта процессор считается эквивалентным занятому сокету; однако в случае многочиповых модулей каждая микросхема в многочиповом модуле считается одним сокетом. Тем не менее, вы правы, вы сами должны проявлять должную осмотрительность, соблюдение условий лицензии Oracle смехотворно сложно. - person kwyjibo; 09.03.2010
comment
Кажется, что результаты производительности базы данных указывают на то, что Oracle Enterprise на большом ящике предлагает лучшее соотношение цена/tpmc — что бы это ни было. tpc.org/tpcc/results/tpcc_perf_results.asp - person hoytster; 10.03.2010

Возможно, стоит изучить отдел продаж, и модное слово, которое вы ищете, — «мультитенантная архитектура».

Это делает хорошее чтение:

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

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

person Codek    schedule 09.03.2010
comment
Действительно отличное чтение. Звучит как план, большое спасибо. - person hoytster; 10.03.2010
comment
Очень хорошая ссылка. Также см. - developer.com/design /article.php/3801931/ - person Padmarag; 11.03.2010

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

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

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

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

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

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

  • Мы использовали старый экземпляр/новый экземпляр для обновлений, но миграция данных была рискованной, и связанное с этим время простоя не радовало клиентов. Мы развернули нашу собственную процедуру, которая пролистывала таблицы и экспортировала данные... Но, конечно, не так просто, как экспресс-экспорт или задание Data Pump.

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

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

person David Mann    schedule 09.03.2010
comment
Этот опыт на 100% точен и отрезвляет; много перетягивания каната с клиентами неприемлемо, учитывая наши амбициозные цены. Я не знаю, почему миграция была слишком рискованной для использования со старым и новым подходом экземпляра, но вы знаете, что делаете, поэтому я поверю вам на слово. :( Мне нравится идея внешнего интерфейса, добавляющего client_id, всегда и надежно и устраняющего проблемы. Наше приложение настроено на его использование, в основном, и может быть легко адаптировано, чтобы быть на 100% совместимым. - person hoytster; 10.03.2010
comment
Миграции были рискованными из-за объема и сочетания данных, не говоря уже о возможных конфликтах ключей в целевой общей схеме. У нас было 1000 таблиц со смесью клиентских и общих данных (штаты, страны, часовые пояса и т. д.). Учитывая количество практических действий, необходимых для копирования данных в новый экземпляр, их проверки и удаления из старого экземпляра, было лучше найти время, о котором все договорились, и выполнить обновление за один раз. Если бы мы реализовали секционирование во всех таблицах, мы могли бы отказаться от секций — это могло бы решить нашу проблему с удалением, но другие проблемы остались. - person David Mann; 10.03.2010

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

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

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

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

person Padmarag    schedule 09.03.2010
comment
У меня была работа, когда у нас было 30 клиентов, возможно, с 10 версиями базы данных, и это было огромной проблемой. Наша предполагаемая проблема может быть на несколько порядков хуже, если мы не форсируем обновления. Однако наличие 2-3 версий схемы звучит управляемо: старая, текущая, следующая. Пока мы переводим клиентов из старой схемы в текущую, мы можем протестировать новую схему на некоторых клиентах. - person hoytster; 10.03.2010

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

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

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

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

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

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

person Gdeglin    schedule 09.03.2010
comment
Хммм. Простая, безболезненная миграция с низким уровнем риска: звучит великолепно. Я знаю приседание о MySql. Возможен ли перенос с Oracle на MySql? Было бы здорово сэкономить на стоимости лицензий Oracle и сделать отдельные экземпляры для каждого клиента практичными. Мы используем процедуры PL/SQL ‹i›легко‹/i› и, по-моему, некоторые другие особенности Oracle. Я погуглю... Спасибо! - person hoytster; 10.03.2010