Распределение уровней по виртуальным машинам - PullRequest
3 голосов
/ 09 января 2012

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

В 3-уровневых архитектурах у вас обычно есть 3 уровня:

  • A клиент / презентация уровень, на котором живет клиентский код; и
  • A промежуточное ПО уровень, на котором живет бизнес-логика; и
  • A уровень данных / eis , на котором живут СУБД и другие системы с большими объемами данных

В среде Java для веб-приложения это может выглядеть следующим образом:

  • Сервер приложений, такой как GlassFish, на котором работает как «веб-уровень» (WAR-ы, включающие клиентский уровень в веб-приложении), так и «бизнес-уровень» (EJB, промежуточное программное обеспечение и т. Д.); и
  • Сервер СУБД, воплощающий уровень данных

В виртуализированной / кластерной среде эти приложения (GlassFish, RBMBS, такие как Oracle или PostgreSQL и т. Д.) Будут работать на виртуальных машинах.

Мой вопрос: Каковы стандартные способы распределения / распределения этой 3-уровневой архитектуры по этим виртуальным машинам? Это означает, что любая из следующих «стратегий» может быть жизнеспособной , но не преференциальной :

  1. Одна виртуальная машина (скажем, все виртуальные машины являются серверами Ubuntu, поэтому цена / цена не учитывается в уравнении), на которой запущены как GlassFish, так и RDBMS (все 3 уровня)
  2. Две виртуальные машины: виртуальная машина сервера приложений, на которой работает GlassFish, и виртуальная машина сервера базы данных, на которой работает, скажем, PostgreSQL
  3. Три виртуальные машины: две виртуальные машины сервера приложений, обе из которых работают с GlassFish, однако 1 экземпляр GlassFish выполняет только WAR (веб-уровень), тогда как второй экземпляр FlassFish выполняет логику middleware / biz; затем третий сервер БД

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

Будут плюсы / минусы для каждого. Меня интересует, какие стратегии лучше всего достигают следующих целей: (1) максимизирует пропускную способность / скорость, (2) лучше всего подходит для кластерной / облачной среды и (3) максимизирует безопасность.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 09 января 2012

(1) максимизирует пропускную способность / скорость,

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

(2) лучше всего подходит для кластерной / облачной среды

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

и (3) максимизируют безопасность.

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

1 голос
/ 09 января 2012

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

База данных

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

С точки зрения производительности, СУБД часто требуют настройки ядра или нестандартных стратегий файловой системы, и может помочь их размещение на отдельных хостах. Если БД когда-либо необходимо настроить в режиме высокой доступности или в кластере, ее отделение от серверов приложений также может упростить задачу. Обратите внимание, что настройка базы данных, если вам когда-либо понадобится это, может быть сложной темой, если серьезно, и она часто включает в себя такие вещи, как выравнивание разделов на диске, пытаясь уменьшить перемещение головки диска путем умного распределения сегментов / файлов данных базы данных, учитывая Размеры и стратегии кеша СУБД и ОС ... Все это может повлиять на другие приложения, работающие на том же хосте, поэтому я бы предпочел оставить БД в покое.

Кроме того, СУБД часто обслуживают несколько приложений (для этого есть веские причины: иногда для некоторых интеграций требуется доступ к нескольким базам данных приложений). Помогает отделить их от серверов приложений.

Кроме того, системы БД имеют свои собственные процедуры обновления, резервного копирования, распределения / кластеризации и администрирования и часто обслуживаются другими лицами, а не серверами приложений. Таким образом, всю тему администрирования базы данных легче рассмотреть, если рассматривать ее отдельно. И если база данных становится узким местом, вы можете работать только с базой данных, не учитывая, влияют ли другие уровни на производительность.

Я рекомендую хранить СУБД отдельно на одном хосте для производственных сред разумного размера. Но, конечно, если у вас нет требований к производительности, администрированию или доступности, вы можете рассмотреть возможность использования общего сервера для всего.

Glassfish

В общих чертах, когда вы хотите развернуть приложение Java EE на нескольких серверах (для балансировки нагрузки или высокой доступности), вы устанавливаете один и тот же сервер приложений и артефакты на все серверы приложений в кластере. Затем вы можете выбрать, какие артефакты включить на каждом узле кластера. Некоторые серверы приложений могут включать или отключать компоненты в зависимости от нагрузки на сервер. В этом случае ваш сервер приложений является «модулем», который вам нужно распространять.

Теперь могут быть случаи, когда вы или ваша организация предпочитаете иметь полностью разделенные сетевые уровни для веб-уровня и бизнес-уровня (т. Е. Проблемы безопасности). В этом случае вы бы использовали отдельные хосты для этого. Если ваш веб-уровень действительно тяжелый и вам нужно масштабировать его отдельно от бизнес-уровня (т. Е. Вам нужно 6 веб-серверов, но вы можете сделать это с 1 или 2 контейнерами EJB), я бы разделил эти два уровня тоже.

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

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

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

Безопасность

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

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

...