'000.프로그래밍/00. Personal Notes'에 해당되는 글 7건

  1. 2015.05.07 [번역]MongoDB Tutorials - Overview
  2. 2015.02.11 개념 정리 (asp.net -1)

http://www.tutorialspoint.com/mongodb/index.htm


MongoDB - Overview


MongoDB는 cross-platform의 document oriented DB이다. 높은 수준의 성능과 가용성, 쉬운 확장성을 제공하며 Collection과 Document의 개념 내에서 동작한다.

(참고 : Document-Oriented DB가 뭥미? http://lambdaexp.tistory.com/38, ORM(Objected Relational Mapping)을 왜 쓸까? http://www.tutorialspoint.com/mongodb/mongodb_overview.htm)


Database

 Database는 collection을 위한 물리적 그릇이라고 볼 수 있다. 각각의 database는, 각각의 파일 시스템을 갖춘 파일들의 셋을 가지고 있다. 하나의 MongoDB 서버는 일반적으로 여러 개의 데이터베이스를 가진다.


Collection

 Collection은 MongoDB document의 집합체이다. RDBMS table과 같으며 collection은 하나의 데이터베이스 내에 존재한다. Collection은 꼭 일정한 틀을 갖출 필요가 없으며 한 collection내의 document들은 서로 다른 filed를 가질 수도 있다. 일반적으로 하나의 collection내의 모든 document들은 비슷하거나 연관이 있는 목적으로 만들어져 있다.


Document

 document는 key-value pair의 집합이다. document는 dynamic schema를 가지고 있다. Dynamic schema가 뜻하는 것은 같은 Collection 내의 document들이 꼭 같은 field들 혹은 구조를 가질 필요가 없다는 것과, 하나의 collection의 document들의 공통된 field가 서로 다른 data 타입의 값을 가지고 있을 수 있다는 것이다.


아래는 RDBMS 용어와 MongoDB와의 관계를 보여주는 표이다.

RDBMSMongoDB
DatabaseDatabase
TableCollection
Tuple/RowDocument
columnField
Table JoinEmbedded Documents
Primary KeyPrimary Key (Default key _id provided by mongodb itself)
Database Server and Client
Mysqld/Oraclemongod
mysql/sqlplusmongo

document 예제

 아래의 예제는 한 블로그 사이트의 document 구조를 나타내고 있다. 간단하게 콤마로 key-value pair를 구분하였다.


 _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100, 
   comments: [	
      {
         user:'user1',
         message: 'My first comment',
         dateCreated: new Date(2011,1,20,2,15),
         like: 0 
      },
      {
         user:'user2',
         message: 'My second comments',
         dateCreated: new Date(2011,1,25,7,45),
         like: 5
      }
   ]
}


_id 는 12 바이트의 16진수의 수이다. 이는 각각의 document의 유일성을 결정한다. _id 값은 직접 값 설정을 해 줄 수 있다. 만약 설정을 하지 않았다면 MongoDB 자체에서 매 document마다 생성을 해준다. 이 때 이 12 바이트는 현재 timestamp의 첫 4 바이트와 machine id 3 바이트, mongodb server의 pid의 2 바이트로 이루어 져 있으며 나머지 3 바이트는 단순한 증가값으로 채워진다.

Posted by Righ
,


ASP.NET 마스터하기 #3 – ASP.NET의 아키텍처


asp.net

.NET 프레임워크를 기반으로 한 웹 애플리케이션 개발 모델, 프레임워크, 관련 기술을 총칭해서 부르는 것.


=>

1. ASP.NET은 .NET 프레임워크를 기반으로 한다. 따라서 .NET에서 제공하는 클래스 라이브러리를 사용할 수 있으며, 프로그래밍 언어로는 .NET이 제공하는 모든 언어를 사용할 수 있고, .NET 프레임워크 기반의 애플리케이션에 적용되는 모든 요소들이 ASP.NET에서 적용이 된다. 즉, .NET에 대해서 잘 알지 못하면서 ASP.NET을 잘 안다는 것은 불가능 하다.


2. ASP.NET은 웹 애플리케이션을 만들기 위한 것이다. 따라서 일반적인 웹 애플리케이션의 특성을 그대로 가지며, 웹 애플리케이션이 수행 가능한 범위 내에서만 능력을 발휘할 수 있다.


3. ASP.NET은 '엔터프라이즈 수준'의 애플리케이션을 맞추는데 가장 큰 초점을 맞추고 있다. 따라서 간단한 애플리케이션들을 만드는 데는 최적의 개발 모델이 아닐 수 있다는 점을 염두에 두어야 한다. 또한 엔터프라이즈 애플리케이션을 개발 할 때 고려해야 할 사항들에 대해서도 알 필요가 있다.


웹의 동작 방식

1) Request & Response의 구조를 취한다.

2) 기본적으로 전송 시에 HTTP 프로토콜을 사용한다.

3) Request를 보내고, Response를 처리하는 웹 클라이언트가 있어야 한다.

4) Request를 처리하고, Response를 보내는 웹 서버가 있어야 한다.

5) 기본적으로 Request에는 Get 방식과 Post 방식이 존재한다.

6) 기본적으로 Response의 최종 형태는 정적 HTML 이다.




빨간색 : ASP.NET에 해당하는 부분

ex)  대용량 바이너리 데이터를 전송하기 위해 HTTP 업로드 컴포넌트가 나옴(1) 

HTTP 이어받기 기능 등장(1)

주고 받는 프로토콜의 전송 수준에서의 보안을 위해 SSL이 등장(1)

최대한 많은 요청을 가장 빨리 처리하기 위해 웹 서버 기술이 발전(2)     

요청에 따라 동적으로 응답을 생성해 내기 위해 웹 서버 애플리케이션 기술(CGI, ISAPI, ASP, ASP.NET, PHP 등)이 나옴(3) 

정적 컨텐츠인 HTML에 동적인 측면과 상호작용성(interactivity), 재사용성을 부여하기 위해 DHTML, JavaScript, CSS, ActiveX, 애플릿 등이 나오게 됨(4) 

효율적으로 요청을 처리하고, 응답 속도를 보다 빠르게 하고, 응답 결과를 렌더링 해서 보여주기 위해 브라우저 기술이 발전(5)



 초기의 웹 서버는 HTML, 그림 파일과 같은 정적 컨텐츠에 대한 요청을 받아서 이를 그대로 전달할 뿐이었다. 즉 초기의 웹은 '통신'보다는 FTP나 Gopher와 같은 '전송'을 한다는 의미가 강했다. 웹이 진화 되면서 정적 컨텐츠가 아닌 동적 컨텐츠를 전달할 방법이 없을까 궁리하게 되었고, 동적 요청을 위한 매개 변수를 어떻게 전달할 것 인가와 이를 받아서 어떻게 처리해야 하는 가라는 문제가 대두 되게 된다.

 매개 변수의 전달은 Get, Post 방식이 존재한다. Get방식은 URL 뒤에 ?이후에 키=값 쌍으로 이루어진 Query String을 붙여서 매개변수를 전달하는 방법이고, 이에 비해 Post 방식은 태그를 사용하며, 키=값 쌍을 HTTP 헤더 내에 집어 넣어서 전달하는 방법이다.

 정적 컨텐츠에 대한 요청과 동적 컨텐츠에 대한 요청을 구분하기 위해 편의상 동적 컨텐츠 만의 확장자를 사용하게 된다. 즉, .html이나 .htm 대신에 .cgi .asp .php .jsp .aspx 등을 사용하게 된 것이다. 이렇게 동적 컨텐츠로 구분되는 확장자로 요청이 들어올 경우, 웹 서버는 이를 가로채서 동적 컨텐츠 처리 모듈에 던져주게 된다.

 동적 컨텐츠를 처리하는 모듈, 즉 웹 애플리케이션은 최초에는 CGI 형태가 사용되었지만, 시간이 흐름에 따라 ISAPI 방식과 Script 기반 방식 등으로 진화 되어 나갔다. 현재 우리가 사용하고 있는 대부분의 방식은 Sxript 기반 방식으로 보면 된다. ASP.NET 역시 여기에 속한다고 보면 된다.


CGI -> ISAPI -> Script 기반 방식으로 변경되어 온 이유는????

1) 복잡한 것에서 간단한 것으로의 이동( CGI 시절에는 C나 C++을 알아야 하는 것은 기본, 소스 분석에 상당한 시간을 투자해야 했음)

2) 보다 적은 리소스를 소모하면서 보다 많은 요청에 대응해야 한다는 목적을 달성해야 했음. CGI 시절에는 요청 당 하나씩의 프로세스가 만들어졌었다. ISAPI 방식은 이를 보완하여, 요청 수와 관계 없이 프로세스는 하나만 만들고, 요청 당 처리 모듈은 DLL 형태로 만듦.

(ASP의 경우 asp.dll이 .asp 확장자에 대한 처리를 하는 ISAPI 모듈이다.)

3) ASP.NET 역시 이러한 ISAPI 방식을 동일하게 사용하지만 기존 ASP에서 발생되는 문제점을 해결하기 위해 아래와 같이 아키텍처가 변경되었다.


* ASP의 아키텍처와 문제점

 ASP는 기본적으로 IIS 웹 서버 상에서 사용될 목적으로 만들어졌다. ASP가 처음 등장한 건 훨씬 이전이긴 하지만, 널리 사용된 것은 NT4.0의 옵션팩에 탑재된 IIS4.0이므로 이를 기준으로 하면 다음과 같다.

 IIS 4.0 시절, ASP가 구동되는 기본 아키텍처는 아래와 같은 In-Process 모델이다.

inetinfo.exe는 System 계정으로 구동되는 IIS의 메인 프로세스이다. 이 프로세스는 .asp 확장자에 대한 요청이 올 때 asp.dll을 자신의 프로세스 내에서 로딩해서 요청을 처리하게 된다.

이 In-Process 모델의 문제는 asp.dll 내에서 문제가 발생해서 asp.dll이 죽어버린 경우, 메인 프로세스인 inetinfo.exe마저 죽어버린다는 것이다. 쉽게 말해서 무한 루프를 도는 .asp 페이지가 있는 경우, 그 페이지 하나 때문에 웹 서버 전체가 먹통이 되어 버린다는 것이다.

 Windows 2000과 Windows XP의 IIS 5.x에서는 이를 방지하기 위해 COM+ 서비스와 IIS를 결합하여 다음과 같은 옵션을 가지게 된다.

우선 '낮음(IIS 프로세스)'은 IIS4.0의 In Process 모드와 동일한 것이다. 성능은 가장 좋지만 안정성은 가장 떨어진다.


보통(풀링됨)과 높음(격리됨)은 웹 애플리케이션을 inetinfo.exe 내에서 구동 하는게 아니라 별도의 프로세스(dllhost.exe)에서 구동하는 Out-of-Process 모델이다. 둘 다 기본 개념은 유사하지만 약간의 차이점은 있는데, 먼저 '보통(풀링됨)'으로 지정된 웹 애플리케이션들은 하나의 dllhost.exe내에서 풀링 되어 동작하게 된다.

쉽게 설명하면 inetinfo.exe가 아닌 별도의 dllhost.exe 안에서 In Process 모드처럼 동작한다고 보면 된다. 풀링된 애플리케이션들은 모두 단일한 dllhost.exe 내에서 동작한다. 이와 관련하여 구성요소 서비스에서는 Out-of-Process Pooled Applications 라는 COM+ 애플리케이션을 찾아볼 수 있다.


풀링은 성능(리소스)과 안정성이라는 양쪽을 나름대로 절충한 것이다. 일단 inetinfo.exe와 dllhost.exe라는 두 개의 프로세스로 분리함으로써 안정성은 어느 정도 확보되지만, 역시 풀링되어 있는 애플리케이션이 죽었을 경우에는 같은 dllhost.exe 내의 다른 애플리케이션도 같이 죽는다는 단점이 있다.


높음(격리됨)은 각 웹 애플리케이션을 별도의 dllhost.exe에서 동작시키는 방법이다.

완전히 격리를 시키는 것이기 때문에 안정성 측면에서는 가장 우수하겠지만, inetinfo.exe 입장에서는 n개의 dllhost.exe와 Out-Of-Process 통신을 해야하며, n개의 dllhost.exe가 돌게 되므로 사용되는 리소스가 더 많아져서 성능이 다소 떨어지게 된다.


IIS 5.x에서는 이러한 형태로 ASP 애플리케이션에 대해 나름대로의 안정성을 확보했지만, 역시 여기서도 제기되는 단점들은 존재한다. dllhost.exe는 한번 구동되면 명시적으로 종료를 시켜주기 전까지는 계속해서 구동하게 된다. 따라서 문제(데드락 같은 상황)가 발생했을 때는 반드시 수동으로 재시작을 해줘야 한다. 즉, 자신이 죽는다고 해서 웹 서버 전체나 다른 웹 애플리케이션에 영향을 미치는 것은 해결했지만, 자기 자신이 죽었을 때 처리할 수 있는 방법이 모호하다는 것이다. 또한 버그 등으로 인해 리소스의 누수가 발생하는 경우 애플리케이션을 재시작함으로써 리소스의 클린업을 할 수 있는데, 이러한 과정(통상 Recycling이라고 함)을 지원하지 않는다. 또한 dllhost.exe는 웹 애플리케이션만을 위한 전용이 아닌 COM+ 서버 활성화 모드 (Out-of-Process)에서 사용되는 범용 호스팅 프로세스이다. 그렇기 때문에 웹 애플리케이션을 위한 구성 정보를 설정해서 동작 특성을 변경하는 것을 지원하지 않는다는 것이다.


 IIS가 죽을 경우 재시작을 하게 되는데 재시작을 해도 해결이 되지 않는 문제가 존재한다. 대표적인 것으로 ASP 시절에는 상태 정보, 즉 세션을 IIS 프로세스 내에서 In Process 모드로 관리한다. 즉, IIS를 재시작하게 되면 세션 정보가 날아가 버린다는 것이다.

 IIS가 죽을 때 상태 정보가 손실되는 것도 문제지만, 웹 팜(Web Farm) 환경처럼 웹 서버를 여러대 두고 로드 밸런싱하는 경우 역시 문제가 된다. 이 경우 서버 간의 상태 정보를 공유해야 할 지 방법이 막연해 진다. 결국엔 L4를 Dedicated 모드(Per Session)로 설정해서 세션을 고정시켜 버리거나 상태 정보를 DB와 같은 제 3의 저장소로 돌려서 우회해야 한다. 전자는 로드 밸런싱의 취지를 저하시키게 될테고, 후자는 이를 지원하기 위한 코드를 직접 다 작성해야 한다는 단점이 있다.


*ASP.NET의 아키텍처와 개선 사항


ASP.NET 설치 시에 aspnet_isapi.dll이라는 ISAPI 처리기가 등록된다. 이 것은 .aspx와 같이 ASP.NET 관련 확장자를 가로채서 실제로 처리하는 작업자 프로세스(Worker Process)인 aspnet_wp.exe 에게 전달한다. aspnet_wp.exe는 내부에 요청의 전후에 개입하기 위한 HttpModule개별 요청을 처리하기 위한 HttpHandler로 구성된다. HttpModule이나 HttpHandler는 기본으로 제공되는 것 이 외에 사용자가 정의해서 확장하는 것이 가능하다.

 ASP.NEt은 별도의 전용 프로세스인 aspnet_wp.exe에서 구동되므로 자신이 죽더라도 inetinfo.exe에는 영향을 미치지 않는다. 따라서 이전 dllhost.exe에서 구동될 때처럼 안정성 측면에서는 확보가 된 셈이다. aspnet_isapi.dll은 실행 중인 aspnet_wp.exe가 없을 때는 바로 이 프로세스를 다시 실행하며, 구성 정보에 따라서 aspnet_wp.exe의 동작을 제어할 수도 있다. machine.config의 <processModel> 내용을 보면 이를 제어하기 위한 내용들이 존재한다. timeout을 지정해서 일정 시간 동안 요청이 없으면 종료 시켜버릴 수도 있고, 일정 시간 이상 데드락이 걸렸을 때는 재시작하는 기능도 존재한다. 다양한 구성 정보에 다라서 동작 특성을 제어하는 것 역시 가능해 졌음을 의미한다.

 위 그림의 우측에 보면 aspnet_state.exe라는 프로세스가 있다. ASP.NET 역시 기본적으로는 세션을 In Process 모드로 관리하지만, 설정에 따라서 그림과 같이 세션을 별도의 프로세스(aspnet_state.exe)에서 관리할 수 있다. 다라서 aspnet_wp.exe가 죽는다고 하더라도 세션 정보 자체는 여전히 살아있게 된다.

Posted by Righ
,