Чому не бажано мати базу даних та веб-сервер на одній машині?


126

Слухаючи інтерв'ю Скотта Хензельмана з командою Stack Overflow ( частина 1 та 2 ), він був впевнений, що SQL-сервер та сервер додатків повинні бути на окремих машинах. Це просто для того, щоб переконатися, що якщо один сервер порушений, обидві системи недоступні? Чи переважає проблема безпеки складність двох серверів (додаткові витрати, виділене мережеве з'єднання між ними, більше обслуговування та ін.), Особливо для невеликого додатка, де жодна частина не використовує занадто багато процесора чи пам'яті? Навіть з двома серверами, при одному з яких сервер порушений, зловмисник все-таки може завдати серйозної шкоди, видаляючи базу даних або псуючи код програми.

Чому це може бути така велика справа, якщо продуктивність не є проблемою?

Відповіді:


158
  1. Безпека. Ваш веб-сервер живе в DMZ, доступний для загального доступу до Інтернету та приймає недовірені дані від анонімних користувачів. Якщо ваш веб-сервер піддається злому, і ви дотримуєтесь найменших правил привілеїв під час підключення до вашої БД, максимальна експозиція - це те, що ваша програма може зробити через API бази даних. Якщо у вас бізнес-рівень між ними, у вас є ще один крок між вашим зловмисником та вашими даними. Якщо, з іншого боку, ваша база даних знаходиться на тому ж сервері, зловмисник тепер має кореневий доступ до ваших даних та сервера.
  2. Масштабованість. Збереження вашого веб-сервера без стану дає змогу масштабувати веб-сервери горизонтально майже без особливих зусиль. Це дуже важко горизонтально масштабувати сервер бази даних.
  3. Продуктивність. 2 коробки = 2 рази CPU, 2 рази ОЗУ і 2 рази шпинделі для доступу до диска.

Враховуючи це, я, безумовно, бачу розумні випадки, що жоден із цих моментів насправді не має значення.


27
Але з 2-х машин у вас є подвійна ймовірність відмови обладнання;)
TWith2Sugars

4
@ TWith2Sugars - на відміну від чого?
Кев

3
Реф. пункт 1. Якщо Web Tier належить, то що вам більше потрібно або потрібно, ніж інтерфейс API додатків / баз даних? Напевно, це все-таки закінчилося грою? Тоді речі стають дуже цікавими з точки зору послуг, необхідних для підтримки інфраструктури DMZ, наприклад, будь-які послуги AD чи Microsoft?
Ноелі Данн

4
@Noelie - Ваш веб-ярус не матиме доступу, щоб сказати, створити резервну копію бази даних у файл, а ftp - файл ftp.hackers.com за допомогою xp_cmdshell. Або киньте базу даних. Або змінити значення конфігурації. пр.
Марк Брекетт

6
@kirgy - оскільки обидві машини знаходяться паралельно і кожна є однією точкою відмови, загальна надійність менша; технічно це не подвійно (це насправді 1 - (r1 * r2)), але достатньо близько для великої надійності та малих вузлів .... У випадку 0,01% це було б 0,0199%. Але для 100 вузлів це буде 36,6% замість 100%, що мається на увазі утвердження подвоєння.
Марк Брекетт

45

Це насправді важливо , (ви можете абсолютно спокійно запустити свій сайт з веб / бази даних на тій же машині), це просто найпростіший крок масштабування ..

Це саме те, що зробив StackOverflow - починаючи з роботи однієї машини під керуванням IIS / SQL Server, потім, коли він почав сильно завантажуватися, був придбаний другий сервер і на нього переміщений SQL-сервер.

Якщо продуктивність не є проблемою, не витрачайте гроші на придбання / обслуговування двох серверів.


3
Я погоджуюся, це можна зробити, поки навантаження низьке ... Коли навантаження збільшується, їх легко розділити на 2 або більше машин.
EJ Brennan

4
Я зайшов і збирався прокоментувати те саме. Переключити ваш сервер DB так само просто, як і змінити рядок з'єднання (у більшості випадків).
CitizenBane

Ву, мені це подобається. Хтось продумує контекст, перш ніж запропонувати рішення!
demisx

22

З іншого боку, посилаючись на іншого блогу Скотта (Watermasyck, з Telligent) - вони виявили, що більшість користувачів можуть пришвидшити веб-сайти (використовуючи сервер спільноти Telligent), розмістивши базу даних на тій же машині, що й веб-сайт. Однак, у випадку з клієнтами, зазвичай, сервер db & web є єдиними додатками на цій машині, і веб-сайт не сильно напружує машину. Потім ефективність відсутності необхідності надсилати дані по мережі більше, що компенсувало посилене напруження.


4
... поки одночасне використання не збільшується, і сервер db потребує більше пам'яті, щоб ефективно використовувати буфери та кеші. Після того, як серверам веб / додатків та db потрібно більше пам’яті, ніж вони можуть ділитися в одній коробці, збільшується пейджинговий та дисковий введення / вивід та резервуари продуктивності.
kermatt

@MattK - але що робити, якщо у вас є величезна кількість пам'яті? У нас є додаток, де кожен клієнт має свою базу даних, тому і база даних, і веб-сервери можуть масштабувати горизонтально дуже легко. Враховуючи, що у нас більше пам’яті, ніж диск (64 Гб проти ~ 40 ГБ), чи не було б краще для продуктивності зберігати все на одній машині?
Звуковий сигнал

1
Якщо ваш робочий набір вписується в пам’ять, то, можливо, ви не побачите жодної з проблем, пов'язаних із виконанням, які я згадую. Частіше сервери мають більше диска, ніж оперативна пам'ять, але це звучить так, як у вашому випадку у вас є бази даних, які повністю вмістяться в оперативній пам'яті - до тих пір, поки додатки на спільному сервері не споживають його занадто багато.
kermatt

15

Я думаю, що великим фактором буде продуктивність. І веб-сервер / код програми, і SQL Server кешуватимуть зазвичай запитувані дані в пам'яті, і ви вбиваєте свою кеш-ефективність, запускаючи їх в одному просторі пам'яті.


12
Що робити, якщо у вас є невелика (ish) база даних, але з тоннами пам'яті? Чи не переведуть переваги вартість переходу через мережу для кожного дзвінка до бази даних, особливо якщо їх багато?
Звуковий сигнал

1
@Tom Ritter Хоча продуктивність викликає занепокоєння (на цю відповідь та пункт №3 у відповіді Марка Браткета), я знаю, що деякі люди (включаючи мене), ймовірно, вкладуть гроші, заощаджені НЕ отриманням окремого сервера БД у БОЛЬШИЙ ЦП / ОЗУ / тощо. на єдиному сервері, який його замінив. Тож це слід враховувати. Що стосується розділеної пам'яті, IIS і SQL можуть бути налаштовані для врахування їх конкуренції за ресурси. Особисто для мене "кікером" став бал №1 Марка ... безпека. Мені подобається думка про обмежений доступ, який повинен мати компрометований веб-сервер окремим сервером БД.
Dylan - INNO Software

@Tom, Ви завжди можете розділити простір пам'яті на два окремі одиниці. Половина для сервера і половина для бази даних.
Pacerier

15

Том в цьому правильний. Деякі інші причини полягають у тому, що це не рентабельно та є додаткові ризики для безпеки.

Веб-сервери мають інші вимоги до апаратного забезпечення, ніж сервери баз даних. Сервери бази даних працюють краще з великою кількістю пам'яті та дуже швидким масивом дисків, тоді як веб-серверам потрібно лише достатньо пам'яті для кешування файлів та частих запитів БД (залежно від налаштувань). Що стосується ефективності витрат, то два сервери не обов'язково будуть дешевшими, однак співвідношення продуктивності та вартості повинно бути вищим, оскільки вам не доведеться використовувати різні програми, що конкурують за ресурси. З цієї причини вам, ймовірно, доведеться витратити набагато більше на один сервер, який обслуговує обидва і пропонує еквівалентну продуктивність двом спеціалізованим.

Турбота про безпеку полягає в тому, що при порушенні роботи однієї машини вразливий і веб-сервер, і база даних. З двома серверами у вас є приміщення для дихання, оскільки 2-й сервер все ще буде захищений (принаймні на деякий час).

Також є деякі переваги масштабування, оскільки вам, можливо, доведеться підтримувати лише кілька серверів баз даних, які використовуються безліччю різних веб-додатків. Таким чином, у вас менше роботи над застосуванням оновлень або виправлень та налаштуванням продуктивності. Я вважаю, що існують інструменти управління сервером для полегшення цих завдань (хоча в одному випадку).


2
Якщо у вас є що-небудь, крім SP, то ваш веб-сервер, мабуть, має повний доступ до даних у вашій базі даних
Джордж Мауер

Чому це не економічно? Будь ласка уточніть.
Роберт Джеппесен

Роберт I розширив це питання і додав кілька коментарів щодо масштабованості та обслуговування.
Dana Sane

9

Безпека - це головне питання. В ідеалі ваш сервер баз даних повинен сидіти за брандмауером з відкритими тільки портами, необхідними для доступу до даних. Ваша веб-програма повинна підключатися до сервера баз даних з обліковим записом SQL, який має достатньо прав для роботи програми та не більше. Наприклад, ви повинні видалити права, які дозволяють скидати об’єкти, і, звичайно, ви не повинні з'єднуватися за допомогою облікових записів, таких як "sa".

У випадку, якщо ви втратите веб-сервер на викрадення (тобто повну ескалацію привілеїв до прав адміністратора), найгіршим випадком є ​​те, що база даних вашої програми може бути порушена, але не весь сервер бази даних (як у випадку, якщо сервер бази даних та веб-сервер були однаковою машиною). Якщо ви зашифрували рядки підключення до бази даних, і хакер недостатньо кмітливий, щоб розшифрувати їх, то все, що ви втратили, - це веб-сервер.


Але ви створили резервну копію бази даних, правда? Інакше ви ризикуєте втратити його через збій обладнання або рідко збуджений помилку. Атака, яка вбиває веб-сервер, сама по собі спричинить простої. Достатньо привілеїв для додавання записів у таблиці достатньо, щоб зробити сайт марним.
Даніель Ервікер

Звичайно, ви створюєте резервну копію бази даних, це неявно, де в своєму дописі я пропонував інакше.
Кев

1
Так, але висновок, таким чином, полягає в тому, що атака, призначена для збиття сайту, може зробити це, знищивши конфігурацію веб-сервера або базу даних, і рішення однакове для обох: відновити з резервної копії. Спеціально захистити базу даних (а) непотрібно та (б) все одно неможливо.
Даніель Ервікер

@Earwicker - що з усіма іншими базами даних, що знаходяться на сервері БД? Все, що ви втратили, - це одна база даних.
Кев

8
Крім Даніеля, вам не вистачає ВЕЛИЧЕЗНОЇ точки. Йдеться не про резервне копіювання бази даних, а про компрометовані дані. Чи буде у ваших клієнтів добре, що "хакер викрав усі ваші дані про клієнтів та продажі, але не хвилюйтесь, у мене є резервна копія". :)
Dylan - INNO Software

9

Одним із факторів, про який ще не було сказано, є балансування навантаження. Якщо ви почнете думати про веб-сервер і базу даних як про окремі машини, ви оптимізуєте для меншої кількості мережних поїздок, а також стає легше додати другий веб-сервер або другий двигун бази даних у міру збільшення потреб.


6

Я можу сказати з власного досвіду, що часто корисно розміщувати веб-сервер і базу даних на різних машинах. Якщо у вас є додаток, який потребує ресурсів, це може легко спричинити максимальний цикл процесора на апараті, що фактично зупинить машину. Однак якщо ваша програма обмежено використовує базу даних, напевно, не буде нічого спільного з ними сервером.


6

Нічого собі, ніхто не доводить до того, що якщо ви фактично купуєте SQL-сервер за 5-кілограмовий долар, ви, можливо, захочете використовувати його більше, ніж веб-додаток. Якщо ви використовуєте експрес, можливо, вам все одно. Я бачу, що сервери SQL запускають Бази даних для 20-30 додатків, тому розміщувати його на веб-сервері було б не розумно.

По-друге, залежить від того, для кого саме сервер. Я працюю для фінансових компаній та уряду. Таким чином, ми використовуємо шалений біль у дуповому підході, щоб використовувати лише відростки та обмеження портів від веб-сервера до SQL. Тож якщо веб-додаток зламається. Єдине, що може зробити хакер, - це спроби виклику, оскільки обліковий запис користувача на веб-сервері заблоковано, щоб бачити / викликувати проростки в БД. Тож тепер хакер повинен розібратися, як потрапити в БД. Якщо його на веб-сервері добре, до його виду легко дістатися.


5

Я погоджуюся з Даніелем Ервікером - питання безпеки в основному є хибним.

Якщо у вас є налаштування єдиного вікна з веб-сервером і тільки база даних для цього веб-сервера на ньому, якщо цей веб-сервер порушений, ви втрачаєте і веб-сервер, і лише базу даних для цього конкретного додатка.

Це точно те саме, що відбувається, якщо ви втратите веб-сервер під час налаштування на 2 сервери. Ви втрачаєте веб-сервер і просто базу даних для конкретної програми.

Аргумент про те, що "решта цілісності сервера БД зберігається" там, де ви встановили 2-сервер, не має значення, оскільки в першому сценарії кожен інший сервер баз даних, що стосується будь-якої іншої програми (якщо такі є), також не змінюється. - будучи, як вони, розміщені в інших місцях.

Аналогічно до питання, яке ставить Кев ', що з усіма іншими базами даних, що знаходяться на сервері БД? Все, що ви втратили, - це одна база даних ".

  • якщо ви розмістили програму та базу даних на одному сервері, ви б розмістили на цьому сервері лише бази даних, що стосуються цієї програми. Таким чином, ви не втратили жодних додаткових баз даних в одному серверному налаштуванні порівняно з декількома налаштуваннями сервера.

Навпаки, в 2-х серверних установках, коли зловмисник мав доступ до веб-сервера, а також через проксі, обмежені права (у кращому випадку) на сервер баз даних, вони могли піддавати небезпеці бази даних будь-якої іншої програми повільні запити, що займають пам'ять, або максимізація наявного місця на сервері бази даних. Виділяючи додатки на власні проблеми, дуже схожі на віртуалізацію, ви також ізолюєте їх з метою безпеки позитивно.


4

Це залежить від застосування та мети. Коли висока доступність та продуктивність не є критичною, непогано не розділяти БД та веб-сервер. Особливо враховуючи підвищення продуктивності - якщо пристрій робить велику кількість запитів до баз даних, значну кількість завантаження мережі можна видалити, зберігаючи все в одній і тій же системі, зберігаючи час відповідей низьким.


2

Я думаю, що це тому, що обидві машини зазвичай потребують оптимізації різними способами. Крім того, я не маю уявлення, ми запускаємо всі наші програми на базі сервера-бази даних на одній машині - дано, що ми не публічні, - але у нас не було проблем.

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

Цікавить, що можуть сказати інші.


1
Джордж, я думаю, ти повинен звернутися до відповіді Марка Брокетта. Захищеність вашого веб-сервера до бази даних НЕ буде такою ж, як це було б, якби сервер був окремим. Зокрема, "локальний диск" не був би доступним. Крім того, якби тільки один веб-сайт (з багатьох) був зламаний, вони, ймовірно, мали б лише порушений доступ до бази даних ТОГО САЙТУ (якщо ви не використовуєте занадто потужного користувача для цього рядка з'єднання). Існує незліченна кількість інших сценаріїв, я просто не думаю, що коментар тут є для них місцем.
Dylan - INNO Software

2

Я слухав цей подкаст, і це було кумедно, але аргумент безпеки для мене не мав сенсу. Якщо ви зламали сервер A, і цей сервер може отримати доступ до даних на сервері B, ви негайно отримаєте доступ до даних на сервері B.


Неправда. Ви маєте доступ до будь-яких даних або привілеїв, які мали поле Box A. У захищеному налаштуванні це означатиме, що у вас є найвищий рівень доступу до БД, який має додаток у коробці A. Однак у вас немає привітів на БД або root на ОС Box B.
Марк Брекетт

2
"У вас є доступ до будь-яких даних або привілеїв, які мали вікно А до поля В" - ось що я мав на увазі під "ви негайно маєте доступ до даних на сервері B". Якби RDBMS знаходився у вікні A, а в ньому не було вікна B, яка різниця мала би це? NB. ми припускаємо, що ви вже зламали вікно А, в будь-якому випадку.
Даніель Ервікер

У двох конфігураційних полях, якщо ви застосовуєте принцип найменшого привілею, якщо поле A (web) порушено, найгірше, що повинно було статися, це те, що ви втратили БД у вікні B і більше.
Кев

1
І в конфігурації одного вікна, якщо це одне поле порушено, ви втратили це одне поле, яке включає в себе БД. Яка різниця?
Даніель Ервікер

2
Різниця полягає в тому, що в налаштуваннях двох вікон, якщо веб-сервер порушений, все, що ви втратили, - це веб-сервер і, в гіршому випадку, БД. Решта цілісності сервера БД зберігається.
Кев

2

Ліцензії на базу даних не є чіткими і часто стягуються за центральний процесор, тому, відокремлюючи веб-сервери, ви можете знизити вартість ліцензій на вашу базу даних.

Наприклад, якщо у вас 1 сервер, який працює як в Інтернеті, так і в базі даних, що містить 8 процесорів, вам доведеться заплатити за 8 ліцензійних процесорів. Однак якщо у вас є два сервери з кожним 4 процесором і працює база даних на одному сервері, вам доведеться платити лише за 4 ліцензії на процесор


Поясніть, будь ласка, яким чином це економія.
Джон Сондерс

1
Джон - він говорить, що для отримання еквівалентної продуктивності на двох машинах вам знадобиться подвоїти кількість ядер, що вдвічі збільшить витрати на ліцензування SQL Server. Навіщо платити додаткові $ 10-20 000 за SQL Server, якщо все, що ви отримуєте, - це та ж продуктивність, як використання двох машин.
Звуковий сигнал

справедливо лише в тому випадку, якщо продуктивність / використання ресурсів (наприклад, процесор) переважають сервери додатків, а не сервер db. якщо DB потрібен 8 cpus, він не працюватиме.
Андреас Дітріх

1

Додаткове занепокоєння викликає те, що бази даних люблять забирати всю наявну пам'ять і зберігати її в резерві, коли вони хочуть її використовувати. Ви можете змусити його обмежувати пам'ять, але це може значно уповільнити доступ до даних.


-1

Аргументація наявності реального збільшення продуктивності роботи сервера баз даних на веб-сервері є хибним аргументом.

Оскільки сервери бази даних беруть рядки запитів і повертають набори результатів, даних, що фактично надходять з сервера даних на веб-сервер, порівняно мало, але кінцева сила, необхідна для обробки запиту та генерування набору результатів, порівняно велика. Оптимізація продуктивності в часі передачі даних, отже, є оптимізацією навколо неправильної речі.

Що стосується безпеки, то переваги мають сервер даних на іншому вікні, ніж веб-сервер. Налаштування такої установки - це не все, що стосується безпеки, але це крок у правильному напрямку.

Що стосується масштабованості, додавати веб-сервери та розміщувати їх у кластер для простого збільшення трафіку досить просто та порівняно дешево. Додавати сервери даних і кластеризувати їх не так просто і дешево. Крім того, веб-сервери та сервери даних мають різні потреби в апаратному забезпеченні, тому декілька вікон допомагають у масштабуванні.

Якщо ви починаєте з малого і маєте лише одну коробку, то хорошим способом було б використання віртуальних машин. Запуск веб-сервера та сервера даних у різних віртуальних машинах на одному хості дає всі прибутки в окремих полях за ціною однієї великої коробки.


1
Оригінальне запитання про сервери додатків, не обов'язково для загальнодоступних веб-серверів.
Жоао Браганча

-2

Операційна система - це ще одне питання. Хоча для вашої бази даних можуть знадобитися більше простору пам’яті, а тому UNIX, ваш веб-сервер - а точніше ваш сервер додатків, оскільки ви згадуєте лише два яруси - може бути на базі .Net, а тому вимагає Windows.


Я не проголосував за це, але "Хоча у вашій базі даних може знадобитися більше пам'яті і, отже, UNIX" - Якщо ви працюєте з 64-бітовими вікнами та 64-бітним SQL, у ній є багато пам'яті.
Кев

Вибачте, пам’ять була вказана як приклад необхідності розгортання в розділених ОС. До інших причин можна віднести: продуктивність, безпека, корпоративні стандарти / ліцензування, підтримка постачальників тощо
Кріс Ное,

-6

Гаразд! Ось у чому справа, більш безпечним є встановлення вашого сервера БД на іншій машині, а ваша програма на веб-сервері. Потім ви підключаєте свою програму до БД за допомогою веб-посилання. Дякую.


3
чому це більш безпечно?
Брайан Чен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.