데이터베이스와 웹 서버를 같은 머신에 두지 않는 것이 왜 바람직하지 않습니까?


126

Scott Hanselman의 Stack Overflow 팀 ( 1 부2 부 ) 과 의 인터뷰를 듣고 그는 SQL 서버와 응용 프로그램 서버가 별도의 컴퓨터에 있어야한다는 것을 강력히 확신했습니다. 이것은 하나의 서버가 손상된 경우 두 시스템 모두에 액세스 할 수 없도록하기위한 것입니까? 보안 문제가 두 대의 서버 (추가 비용, 두 대의 전용 네트워크 연결, 더 많은 유지 관리 등)의 복잡성을 능가 하는가, 특히 CPU 나 메모리를 너무 많이 사용하지 않는 소규모 응용 프로그램의 경우보다 중요합니까? 한 대의 서버가 손상된 두 대의 서버를 사용하더라도 공격자는 데이터베이스를 삭제하거나 응용 프로그램 코드를 망쳐 서 심각한 피해를 입을 수 있습니다.

성능이 문제가되지 않는 이유는 무엇입니까?

답변:


158
  1. 보안. 귀하의 웹 서버는 DMZ에 있으며 공용 인터넷에 액세스 할 수 있으며 익명 사용자의 신뢰할 수없는 입력을받습니다. 웹 서버가 손상되어 DB 연결에 대한 최소 권한 규칙을 따랐다면 데이터베이스 API를 통해 앱이 수행 할 수있는 작업이 최대로 노출됩니다. 그 사이에 비즈니스 계층이있는 경우 공격자와 데이터 사이에 한 단계 더 있습니다. 반면에 데이터베이스가 동일한 서버에있는 경우 공격자는 이제 데이터와 서버에 대한 루트 액세스 권한을 갖습니다.
  2. 확장 성. 웹 서버를 상태 비 저장 상태로 유지하면 웹 서버를 거의 수평 적으로 쉽게 확장 할 수 있습니다. 데이터베이스 서버를 수평으로 확장하는 것은 매우 어렵습니다.
  3. 공연. 2 개의 상자 = CPU의 2 배, RAM의 2 배, 디스크 액세스를위한 스핀들의 2 배.

말한대로, 나는 그 요점이 실제로 중요하지 않은 합리적인 사례를 확실히 볼 수 있습니다.


27
그러나 두 대의 기계를 사용하면 하드웨어 고장 가능성이 두 배가됩니다.)
TWith2Sugars

4
@ TWith2Sugars-무엇과 반대로?
Kev

3
참조 포인트 1. 웹 계층이 소유 된 경우 앱 / 데이터베이스 API 인터페이스보다 더 원하는 것이 무엇입니까? 어쨌든 그 시점에서 게임이 끝났습니까? 그런 다음 DMZ 인프라를 지원하는 데 필요한 서비스, 즉 AD 또는 Microsoft 서비스가 제공되는 서비스 측면에서 상황이 매우 흥미로워 집니까?
Noelie Dunne

4
@Noelie-웹 계층은 데이터베이스를 파일로 백업하고 해당 파일을 xp_cmdshell을 사용하여 ftp.hackers.com으로 ftp로 액세스 할 수 없습니다. 또는 데이터베이스를 삭제하십시오. 또는 구성 값을 수정하십시오. 등
마크 Brackett

6
@kirgy-두 시스템이 병렬이고 각각 ​​단일 장애 지점이므로 전체 신뢰성이 떨어집니다. 기술적으로 두 배는 아니지만 (실제로 1-(r1 * r2)) 큰 신뢰성과 작은 노드에 충분히 가깝습니다 .... 0.01 %의 경우 0.0199 %입니다. 그러나 100 노드의 경우 배가 성명서가 암시하는 100 % 대신 36.6 %입니다.
Mark Brackett

45

실제로는 중요 하지 않습니다 (동일한 컴퓨터에서 웹 / 데이터베이스를 사용하여 사이트를 행복하게 운영 할 수 있음).

StackOverflow는 IIS / SQL Server를 실행하는 단일 컴퓨터에서 시작하여 정확하게로드 된 후 두 번째 서버를 구입하여 SQL Server를 그 서버로 옮겼습니다.

성능이 문제가되지 않으면 두 대의 서버를 구매 / 유지하는 비용을 낭비하지 마십시오.


3
나는 부하가 적을 때 수행 할 수 있다고 동의합니다. 부하가 증가함에 따라 2 대 이상의 기계로 분리하기 쉽습니다.
EJ Brennan

4
나는 들어와 같은 것에 대해 언급하려고했습니다. DB 서버 전환은 연결 문자열을 변경하는 것만 큼 쉽습니다 (대부분의 경우).
CitizenBane

어, 그게 좋아 누군가가 해결책을 제안하기 전에 상황을 생각하고 있습니다!
demisx 2019

22

반면에 다른 블로그 스콧 (Telligent의 Watermasyck)을 참조하면 대부분의 사용자는 데이터베이스를 웹 사이트와 동일한 시스템에 배치하여 (Telligent 커뮤니티 서버를 사용하여) 웹 사이트 속도를 높일 수 있다는 것을 알았습니다. 그러나 고객의 경우 일반적으로 db & 웹 서버가 해당 시스템의 유일한 응용 프로그램이며 웹 사이트는 시스템에 많은 부담을주지 않습니다. 그런 다음 네트워크를 통해 데이터를 전송할 필요가없는 효율성으로 인해 증가 된 부담을 보완 할 수 있습니다.


4
... 동시 사용량이 증가 할 때까지 DB 서버는 버퍼와 캐시를 효과적으로 사용하기 위해 더 많은 메모리가 필요합니다. 웹 / 앱 및 db 서버가 단일 박스에서 공유 할 수있는 것보다 더 많은 메모리가 필요하면 페이징 및 디스크 I / O 증가 및 성능 탱크.
kermatt

@MattK-그러나 많은 양의 메모리가 있다면 어떨까요? 각 클라이언트마다 자체 데이터베이스가있는 앱이 있으므로 데이터베이스와 웹 서버 모두 가로로 쉽게 확장 할 수 있습니다. 사용중인 디스크보다 더 많은 메모리가 있다고 가정하면 (64GB ~ 40GB) 성능을 모두 동일 머신에 유지하는 것이 더 좋지 않습니까?
경고음 경고음

1
작업 세트가 메모리에 적합한 경우 언급 한 성능 문제가 표시되지 않을 수 있습니다. 서버는 RAM보다 디스크가 더 많지만 공유 서버의 응용 프로그램이 디스크를 너무 많이 사용하지 않는 한 RAM에 완전히 맞는 데이터베이스가있는 것처럼 들립니다.
kermatt

15

큰 요소는 성능이라고 생각합니다. 웹 서버 / 앱 코드와 SQL Server는 일반적으로 요청 된 데이터를 메모리에 캐시하므로 동일한 메모리 공간에서 캐시 성능을 실행하여 캐시 성능을 저하시킵니다.


12
작은 데이터베이스를 가지고 있지만 많은 메모리가있는 경우 어떻게해야합니까? 각 데이터베이스 호출에 대해 네트워크를 통해 이동하는 비용, 특히 많은 수가있는 경우 비용이 이점을 능가하지 않습니까?
삐 소리

1
@Tom Ritter 성능이 중요하지만 (이 답변에 따라 Mark Brackett의 답변에서 3 위) 일부 사람들 (포함되어 있음)은 별도의 DB 서버를 더 많은 CPU / RAM에 넣지 않으면 비용을 절약 할 수 있음을 알고 있습니다 기타 교체 한 유일한 서버에서. 따라서 이것을 고려해야합니다. 분리 된 메모리와 관련하여 IIS 및 SQL은 리소스에 대한 경쟁을 설명하도록 구성 될 수 있습니다. 개인적으로, 나를위한 "키커"는 마크의 # 1 포인트 ... 보안입니다. 나는 손상된 웹 서버가 별도의 DB 서버에 액세스해야한다는 제한된 액세스를 생각 합니다.
Dylan-INNO Software

@Tom, 항상 메모리 공간을 두 개의 개별 단위로 분할 할 수 있습니다. 서버의 절반, 데이터베이스의 절반
Pacerier

15

Tom이 이것에 맞습니다. 다른 이유는 비용 효율적이지 않으며 추가적인 보안 위험이 있기 때문입니다.

웹 서버는 데이터베이스 서버와 다른 하드웨어 요구 사항이 있습니다. 데이터베이스 서버는 많은 메모리와 매우 빠른 디스크 어레이로 더 나은 서비스를 제공하는 반면 웹 서버는 파일 및 빈번한 DB 요청을 캐시하기에 충분한 메모리 만 필요합니다 (설정에 따라 다름). 비용 효율성과 관련하여 두 서버가 반드시 저렴할 필요는 없지만 리소스와 경쟁하는 다른 응용 프로그램이 필요하지 않기 때문에 성능 / 비용 비율이 높아야합니다. 이러한 이유로 두 서버를 모두 수용하고 2 개의 특수 서버에 동등한 성능을 제공하는 하나의 서버에 더 많은 비용을 지출해야 할 것입니다.

보안 문제는 단일 시스템이 손상되면 웹 서버와 데이터베이스가 모두 취약하다는 것입니다. 두 대의 서버를 사용하면 두 번째 서버는 여전히 안전합니다 (적어도 잠시 동안).

또한 다양한 웹 응용 프로그램에서 사용하는 데이터베이스 서버를 몇 개만 유지하면되므로 확장 성 이점이 있습니다. 이렇게하면 업그레이드 또는 패치 적용 및 성능 조정 작업이 줄어 듭니다. 이러한 작업을보다 쉽게 ​​수행 할 수있는 서버 관리 도구가 있다고 생각합니다 (단일 시스템의 경우).


2
SP 이외의 것을 실행하는 경우 웹 서버는 아마도 데이터베이스의 데이터에 대한 모든 액세스 권한을 가지고있을 것입니다.
George Mauer

왜 비용 효율적이지 않습니까? 명시 해주세요.
Robert Jeppesen

Robert 나는 그것에 대해 확장하고 확장 성 및 유지 관리에 대한 의견을 추가했습니다.
Dana the Sane

9

보안은 주요 관심사입니다. 데이터베이스 서버는 데이터 액세스를 수행하는 데 필요한 포트만있는 방화벽 뒤에 있어야합니다. 웹 응용 프로그램은 응용 프로그램이 작동하기에 충분한 권한을 가진 SQL 계정으로 데이터베이스 서버에 연결해야합니다. 예를 들어 개체를 삭제할 수있는 권한을 제거해야하며 'sa'와 같은 계정을 사용하여 연결해서는 안됩니다.

웹 서버를 가로 채서 (즉, 관리자 권한으로 전체 권한 상승) 웹 서버를 잃어버린 경우 최악의 시나리오는 응용 프로그램의 데이터베이스가 손상 될 수 있지만 전체 데이터베이스 서버가 아니라는 것입니다 ( 데이터베이스 서버와 웹 서버는 동일한 시스템이었습니다). 데이터베이스 연결 문자열을 암호화하고 해커가 해독하기에 정통하지 않은 경우 웹 서버 만 손실됩니다.


하지만 데이터베이스를 백업해야합니까? 그렇지 않으면 하드웨어 고장이나 드물게 발생하는 버그로 인해 소프트웨어를 잃을 위험이 큽니다. 웹 서버를 죽이는 공격은 자체적으로 다운 타임을 유발합니다. 사이트를 쓸모 없게 만들려면 테이블에 레코드를 추가 할 수있는 권한이 충분합니다.
Daniel Earwicker 2014 년

물론 데이터베이스를 백업하는 것은 암시 적이며 내 게시물에서 다른 방법으로 제안한 곳입니다.
Kev

1
그렇습니다. 그러나 결론은 웹 서버 구성이나 데이터베이스를 파괴함으로써 사이트를 무너 뜨리려는 공격이 그렇게 할 수 있으며, 해결책은 백업에서 복원하는 것과 동일하다는 것입니다. 데이터베이스를 특별히 보호하는 것은 (a) 불필요하고 (b) 어쨌든 불가능합니다.
Daniel Earwicker

@ Earwicker-DB 서버에있는 다른 모든 데이터베이스는 어떻습니까? 잃어버린 것은 하나의 데이터베이스입니다.
Kev

8
다니엘 외에, 당신은 거대한 포인트를 놓치고 있습니다. 데이터베이스 백업이 아니라 손상된 데이터에 관한 것입니다. "해커가 모든 고객 및 판매 데이터를 훔 쳤지 만 걱정하지 마십시오. 백업이 있습니다." :)
Dylan-INNO Software

9

아직 언급되지 않은 한 가지 요소는로드 밸런싱입니다. 웹 서버와 데이터베이스를 별도의 시스템으로 생각하기 시작하면 네트워크 왕복 횟수를 줄이면서 필요에 따라 두 번째 웹 서버 또는 두 번째 데이터베이스 엔진을 추가하는 것이 더 쉬워집니다.


6

웹 서버와 데이터베이스를 다른 컴퓨터에 배치하는 것이 좋은 생각 인 경우가 많습니다. 리소스를 많이 사용하는 응용 프로그램이있는 경우 시스템의 CPU주기가 쉽게 최대치가되어 시스템이 정지 될 수 있습니다. 그러나 응용 프로그램에서 데이터베이스 사용이 제한적인 경우 서버를 공유하는 것은 별 문제가되지 않습니다.


6

실제로 5k 달러로 SQL 서버를 구매하는 경우 웹 응용 프로그램보다 더 많이 사용할 수 있습니다. Express를 사용하는 경우 신경 쓰지 않아도됩니다. SQL 서버는 20 ~ 30 개의 응용 프로그램에 대해 데이터베이스를 실행하므로 웹 서버에 배치하는 것이 현명하지 않습니다.

둘째, 서버의 대상에 따라 다릅니다. 나는 금융 회사와 정부를 위해 일합니다. 따라서 우리는 sprocs 만 사용하고 웹 서버에서 SQL로 포트를 제한하는 엉덩이 접근 방식에 미친 고통을 사용합니다. 따라서 웹 앱이 해킹되면 해커가 할 수있는 유일한 일은 웹 서버의 사용자 계정이 DB의 sproc 만 보거나 호출하기 위해 잠겨 있기 때문에 sprocs를 호출하는 것입니다. 이제 해커는 DB에 들어가는 방법을 알아 내야합니다. 웹 서버에 있으면 쉽게 얻을 수 있습니다.


5

Daniel Earwicker에 동의합니다. 보안 질문에는 거의 결함이 있습니다.

웹 서버를 사용하여 단일 상자를 설정하고 해당 웹 서버에 대한 데이터베이스 만있는 경우 해당 웹 서버가 손상되면 웹 서버와 해당 특정 응용 프로그램에 대한 데이터베이스 만 손실됩니다.

이것은 2 서버 설정에서 웹 서버를 잃어버린 경우와 정확히 동일합니다. 웹 서버와 해당 특정 응용 프로그램의 데이터베이스 만 손실됩니다.

첫 번째 시나리오에서는 다른 모든 응용 프로그램 (있는 경우)과 관련된 다른 모든 데이터베이스 서버도 영향을받지 않기 때문에 2- 서버 설정이있는 '나머지 DB 서버의 무결성이 유지됩니다'라는 주장은 관련이 없습니다. -다른 곳에서 호스팅되는 것.

마찬가지로 Kev가 제기 한 질문에 대해 'DB 서버에있는 다른 모든 데이터베이스는 어떻습니까? 잃어버린 것은 하나의 데이터베이스뿐입니다. '

  • 한 서버에서 응용 프로그램 및 데이터베이스를 호스팅하는 경우 해당 응용 프로그램과 관련된 데이터베이스 만 해당 서버에서 호스팅합니다. 따라서 다중 서버 설정과 비교할 때 단일 서버 설정에서 추가 데이터베이스가 손실되지 않습니다.

이와 반대로 공격자가 웹 서버에 액세스 할 수있는 2 서버 설정과 프록시를 통해 데이터베이스 서버에 대한 제한된 권한 (가장 좋은 시나리오)은 다른 모든 응용 프로그램의 데이터베이스를 가지고 다닐 수 있습니다. 메모리를 많이 사용하는 느리게 쿼리하거나 데이터베이스 서버에서 사용 가능한 저장 공간을 최대화하십시오. 가상화와 마찬가지로 응용 프로그램을 자체 관심사로 분리함으로써 보안 목적을 위해 긍정적 인 방식으로 응용 프로그램을 분리 할 수도 있습니다.


4

응용 프로그램과 목적에 따라 다릅니다. 고가용 성과 성능이 중요하지 않은 경우 DB와 웹 서버를 분리하지 않는 것이 나쁘지 않습니다. 특히 성능 향상을 고려할 때-응용 프로그램이 많은 양의 데이터베이스 쿼리를 만드는 경우 응답 시간을 낮게 유지하여 동일한 시스템에 모두 유지함으로써 상당한 양의 네트워크로드를 제거 할 수 있습니다.


2

나는 두 기계가 일반적으로 다른 방식으로 최적화되어야하기 때문에 그것이라고 생각합니다. 그 외에는 공개 시스템이 아닌 경우 동일한 시스템에서 서버 데이터베이스를 사용하여 모든 응용 프로그램을 실행하지만 문제는 없습니다.

웹 응용 프로그램은 일반적으로 데이터베이스 내부의 스키마가 아닌 경우 최소한 데이터에 거의 무제한으로 액세스 할 수 있기 때문에 너무 많은 사람들이 두 시스템 모두에 대해 하나의 시스템이 손상되는 것을 걱정한다고 상상할 수 없습니다.

다른 사람들의 말에 관심이 있습니다.


1
조지, 마크 브라켓의 대답을 참조해야한다고 생각합니다. 웹 서버가 데이터베이스에 가지고있는 보안은 서버가 분리 된 경우와 같지 않습니다. 특히 "로컬 디스크"에 액세스 할 수 없습니다. 또한 많은 웹 사이트 중 하나의 웹 사이트 만 해킹 된 경우 해당 연결 문자열에 너무 강력한 사용자를 사용하지 않는 한 THAT SITE의 데이터베이스에 대한 액세스 권한 만 손상되었을 수 있습니다. 수많은 다른 시나리오가 있지만 여기에 의견이 있다고 생각하지 않습니다.
Dylan-INNO Software

2

나는 그 팟 캐스트를 듣고 재미 있었지만, 보안 주장은 나에게는 의미가 없었다. 서버 A를 손상시키고 해당 서버가 서버 B의 데이터에 액세스 할 수 있으면 서버 B의 데이터에 즉시 액세스 할 수 있습니다.


사실이 아니다. Box A가 Box B에 대해 갖는 모든 데이터 또는 권한에 액세스 할 수 있습니다. 보안 설정에서는 Box A의 앱이 보유한 최고 수준의 DB 액세스 권한이 있음을 의미합니다. 그러나 당신은 DB에 대한 욕구를 가지지 않거나 Box B의 OS에 뿌리를두고 있지 않습니다.
Mark Brackett

2
"박스 A가 박스 B에 필요한 모든 데이터 또는 권한에 액세스 할 수 있습니다."- "서버 B의 데이터에 즉시 액세스 할 수 있습니다"라는 의미입니다. RDBMS가 상자 A에 있고 상자 B가없는 경우 어떤 차이점이 있습니까? NB. 상자 A를 이미 해킹했다고 가정합니다.
Daniel Earwicker

두 개의 상자 구성에서 최소 권한 원칙을 적용하는 경우 상자 A (웹)가 손상되면 상자 B의 DB를 잃어버린 것보다 더 이상 최악의 상황이 발생합니다.
Kev

1
그리고 하나의 박스 설정에서, 하나의 박스가 손상되면 DB가 포함 된 하나의 박스가 손실됩니다. 차이점이 뭐야?
Daniel Earwicker

2
차이점은 2 박스 구성에서 웹 서버가 손상되면 웹 서버와 최악의 DB 만 손실됩니다. 나머지 DB 서버의 무결성이 유지됩니다.
Kev

2

데이터베이스 라이센스는 엉성하지 않으며 종종 CPU마다 청구되므로 웹 서버를 분리하면 데이터베이스 라이센스 비용을 줄일 수 있습니다.

예를 들어 8 개의 CPU를 포함하는 웹과 데이터베이스를 모두 수행하는 서버가 1 개인 경우 8 개의 CPU 라이센스를 지불해야합니다. 그러나 각각 4 개의 CPU를 가진 두 개의 서버가 있고 하나의 서버에서 데이터베이스를 실행하는 경우 4 개의 CPU 라이센스에 대해서만 비용을 지불하면됩니다.


이것이 어떻게 절약되는지 설명하십시오.
John Saunders

1
John-그는 두 대의 컴퓨터와 동등한 성능을 얻으려면 코어 수를 두 배로 늘려야하므로 SQL Server 라이센스 비용이 두 배로 증가한다고 말합니다. 두 대의 컴퓨터를 사용하는 것과 동일한 성능으로 SQL Server에 추가로 $ 10-20k를 지불해야하는 이유.
경고음 경고음

성능 / 자원 활용률 (예 : CPU)이 db 서버가 아닌 앱 서버에 의해 지배되는 경우에만 true입니다. db에 8 CPU가 필요한 경우 작동하지 않습니다.
Andreas Dietrich 12

1

또 다른 문제는 데이터베이스가 사용 가능한 모든 메모리를 가져 와서 사용하고 싶을 때를 대비하여 보관하는 것입니다. 메모리를 강제로 제한 할 수는 있지만 데이터 액세스 속도가 상당히 느려질 수 있습니다.


-1

웹 서버에서 데이터베이스 서버를 실행함으로써 실제 성능 향상이 있다고 주장하는 것은 잘못된 주장입니다.

데이터베이스 서버는 쿼리 문자열을 가져와 결과 세트를 리턴하므로 실제로 데이터 서버에서 웹 서버로 흐르는 데이터는 비교적 작지만 쿼리를 처리하고 결과 세트를 생성하는 데 필요한 마력은 상대적으로 큽니다. 따라서 데이터 전송 시간을 중심으로 성능을 최적화하는 것은 잘못된 일을 최적화하는 것입니다.

보안과 관련하여 데이터 서버를 웹 서버와 다른 상자에두면 이점이 있습니다. 그러한 설정을하는 것이 전부가 아니며 모든 보안을 끝내는 것이 아니라 올바른 방향으로 나아가는 단계입니다.

확장 성과 관련하여 증가 된 트래픽을 처리하기 위해 웹 서버를 추가하고 클러스터에 배치하는 것이 쉽고 비교적 저렴합니다. 데이터 서버를 추가하고 클러스터하는 것은 그렇게 쉽고 저렴하지 않습니다. 또한 웹 서버와 데이터 서버에는 하드웨어 요구 사항이 다르므로 여러 상자가 확장 성을 지원합니다.

소규모로 시작하고 상자가 하나만 있으면 가상 머신을 사용하는 것이 좋습니다. 한 호스트의 다른 VM에서 웹 서버와 데이터 서버를 실행하면 하나의 큰 상자 가격으로 별도의 상자를 모두 얻을 수 있습니다.


1
원래의 질문은 웹 서버가 반드시 공개 인터넷이 아닌 응용 프로그램 서버에 대한 질문이었습니다.
João Bragança

-2

운영 체제는 또 다른 고려 사항입니다. 데이터베이스에는 더 큰 메모리 공간이 필요할 수 있으므로 UNIX가 필요할 수 있지만 웹 서버 또는 더 구체적으로 두 개의 계층 만 언급하므로 앱 서버는 .Net 기반 일 수 있으므로 Windows가 필요합니다.


나는 이것을 투표하지 않았지만 "데이터베이스에 더 큰 메모리 공간이 필요하기 때문에 UNIX가 필요할 수 있습니다"-64 비트 윈도우와 64 비트 SQL을 실행하는 경우 많은 메모리가 필요합니다.
Kev

죄송합니다. 분할 된 OS를 배포하기 위해 메모리를 사용해야하는 이유가 메모리였습니다. 다른 이유는 다음과 같습니다. 성능, 보안, 기업 표준 / 라이센스, 공급 업체 지원 등
Chris Noe

-6

확인! 다른 머신에 DB 서버를 설치하고 웹 서버에 애플리케이션을 설치하는 것이 더 안전합니다. 그런 다음 웹 링크를 사용하여 애플리케이션을 DB에 연결하십시오. 고마워


3
왜 더 안전한가요?
Bryan Chen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.