Korea Evangelist

Developer & Platform Evangelism, Microsoft Korea

  • Korea Evangelist

    Windows Azure에서 웹 어플리케이션을 구축하는 방법 (1) - 웹사이트, 클라우드 서비스, 가상머신 위의 웹서버

    • 0 Comments

    안녕하세요. 김대우입니다.

    이번 포스팅에서는 Windows Azure에서 웹 어플리케이션을 구축하는 방법을 통해 Windows Azure의 어떤 웹 서비스가 나에게 적절할지 알아보는 시간을 가지려고 합니다.

    Windows Azure에서 웹 어플리케이션을 구축하는 방법 (1) - 웹사이트, 클라우드 서비스, 가상머신 위의 웹서버

    Windows Azure에서 웹 어플리케이션을 구축하는 방법 (2) - 시나리오 및 상세 기능 비교

    Windows Azure 적용을 처음 고려 중인 개발사와 이야기 하다 보면, 항상 받는 질문이 있습니다.

    - 늘 하던 대로, 가상머신(Virtual Machine) 위에 웹서버를 올리고 PHP나 Node.js를 올려 단순한 웹 서비스를 하려고 합니다.

    - HTTP 기반 REST API로 모바일 게임을 위한 웹 서비스를 올���려고 해요. 가상머신 써야죠. DB도 올려야 하고.

    - Windows Azure 웹사이트? PaaS가 뭔가요? 

    포스팅을 계속 진행하기 전, IaaS나 PaaS에 대해 명확히 알고 싶으신 분들은 아래 내용을 참조 하세요.

    IaaS, PaaS, SaaS - 누구나 클라우드를 말한다.

    Windows Azure는 IaaS만을 주로 제공하는 타 클라우드 사업자들과 다르게 IaaS와 PaaS, On-premise를 모두 제공하고 있습니다.

    Windows Azure에서 웹서비스를 일반적으로 제공하는 방법은 세가지로 볼 수 있어요.

    1) Windows Azure Web Sites를 이용하는 방법

    2) Cloud Services 를 이용하는 방법

    3) Virtual Machines을 이용하는 방법

    세 가지 방법 모두, 클라우드의 장점인 유연하고 확장 가능한 어플리케이션을 생성 가능합니다. 하지만, 몇 가지 차이점이 있고 미리 검토해 두시면 이후 플랫폼에 대한 선택이 편해지고 클라우드 서비스 개발과 배포가 무척 쉬워지니 참고 하시면 되실거에요.

    이번 포스팅에서는 이 세가지의 차이를 구조와 기능적인 면에서 간략히 소개해 드리고, 다음 포스팅에서는 서비스 구축 시나리오별로 어떤 웹서비스를 선택하시면 좋을지 논의 드리는 시간을 가지도록 하겠습니다.

    Windows Azure 웹사이트, 클라우드 서비스, 가상머신을 한눈에 비교하면!!!

    image_thumb.png

    이 이미지 만으로도 감이 뽝 오는 분 계실겁니다. 조금 더 상세히 살펴보시지요. 

    1) Windows Azure 웹사이트 – PaaS

    - 대부분의 경우 웹 어플리케이션을 위한 최선의 선택

    - Classic ASP, ASP.NET, PHP, Node.js, Python 지원(2014년 3월 14일 기준)

    - 단순하고 유연한 배포 및 관리 옵션 제공 - Git, GitHub, Bitbucket, CodePlex, TFS 및 DropBox (2014년 3월 14일 기준)

    - 초소형 사이트부터 대용량 서비스까지 확장 가능

    - 워드프레스와 같은 블로그 엔진이나 해외 유명 CMS들로부터 바로 웹사이트 생성 가능 – Windows Azure 웹사이트 갤러리

    - WebJob을 이용해 백그라운드로 스케쥴링된 작업 수행 가능

    2) Windows Azure 클라우드 서비스 – PaaS

    - 멀티 티어로 제작되어 개별 티어에서 독립적으로 확장 가능한 웹 어플리케이션 서비스 –클라우드 서비스가 대규모 서비스에 이용되는 가장 큰 이유죠.

    - 웹 어플리케이션에서 추가적인 시스템에 대한 권한이나 네트워크 기능이 필요할 경우

    - 프러덕션 모드나 스테이징 모드로 배포 환경 구성 가능

    3) Windows Azure 가상머신 - IaaS

    - 서버 시스템의 로우레벨 리소스 접근이 필요할 경우

    - 서버 어플리케이션(특수 DB서버나 서비스 연동이 필요할 경우) 동작

    - LOB 어플리케이션

    - 다양한 버전의 윈도우 서버와 리눅스 서버를 선택 가능

    이 정도의 내용이면 대략 어떤 서비스를 이용해야 할지 감이 오실 것 같아요.

    PaaS 서비스인 웹사이트와 클라우드 서비스는 OS 업데이트나 유지관리 작업에서 자유로울 수 있다는 것도 큰 장점입니다.

    자! 이렇게 간단히 살펴 보았구요, 다음 포스팅을 통해 Windows Azure의 시나리오 별 선택 가이드와 상세 기능 비교를 진행하도록 하겠습니다. 감사합니다.

    참고링크

    Windows Azure에서 웹 어플리케이션을 구축하는 방법 (1) - 웹사이트, 클라우드 서비스, 가상머신 위의 웹서버

    Windows Azure에서 웹 어플리케이션을 구축하는 방법 (2) - 시나리오 및 상세 기능 비교

    IaaS, PaaS, SaaS - 누구나 클라우드를 말한다.

    Windows Azure 웹사이트 갤러리

    사설(Private) 클라우드 vs 공용(public) 클라우드, SaaS vs ASP, IaaS vs PaaS vs SaaS의 대결! (1/3)
    사설(Private) 클라우드 vs 공용(public) 클라우드, SaaS vs ASP, IaaS vs PaaS vs SaaS의 대결! (2/3)

    사설(Private) 클라우드 vs 공용(public) 클라우드, SaaS vs ASP, IaaS vs PaaS vs SaaS의 대결! (3/3)

    Windows Azure Web Sites, Cloud Services and Virtual Machines comparison
    Windows Azure Websites, Web Roles, and VMs: When to use which?

  • Korea Evangelist

    소치 동계 올림픽은 어떤 클라우드 플랫폼과 기술들을 이용해 서비스를 제공했을까

    • 0 Comments

    안녕하세요, 김대우입니다.

    이번에 소개해드릴 내용은 가장 최근 Windows Azure 적용 사례로 널리 알려진 러시아 소치 동계 올림픽 적용 사례 입니다.

    지난 2012년 런던 올림픽에 적용된 Windows Azure 사례에 이어, 2014 소치 동계 올림픽도 Windows Azure를 선택했어요.

    image_thumb_1.png

    http://www.sochi2014.com/en - 2014 소치 동계 올림픽 공식 사이트

    왜 클라우드인가 - 올림픽과 클라우드 서비스의 상관관계

    올림픽 웹서비스의 특성상, 올림픽 기간에 트래픽이 전세계에서 몰렸겠죠. 올림픽과 같은 전세계인의 축제는 어쩌면 전형적인 클라우드 플랫폼 사례일거에요.

    올림픽 기간 동안 발생하는 예측하기 어려운 순간적인 트래픽 폭증, 매 순간순간 발생되는 수많은 데이터, 피겨 스케이팅과 같은 인기 종목은 아시는 것처럼, 새벽 4시도 전국민의 본방사수 시간이죠. (김연아 선수 최고입니다!)

    네, 러시아 소치 올림픽은 Windows Azure를 서비스 플랫폼으로 선정 했습니다.

    Microsoft for the Sochi Olympics 2014

    공식 발표된 내용 외에 내부적으로는 클라우드 기술들을 200% 활용해 구성했어요. 아키텍처 구성이나 운영, 보안 처리 등에 대해서도 드릴 이야기가 많지만, 이번에는 공식발표된 내용만 다뤄 보도록 할게요.

    sochi2014.com 웹사이트를 Windows Azure로 서비스

    During the period of staging of the Sochi Olympics, more than 100 million visits hit the official website.

    - The maximum number of visitors was from Russia, USA, Canada, Ukraine and France.

    - The Figure Skating and unofficial Medal Standings attracted greatest interest.

    - At peak load, more than 175 thousand visitors were on the website at the same time. The difference between the peak load and minimum load was 15-fold

    - They browsed webpages with live results generating more than 90 thousand requests per second.

    - More than 5 million users visited the website daily. They viewed more than 30 million pages.

    - Windows Azure was used to provide information from mobile devices based on any type of platform (more than 6 million of app installations).

    - Overall, during the Games, users viewed more than 500 million pages, generating more than 25 billion requests to Windows Azure virtual machines.

    - Microsoft Enterprise Services designed and developed the web site solution, and had a team of 23 people standing by to assist 24/7 on site.

    숫자상으로만 봐도 대단히 많은 일들이 Windows Azure위에서 일어났네요.

    기술적인 부분에서, 위의 소개에는 VM을 이용한다고 되어 있어요. 이는 IaaS의 가상머신이 아닌 PaaS인 클라우드 서비스 서비스 가상머신이 사용되었고, 소치 동계 올림픽 웹 서비스와 인프라 서비스 거의 모든 부분이 PaaS가 가진 장점을 살려 클라우드 서비스를 위한 아키텍처로 구성되었습니다. Windows Azure는 IaaS와 PaaS를 모두 제공하고 있어요.

    올림픽이라면 0.1초의 순간도 놓칠 수 없는 영상 서비스가 백미이죠. 소치 올림픽에 적용된 미디어 서비스, 바로 미디어 부분을 봐 볼까요.

    소치 올림픽에서 제공된 클라우드 기반 미디어 서비스, 얼마나? 어떻게? – Windows Azure Media Service

    Microsoft and our global partners helped deliver more than 200 HD streams to an audience of over 900 million, 100 million of whom watched on PCs, mobile phones, tablets and other devices from 22 different countries on four continents.

    To date, the partners we have attracted and are working with include various on-demand and live encoding vendors, content encryption and DRM providers, automated metadata creation tools, file sharing and high speed file transfer solutions, content management systems, audience analytics and advertising engines, and many others are now available for use on Azure Media Services

    Martin Wahl, Principal Program Manager, Microsoft Windows Azure - Microsoft: “The cloud is going to be revolutionary”

    미디어 서비스의 복잡성은 실제 미디어 프로젝트를 해 보시면 알 수 있지요.

    LIVE 또는 VOD 영상을 서비스하기 위해 들어가는 수 많은 단계와 기술들은 기본에, iOS나 안드로이드는 물론 다양한 디바이스와 플랫폼에 안정적인 속도로 전세계에 제공해야 한다는 건 거의 불가능에 가깝습니다. 이것을 하나의 플랫폼으로 제공 가능한 기술이 Microsoft Windows Azure Media Service 입니다.

    image_thumb.png

    Media Service가 생소한 분들도 계실 것 같아요. 미디어 서비스에 필요한 모든 과정들을 클라우드의 강력한 컴퓨팅 능력과 성능을 활용해 처리 가능하고, DRM부터 광고, VOD는 물론 Live 방송에 분석 서비스까지 하나의 프레임워크로 제공 가능한 서비스 입니다.

    Windows Azure Media Service로 어떤 소치 동계 올림픽 서비스가 탄생 했는가?

    4개 대륙 22개 국가에서 Windows Azure Media Service가 적용 되었지요. 이 국가들 중에서 미국 NBC의 사이트를 살펴 보도록 할게요.

    image_thumb_2.png

    NBC의 소치 동계 올림픽 공식 사이트 - http://www.nbcolympics.com/

    NBC의 영상 서비스와 Windows Azure에 대해 소개된 자료를 몇 개 살펴 볼게요.

    NBC와 마이크로소프트 Windows Azure 파트너쉽 – Windows Azure Media Service로 실시간 스트리밍과 VOD 서비스제공을 살펴 보시면 어떤 역할을 제공했는지 조금 더 감을 잡으실 수 있을 것 같아요.

    올림픽도 4년간 생명을 가진 기업이다. 전사적 자원 관리 솔루션 - Microsoft Dynamics AX

    소치 동계 올림픽 운영위원회가 사용한 올림픽 ERP 솔루션으로는 Microsoft Dynamics AX가 사용되었습니다. ERP 솔루션으로 우리에게 익숙하지는 않지만 해외에서는 많은 점유율을 가지고 지속 성장 중인 제품이에요.

    image_thumb_3.png

    http://www.microsoft.com/en-us/dynamics/sochi-2014.aspx

    자 이렇게 해서 간략히 소치 동계 올림픽이 사용한 클라우드 기술, Windows Azure에 대해서 알아 보았습니다.

    아키텍처나 내부적인 데이터 처리 등등 여러 드리고 싶은 이야기가 많지만, 공유해 드릴 수 없는 내용이라 아쉬워요. 4월 2일에 //Build 행사가 있는데 여기에서 Windows Azure가 소치 동계 올림픽에 어떻게 적용되었는지 상세히 다뤄지겠지요.

    많은 도움 되시길 바랍니다.

    Announcing NBC Partnership to Live Stream the Sochi Olympic Games

    NBC의 소치 동계 올림픽 공식 웹사이트

    Microsoft: “The cloud is going to be revolutionary”

    Windows Azure Media Services and the London 2012 Olympics

    NBC와 마이크로소프트 Windows Azure 파트너쉽 – Windows Azure Media Service로 실시간 스트리밍과 VOD 서비스제공

    Microsoft Dynamics and the Sochi 2014 Organizing Committee

    2012년 런던 올림픽에 적용된 Windows Azure

    Windows Azure Media Service 정식 서비스 시작!

    [동영상 강좌] (20) Windows Azure 미디어 서비스 API 활용하기

    가트너도 인정한 마이크로소프트의 클라우드 서비스

  • Korea Evangelist

    테크데이즈 미니 토요세미나 발표자이신 송원석님을 미리 만나 보았습니다

    • 0 Comments

    안녕하십니까? 오늘은 최근 WebAPI 관련 문서를 한글화 하여 공개해 주신 송원석님을 모시고 이야기를 나누어 보았습니다.

    김명신: 근황에 대해서 이야기 해주실 수 있을런지요?

    송원석 (3)송원석: 현재는 프로젝트에 투입되어 공통 모듈 개발 업무를 진행하고 있습니다. 최근들어 특히 정부 기관이나 관공서들을 중심으로 ActiveX의 사용을 자재하고 순수 HTML/JavaScript 기반의 브라우저 플랫폼을 요구하는 곳이 많이 있습니다. 이 과정에서 필요한 기술 자문과 더불어 공통 모듈 개발을 수행하고 있습니다. 어플리케이션에 대한 설계를 담당하시는 분들이 개발 환경이나 운영환경에 대한 이해도가 떨어지는 경우가 꽤나 있는데, 이 때 다양한 개발/운영 환경의 영향성을 파악해서 자문의 역할을 수행하고, 다양한 개발자들의 이해관계를 조율하고 업무적으로 재사용성이 있는 모듈들을 개발하여 실무 개발자들이 좀 더 빠르고 편하게 개발할 수 있도록 돕는 역할을 한다고 보시면 맞을 것 같습니다. 현재 진행 중인 업무는 대략 2년 남짓의 기간 동안 진행 중에 있습니다. 이 일을 본격적으로 시작하기 전에는 상당 기간 동안 전자조달 업무를 진행하기도 하였고, 싱가폴에서 개발업무를 진행한 경험도 있습니다. 사회에 발을 처음 디디고 국내에 정보통신 업계의 하도급 문화와 관행에 문화적인 충격을 느껴서 해외로 나갔던 것인데요, 싱가폴에 근무하던 회사도 한국계 회사이다 보니 큰 차이점을 느낄 수가 없었습니다. 결국 어디서 일하느냐 보다 누구와 일하느냐가 가장 중요하다고 느끼고 마음 편히 일하고 싶어서 한국으로 돌아 왔습니다.

    김명신: 국내 SI는 정보통신의 꽃이라는 긍정적인 평가와 더불어 올바르지 않은 관행과 하도급 문화에 대한 지적도 있는 것이 사실입니다. 실제 상당기간 동안 국내에서 SI 관련 개발을 진행하시면 이에 대하여 이야기 해주실 부분이 있을까요?

    송원석: 네, 실제로 제 경력에서 2년 정도를 제외하면 SI 개발을 해왔습니다. .NET 개발관련 업무도 많이 했었고 Java를 이용하여 개발도 많이 했습니다. 10여년간의 시간동안 정보통신 관련 기술들은 비약적으로 발전했음에도 SI 비즈니스는 고착화된 업무 관행과 추진 방식 등은 거의 변화되질 않았습니다. 가끔 듣는 외국의 사례와는 너무나 동떨어진 한국식 SI 비즈니스가 깊이 뿌리내리고 있다 보니 상대적으로 변화가 매우 더딘 것이 사실입니다. 이쪽 일을 하시는 분들은 누구나 공감하시겠지만, 하도급 계약으로 인한 폐해는 심각한 수준이고요. 합리적이지 못한 일정 수립과 저가 입찰, 개발자들의 자질 또한 큰 문제라고 하지 않을 수 없습니다. 일정이 다급하고 개발 비용이 빠듯하니 개발이 완료되었다고는 하나 테스트가 올바로 수행되지 않고 시스템을 오픈하거나 핵심 기능에 문제가 생기는 경우가 비일비재 합니다. 그렇다 보니 실제로 프로젝트는 개발인력이 철수한 그 순간부터 본격 시작이라는 말도 있습니다. 시스템을 오픈하면 이미 다른 프로젝트에 투입되어 있는 개발자에게 전화가 빗발치는 이유도 그러합니다. 국내의 경우 특별히 대규모 프로젝트가 수년에 걸쳐 한번씩 크게 진행되는 경우가 있는데, 이는 실제로 시스템이 개발된 이후로 수년간 변화되는 업무환경을 시스템이 따라가지 못하기 때문에 완전히 새롭게 시스템을 재구축하는 과정들을 반복하는 것이지요. 하지만 이러한 개발 문화가 실상은 상당히 한국적이라는 사실을 아시는 분은 많지 않으신 것 같습니다. 안타깝게도 현업에 종사하는 개발자로서 이런 구조가 쉽게 바뀔 것 같지 않고, 너무나도 한국적으로 토착화 되어 버린 것은 아닐까 하는 아쉬움이 있습니다.

    김명신: 실제로 외국의 경우는 대규모 재개발 프로젝트 보다는, 프로젝트 완료 이후에 운영 과정에서도 지속적으로 개발을 하는 것으로 알고 있습니다. 우리나라에서 운영이라 하면, 주로 SE(System Engineering)나 operation을 중심으로 하고 있지만 실제로 해외 사례들을 살펴보면, 유지/보수 업무라는 것이 변화되는 업무와 시스템 사이의 간극을 메우기 위한 개발의 관점으로 유지/보수 업무를 진행하는 것으로 알려져 있습니다. 최근 들어 많은 분들께서 이야기 하시는 DevOps라는 트렌드가 자연스럽게 현업에 적용되고 있는 것이라고 보여집니다. 이렇게 지속적으로 유지/보수가 되다 보니 대규모 재개발이라는 것이 필요한 경우가 적지 않을까 생각합니다.

    송원석: 실제로 개발 당시에는 객체지향의 장점을 최대한 활용하여, 유지/보수의 편의성이나 재활용성을 극대화 하기 위한 설계와 개발방법 등을 적용합니다. DI(Dependency Injection)이나 IOC(Invasion of Control) 컨테이너도 그러한 맥락에서 필수처럼 여기지는 경우를 많아 보았습니다. 그런데 실상은 프로젝트 완료로부터 차기 프로젝트가 진행될까지 관련 소스가 변경되는 경우는 거의 없어요. 단순 운영의 관점에서 소스를 건드린다는 것은 해서는 안 되는 불문율처럼 되어 있어요. 그래서 이 소스는 영원히 변경될 가능성이 전혀 없고 차기 프로젝트에서 참고만 해줘도 다행이라고 이야기 하시는 개발자들도 있습니다. 결국 변경될 가능성이 거의 없는 소스에 대해서 유지/보수의 편의성을 도모하여 개발한다는 것입니다. 문제는 이런 점을 고려하여 개발하는 것이 절대 공짜가 아니라는 점입니다. 설계나 구조도 복잡해지고 개발 시에도 공수가 더 많이 들어갈 뿐 아니라 수행 성능에도 긍정적인 영향을 주지 못합니다. 다시 한번 생각해 보아야 할 부분이 아닌가 합니다.

    김명신: 수년간 IIS MVP로 활동을 하신 것으로 알고 있습니다. 새로운 버전이 나올 때 마다 새로운 기능이 추가되거나 구조가 변경된 경우도 꽤나 있었고 최근에 8.5가 출시되기도 했는데요, 매 버전이 출시될 때 마다 기술적으로 성숙되어 가는 웹서버의 모습들을 관심 있게 지켜보셨으리라 생각됩니다.

    송원석: 실제로 IIS 4.x에서 5.x으로 넘어갈 당시에 공유 풀 모델이 추가되었는데, 저는 그 당시만 해도 새로운 기능으로 넣을 것이 많지 않아서 추가했나 싶을 정도의 의구심을 가졌었습니다. 그런데 6.x로 가면서 응용 프로그래밍 풀 모델이 나오고, 메모리를 공유할 수 있는 모델이 추가되더니 그 이후로 상당한 유용성을 가진 리사이클링이나, 웹가든, 웹팜등 다양한 모델이 기존의 변화의 연장선에서 기능 추가가 이루어지는 것을 보고, 오랜 기간 동안 장기적인 안목을 가진 개발자와 개발팀이 지속적으로 개선과 발전을 이루고 있구나 하는 느낌을 받았습니다. 이처럼 중장기적인 방향성을 가지고 제품을 발전시킬 수 있다는 것이 놀랍기도 하고 부럽기도 하더군요. 아무래도 제가 개발자이다 보니 IIS MVP로 활동하던 시기에 개발의 관점으로 IIS를 접근하였는데, 사실은 IIS를 대규모로 사용하시는 분들은 대부분은 운영자인 경우가 많더라고요. 당시에 그런 관점을 조금 더 이해하고 있었더라면 좀 더 좋은 활동들을 많이 할 수 있지 않았을까 생각이 듭니다.

    김명신: 초중급 개발자분들이 저에게 간혹 물어보시는 질문 중에 닷넷을 해야 하나요? 자바를 해야 하나요? 혹은 저는 지금 닷넷 개발자인데 자바를 해야 하나요? 와 같은 질문을 하시는 분이 있습니다. 혹시 이런 질문을 받으신다면 어떤 답변을 해주실 수 있을까요?

    송원석: 분야별로 차이가 많이 있으리라 생각합니다만. 웹 개발자의 관점으로 이야기 드린다면 어떤 언어나 플랫폼을 사용하더라도 일단은 하나의 언어와 플랫폼에 깊이 있는 내공을 쌓으라고 말씀 드리고 싶습니다. 그것이 자바이냐 닷넷이냐가 중요하다기 보다는 근간이 되는 기술에 대하여 깊이 있게 이해하는 것이 우선이라고 생각합니다. 웹 기반 기술은 결국 http와 같은 프로토콜을 근간으로 하는 모형입니다. 어느 회사가 만드는 솔루션이라도 이 범주를 넘어설 수 없지요. 그런 본질과 이론을 이해한다면, 무엇으로 구현하고 어떤 제품을 사용할 것인지는 차선의 문제일 수 있습니다. 실제로 현업에서 요구하는 기술 요건이 그렇게 높지 않은 경우라 하더라도 꾸준히 자기계발을 하다보면 동일한 일이라 하더라도 좀 더 효율적이고 성능이 좋은 코드를 개발하실 수 있으리라 생각합니다. 그리고 그런 분들이 더 많아졌으면 하는 바램이 있습니다. 10만 인력 양성의 이야기는 초급 개발자 10만을 양성하는 것을 목표로 삼는 것은 아닌 것으로 알고 있습니다. 이처럼 현업에서 경험과 숙련도를 가진 개발자가 많아지려면 그들이 일할 수 있고 활동할 수 있는 분야가 많이 많이 만들어져야 한다고 생각하고 있습니다.

    김명신: 최근에 웹사이트 (http://www.egocube.pe.kr/)를 재오픈하신 것으로 알고 있어요. 저도 그 사이트를 통해서 WebAPI와 관련된 번역 문서를 접하였습니다. 번역문서 외에도 공을 드려 작성하신 문서들이 상당히 많던데, 웹사이트 폐쇄하셨다가 다시 오픈하신 이유가 있을지요?

    송원석: 이 웹사이트는 2002년 정도에 처음으로 개발하여 오픈하였습니다. 그 당시에는 개발자라면 홈페이지 하나 정도는 있어야 하지 않을까 하는 생각에 시작을 했습니다. 처음에는 정말 열심히 강좌도 많이 썼���니다. 그런데 어느 순간부터 사이트를 통해서 들어오는 질문의 수준이 너무 높아서 제가 답변을 드릴 수가 없더라고요. 그렇다 보니 불성실한 답변만 하고 그랬습니다. 그러다가 웹사이트를 폐쇄하였었습니다. 그런데 최근에 사이트를 다시 오픈한 이유는 이렇습니다. 먼저 간혹 예전에 제가 사이트에 올려두었던 글이나 기사들을 찾으시는 분들이 계시더라고요. 그런분들께 여기를 보시면 내용이 있습니다 라고 말할 수 있는 공간이 없어져서 조금 답답했습니다. 그리고 간혹 해외 토픽 같은 걸 보면 1500년대에 누가 쓴 편지가 발견 되었는데, 거기에 이러저러한 내용이 있었다 라는 뉴스가 나오기도 하잖아요. 게다가 저희도 저희 선배로부터 그 시대의 고민꺼리와 이야기꺼리들을 술자리를 통해서만 듣곤 하잖아요. 저는 제 사이트의 내용이 설사 나중에 아무런 기술적인 가치가 없어진다 하더라고 그것이 하나의 기록문화이며 유산이 될 수 있다라고 생각했습니다. 노력해서 좋은 글을 올리려고 하였지만 그 중 일부는 아마도 잘못된 부분이 있을지도 모르겠습니다. 하지만 그 조차도 충분히 이야기거리가 될 수 있으리라 봅니다. 그래서 사이트를 다시 오픈하였고, 최근에는 주로 주요 기술에 대한 원문을 한글로 옮겨서 올리고 있고, 간혹 제 경험과 기술에 대한 내용도 포스팅을 할 생각입니다.

    김명신: 최근에 개발관련 커뮤니티 활동들이 예전에 비해서 상당히 적어졌을 뿐더러, 그 명맥을 유지하고 있는 커뮤니티들도 많지 않은 것 같습니다. 혹시 개발 관련 커뮤니티가 이전처럼 성공적으로 활성화 될 수 있는 방법을 없을까요?

    송원석: 예전에 커뮤니티 활동이 활발 했던 이유는 지식을 공유하거나, 묻고 답할 수 있는 채널로커뮤니티가 상당히 좋은 장소이었기 때문이라고 생각합니다. 그런데 최근에는 구글이 그 자리를 거의 대체하고 있다는 느낌이 들어요. 체계적이지는 않을지 모르나 구글과 같은 검색엔진이 마치 사전과 같은 역할을 하기 때문에 커뮤니티의 활용도나 가치가 그 만큼 하락한 것으로 생각하고 있습니다. 이런 이유로 개발관련 커뮤니티가 많이 사라지기도 하고 활동이 저조할 수 밖에 없는 것 같습니다. 커뮤니티가 유지되려면 단순한 질문/답변 창구가 아닌 그 이상의 가치를 가지도록 재편되어야 할 겁니다. 실제로 오픈 커뮤니티 채널보다 그들만의 감성을 공유할 수 있는 폐쇄형 커뮤니티 채널들이 각광을 받는 이유도 그 같은 이유가 아닐까 생각이 듭니다. 실제로 제가 운영진으로 있던 http://taeyo.net 과 같은 커뮤니티도 전성기에 비해서는 활동이 많이 줄어든 것은 사실입니다. 하지만 이러한 변화에 대응하기 위해서 수년전부터 루키 프로그램 등을2500_7824_clip_image004_thumb_55AC0446_thumb_1BE29F68 만들어서 수개월간의 전문 교육/개발 과정을 진행하고 있습니다. 커뮤니티의 이러한 변화는 어쩌면 당연하고 또 반드시 변화하여야만 유지될 수 있다고 생각합니다.

    김명신: 장시간 인터뷰에 응해 주셔서 대단히 감사합니다. 이번 3월15일(토) 테크데이즈 미니 토요 세미나에 발표하실 “재사용 가능한 ASP.NET View 구성 요소 개발”에 많은 기대를 가지고 있습니다.

    송원석: 네, 기존에 웹폼에서 사용하던 서버측 컨트롤의 높은 재사용성을 MVC에서도 그대로 유지할 수 있는 다양한 기법에 대해서 소개드리고자 합니다. 이 방법을 통해서 많은 분들이 재사용 가능한 구성요소들을 만드시는데 도움이 되었으면 합니다.

    김명신: 감사합니다.

    테크데이즈 미니 토요세미나 안내

  • Korea Evangelist

    Windows Azure 의 계정마다 구독을 제공하고 계정과 구독을 통합 관리 하는 방법! - EA Portal

    • 0 Comments

    안녕하세요. 김대우입니다. 이번에 소개해 드릴 내용은 IT 부서의 고민이죠.

    여러개의 Windows Azure 계정(Account)들과 구독(Subscription)들을 통합 관리하는 방법입니다.

     

    최근 모바일 게임 퍼블리셔사와 5개의 팀으로 된 개발 스튜디오 기술책임자 분들과 미팅을 진행했습니다.

    퍼블리셔 : 모바일 게임 개발사에 Windows Azure 계정을 주고 이 계정에 구독을 생성해 주는 방법

    퍼블리셔사가 사용하는 Windows Azure 관리자 계정을 대여해 줄수도 없는 노릇.

     

    Windows Azure 도입과 적용을 확대해 나가면서 자주 받는 질문이기도 하지요.

     

    image

    예를 들면, 회사의 팀이나 부서 단위로 Azure를 사용하게 하고, 구독들을 통합 관리하고 싶을 경우이지요.

    이럴 때 사용하면 편리한 기능이 바로 Windows Azure EA Portal 입니다.

    EA Portal 링크 : https://ea.windowsazure.com/  (EA가입자만 접근 가능합니다.)

     

    EA Portal이 제공하는 기능들

    - Windows Azure 계정들 관리

    - 계정들에 대한 구독들 관리

    - EA 계약에 따라 할인 받은 금액의 가격표

    - Windows Azure 사용량 체크

    - 과다 사용시 알림(Overage Notification) 기능

    - 주기적(Periodic Usage Notifications) 사용량 알림

    등의 정보를 보실 수 있어요.

    만약, AWS에 익숙하시다면, Consolidated Billing 과 유사합니다.

     

    Windows Azure EA 가입에 대한 추가 정보

    EA(Enterprise Agreement)로 Azure를 사용하시면(지불 계약) Windows Azure EA Portal을 사용 가능하고, 이 EA Portal에서 위의 관리를 할 수 있습니다.

    EA 계약은 적은 금액부터 선택 가능하고, 금액에 따라 종량제나 선불제보다 훨씬 더 많은 할인을 받을 수 있다고 하네요.

    Windows Azure EA 계약 관련 금액 문의는 마이크로소프트 영업 담당자나 Microsoft 총판, 리셀러에 연락 하라고 합니다.

    많은 도움 되시길 바랍니다. 감사합니다.

     

    엔터프라이즈에 대한 Windows Azure 라이선스

  • Korea Evangelist

    고가용성을 위한 Windows Azure 데이터베이스 미러링 0312

    • 0 Comments

     

    이 내용은 기본적으로 고가용성에 대한 충분한 이해가 있으며, Windows Azure와 SQL서버의 여러 고가용성 기능들에 대해서 역시 이해도가 있는 개발자나 IT전문가임을 고려해 상세한 설명 없이 진행.
    미러링에 대해 기본적인 사항이 필요할 경우 향상된 가용성 기능 (미러링) – SQLER 강성욱 제작. SQL서버 미러링 기능 이해에 좋을 듯.

    Windows Azure의 끝판왕 - 고가용성 및 부하 분산 기술인 AlwaysOn에 대한 내용은 추후 제공 예정

    Tutorial: AlwaysOn Availability Groups in Windows Azure (PowerShell)

     

    SQL 서버 고가용성 미러링에 대한 첨언

    미러링은 구성 및 운영, 장애 상황에 대한 절차 등을 충분히 미리 검토하고 전체 절차를 숙지해 두어야 한다.

    특히, 장애 상황시 역할 전환이나 스냅샷 DB 활용시 데이터 생성 시점과 동기화 등 기본적인 내용을 충분히 고려하길 권장.

    Microsoft Technet 데이터베이스 미러링(SQL Server)

     

    이 내용에서는 Windows Azure에서 구축 가능한 모니터링서버(Witness Server) 및 인증서를 사용해 각 서버에 접근하는 방식을 다룬다.

    SQL서버의 미러링 기능 등에 대해서 궁금한 사항이 있을 경우 SQLER.com의 SQL 질문과 답변 게시판을 이용하면 좋음.

     

    미러링 튜토리얼  원본문서 : Tutorial: Database Mirroring for High Availability in Windows Azure

    원문이 변경될 수 있으며, 원문에 충실히 따르길 권장.

     

    파워쉘은 쉘 스크립트 기반으로 마이크로소프트의 여러 다양한 제품들을 제어하기 위한 기술임.

    Windows Azure 도 파워쉘로 빠른 관리 가능하고, 파워쉘에서 Azure를 사용하기 위해서는 파워쉘 cmdlets을 설치해야 한다. SDK 링크에서 설치 가능

    Windows Azure PowerShell cmdlets.

    command-line tool의 Windows PowerShell – install 을 선택하면 설치 가능

    image_thumb.png

    웹 플랫폼 설치 관리자(WPI)가 설치 안되었다면 설치하고, 계속 진행한다.

    WPI는 여러 종속성(dependency)가 있는 SDK나 플러그인 등의 다운로드를 자동으로 조절해 주는 편리한 설치 관리자이다.

     

     

     

    파워쉘 관련자료 참고링크

    SQLER의 Windows Server 게시판 김재훈의 파워쉘 강좌 

     

    파워쉘 실행

    Windows Azure의 고가용성 - 미러링작업은 절차가 복잡하기 때문에 GUI로 하길 권장하지 않는다.

    파워쉘과 SQL쿼리에 이해가 있다면, 아래 내용을 따라해 10분 이내에 미러링 배포도 가능하다.

     

    powershell 명령을 실행창(윈도우키+R) 또는 프로그램에서 선택해 실행

    그러면, 아래와 유사한 화면이 시작된다.


     

     image10_thumb.png

     

    파워쉘 SDK 가져오기(import) 수행 – Azure 관련 파워쉘 명령을 실행 할 수 있다.

    Import-Module "C:\Program Files (x86)\Microsoft SDKs\Windows Azure\PowerShell\Azure\Azure.psd1"

     

    Azure 출판설정파일(PublishSetting)은 Windows Azure의 구독 정보가 기록된 파일이다.

    파워쉘의 현재 세션이 나의 Windows Azure 구독에 접근해 여러 작업을 가능하도록 하는 인증서라고 보면 된다.

    구독 파일 - publishSettings 다운로드 방법은 https://manage.windowsazure.com/publishsettings/index?client=powershell 바로 다운로드 시작 되고 저장 가능하다.

    또는 파워쉘에서 아래 명령 수행 하면 브라우저가 열리면서 설정 파일을 바로 다운로드 가능

    Get-AzurePublishSettingsFile

     

    다운로드 받은 설정 파일을 먹여 준다.  나의 경우는 위의 이미지처럼, c:\temp 폴더에 저장했고 수행했다.

     

    Import-AzurePublishSettingsFile "c:\설정파일저장폴더\설정파일"
     

     

    빠른 Windows Azure 설정을 위해 파워쉘에 변수값 지정

    현재는 일본 서부 데이터센터이고, 위치 및 선호도 그룹 이름을 ContosoAG 으로 설정했다. 가용성집합 이름은 SQLHADR 이다.  현재 VM은 SQL2012 Enterprise이고 4코어를 쓰는 Large 인스턴스이며 과금 여부에 주의한다.

    이후 VM이 생성된 후 VM에 RDP로 접근 가능한 아이디 정보는 AzureAdmin / Contoso!000 이다. – 꼭 바꿔서 수행한다.

    $location = "Japan West"
    $affinityGroupName = "ContosoAG"
    $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
    $affinityGroupLabel = "IaaS BI Affinity Group"
    $workingDir = "C:\script\"
    $networkConfigPath = $workingDir + "NetworkConfig.xml"
    $virtualNetworkName = "ContosoNET"
    $storageAccountName = "<고유값으로 생성>"
    $storageAccountLabel = "Contoso SQL HADR Storage Account"
    $storageAccountContainer = "https://" + $storageAccountName + ".blob.core.windows.net/vhds/"
    $serviceName = "<고유값으로 생성>"
    $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
    $availabilitySetName = "SQLHADR"
    $subnetName = "Back"
    $domainUser = "Administrator"
    $sql1ServerName = "SQL1"
    $sql2ServerName = "SQL2"
    $sql3ServerName = "SQL3"
    $dataDiskSize = 100
    $vmAdminUser = "AzureAdmin"
    $vmAdminPassword = "Contoso!000"

     

    $storageAccountName 과 $serviceName은 식별 DNS로 사용되니 고유해야 한다. 아울러, DNS명이기 때문에 소문자와 숫자만 사용 가능하다.

    참고로, help azure 명령을 수행하면 Azure 파워쉘 명령 리스트 도움말을 볼수 있고, 명령들이 직관적이라 쉽게 파악 가능하다.

     

    위치/선호도 그룹(affinity group) 생성

    위치/선호도 그룹(affinity group)을 파워쉘에서 수행해 생성한다.

    New-AzureAffinityGroup `
        -Name $affinityGroupName `
        -Location $location `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel

     

    문제 없이 실행되면 이런 결과를 파워쉘에서 볼 수 있다.(이하 생략)

    OperationDescription                    OperationId                             OperationStatus 
    --------------------                    -----------                             --------------- 
    New-AzureAffinityGroup                  7a01991c-75f5-7fdb-a32b-0f224307ad64    Succeeded

    파워쉘에서 Success 라고 안 나오면 뻘건 오류 화면이 나온다. 오류를 읽어보면 대부분 쉽게 스크립트 문제를 해결 가능하다.

     

    구성 파일을 가져와 virtual network  생성

    c:\script 폴더 내에 NetworkConfig.xml 파일로 아래 파일이 위치 해야함. 아래 XML 파일을 저장하고 위에서 설정한 c:\script\ 폴더에 둔다.

    <NetworkConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
      <VirtualNetworkConfiguration>
        <Dns />
        <VirtualNetworkSites>
          <VirtualNetworkSite name="ContosoNET" AffinityGroup="ContosoAG">
            <AddressSpace>
              <AddressPrefix>10.10.0.0/16</AddressPrefix>
            </AddressSpace>
            <Subnets>
              <Subnet name="Front">
                <AddressPrefix>10.10.1.0/24</AddressPrefix>
              </Subnet>
              <Subnet name="Back">
                <AddressPrefix>10.10.2.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
          </VirtualNetworkSite>
        </VirtualNetworkSites>
      </VirtualNetworkConfiguration>
    </NetworkConfiguration>

     

    파워쉘 명령으로 설정을 적용한다.

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath

     

    저장소(Storage) 생성

    파워쉘 명령으로 저장소를 생성한다.

    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName

     

    이어서, 저장소를 구독(Subscription)에 연결한다.,

    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName

     

    VM 생성 진행 - 첫 VM인 SQL1을 생성

    # Create SQL1...
    New-AzureVMConfig `
        -Name $sql1ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql1ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1 `
                    -LocalPort 1433 |
                    New-AzureVM `
                        -ServiceName $serviceName `
                        –AffinityGroup $affinityGroupName `
                        -VNetName $virtualNetworkName

     

    VM2 생성

    # Create SQL2...
    New-AzureVMConfig `
        -Name $sql2ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql2ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 2 `
                    -LocalPort 1433 |
                    New-AzureVM `
                        -ServiceName $serviceName

     

    VM3 생성

    # Create SQL3...
    New-AzureVMConfig `
        -Name $sql3ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql3ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                New-AzureVM `
                    -ServiceName $serviceName

     

    VM이 모두 올라오는 것을 대기하고 이후 작업을 진행한다.

     

    RDP 파일 다운로드

    Foreach ($VM in $VMs = Get-AzureVM -ServiceName $serviceName)
    {
        write-host "Waiting for " $VM.Name "..."

        # loop until the VM status is "ReadyRole"
        While ($VM.InstanceStatus -ne "ReadyRole")
        {
            write-host "  Current Status = " $VM.InstanceStatus
            Start-Sleep -Seconds 15
            $VM = Get-AzureVM -ServiceName $VM.ServiceName -Name $VM.InstanceName
        }

        write-host "  Current Status = " $VM.InstanceStatus

        # Download remote desktop file
        Get-AzureRemoteDesktopFile -ServiceName $VM.ServiceName -Name $VM.InstanceName -LocalPath "$workingDir$($VM.InstanceName).rdp"
    }

    위 스크립트는 15초에 한번씩 서버별로 VM이 올라온지 확인해 올라 왔으면 RDP 파일을 편한 원격 관리 목적으로 다운로드 하는 스크립트다.

    위에서 구성한 기본 작업 폴더(c:\script)에 보면 rdp 파일을 확인 가능하다.

     

    RDP를 이용해 3대의 SQL서버에 각각 접근하고 파워쉘을 실행

    다운로드 받은 RDP를 실행해 각 서버에 AzureAdmin and password Contoso!000 계정으로 로그인한다.(ID 암호를 위에서 변경했다면 다르게 로그인을 해야 한다.)

     image_thumb_3.png

     

    3대의 서버 모두에서 파워쉘을 “관리자 모드”로 실행하고, 아래 명령을 수행해 SQL서버에 원격 접속이 가능하도록 방화벽을 열어 준다.

     

    netsh advfirewall firewall add rule name='SQL Server (TCP-In)' program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' dir=in action=allow protocol=TCP

     

     

    인증서를 사용하는 데이터베이스 미러링 구성 시작

    SQL1에서 미러링에 이용할 서버 인증서를 생성하고 백업한다. 참고로, SQLCMD는 SQL명령을 명령프롬프트에서 실행하도록 하는 쿼리 실행기이다.

    인증서 암호는 원하는 형태로 지정 가능하다. 실행은 마찬가지로, 파워쉘 창에서 실행하면 된다

    SQLCMD -S SQL1
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#1>';
    GO

    CREATE CERTIFICATE SQL1_cert WITH SUBJECT = 'SQL1 certificate';
    GO

    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL)
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQL1_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO

    BACKUP CERTIFICATE SQL1_cert TO FILE = 'SQL1_cert.cer';
    GO

     

    SQL2에서도 미러링에 이용할 서버 인증서를 생성하고 백업한다.

    SQLCMD -S SQL2
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#2>';
    GO

    CREATE CERTIFICATE SQL2_cert WITH SUBJECT = 'SQL2 certificate for database mirroring';
    GO

    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL)
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQL2_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO

    BACKUP CERTIFICATE SQL2_cert TO FILE = 'SQL2_cert.cer';
    GO


    SQL3에서도 미러링에 이용할 서버 인증서를 생성하고 백업한다.

    SQLCMD -S SQL3
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#3>';
    GO

    CREATE CERTIFICATE SQL3_cert WITH SUBJECT = 'SQL3 certificate for database mirroring';
    GO

    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL)
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQL3_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO

    BACKUP CERTIFICATE SQL3_cert TO FILE = 'SQL3_cert.cer';
    GO

     

    위에서 생성한 인증서는 모두 각 서버의 C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA 폴더에 있다.

    각 서버가 나머지 2개의 서버 인증서를 모두 가지고 있도록 인증서를 복사한다. 예를 들면, SQL1은 SQL2와 SQL3의 인증서를 가지도록 복사한다. SQL2와 SQL3도 마찬가지.

     

    SQL1에서 SQL2와 SQL3의 인증서로 로그인을 허용하는 퍼미션을 구성한다.

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Contoso!000';
    GO

    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO

    CREATE CERTIFICATE SQL2_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL2_cert.cer'
    GO

    CREATE CERTIFICATE SQL3_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL3_cert.cer'
    GO

    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO


    SQL2에서 SQL1와 SQL3의 인증서로 로그인을 허용하는 퍼미션을 구성한다.

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Contoso!000';
    GO

    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO

    CREATE CERTIFICATE SQL1_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL1_cert.cer'
    GO

    CREATE CERTIFICATE SQL3_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL3_cert.cer'
    GO

    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO

     

    SQL3에서 SQL1와 SQL2의 인증서로 로그인을 허용하는 퍼미션을 구성한다.

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Contoso!000';
    GO

    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO

    CREATE CERTIFICATE SQL1_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL1_cert.cer'
    GO

    CREATE CERTIFICATE SQL2_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL2_cert.cer'
    GO

    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO

    작업을 수행할 DB는 MyDB1 이다. DB를 생성하고, SQL1에서 풀 백업과 로그 백업을 수행한다.

     

    CREATE database MyDB1
    GO

    BACKUP DATABASE MyDB1 TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.bak';
    GO

    BACKUP LOG MyDB1 TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.log';
    GO


    생성된 백업 파일들(풀백업 - BAK 파일과 로그 백업 - LOG 파일)을 SQL2의

    C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP

    폴더로 복사한다.

     

    SQL2에서 미러링으로 사용 되도록 WITH NORECOVERY 모드로 복구하고, SQL1을 미러링 파트너로 구성한다.

    RESTORE DATABASE MyDB1 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.bak' WITH NORECOVERY;
    GO

    RESTORE LOG MyDB1 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.log' WITH NORECOVERY;
    GO

    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://SQL1:5022';
    GO

     

    SQL1에서 SQL2를 미러링 파트너로, SQL3을 모니터링(Witness)  서버로 구성한다.

    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://SQL2:5022';
    GO

    ALTER DATABASE MyDB1 SET WITNESS = 'TCP://SQL3:5022';
    GO

     

    자 이렇게 해서 미러링 구성은 모두 끝났다. 이제 동작 여부를 테스트 한다.

     

    미러링 테스트 수행

    --SQL1에서 수행한다. 테이블을 만들고 데이터를 삽입/조회한다.
    use MyDB1
    go

    create table sqler01(
        sqlerNumber int
    ,    mystring varchar(10)
    )
    go

    insert into sqler01(sqlerNumber, mystring) values(1, 'SQLER')
    insert into sqler01(sqlerNumber, mystring) values(2, 'Mirror')
    go

    select * from sqler01
    go

     

    주서버(Primary)인 SQL1에서 처리하고 이제 미러링 서버인 SQL2에서 아래 내용을 수행해 미러링을 확인한다.

    --SQL2에서 수행
    use MyDB1
    go

    --미러링, Recovery 상태라 접근 불가
    select * from sqler01
    go


    --읽기 전용 스냅샷 DB를 생성한다. DB명은 snapshot_MyDB1
    -- 이 스냅샷 DB는 Recovery 상태인 DB의 상태를 새 DB로 복사하는것이며, 이 DB를 수정해도 SQL1이나 다른 곳으로 데이터가 동기화 되지 않는 DB이다. 추후 AlwaysOn에서 상세히 다룬다.create database snapshot_MyDB1
    on (name = MyDB1, filename='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\snapshot_MyDB1.mdf')
    as snapshot of MyDB1
    go

    -- 복사한 스냅샷 DB에서 데이터 조회
    use snapshot_MyDB1
    go

    select * from sqler01
    go

     

    이제 장애 상황을 가정해 SQL1을 중지시킨다.

    --SQL1 에서 SQL서버 중지 명령 실행
    shutdown

     

    SQL1의 이벤트 로그를 확인해 보면 서버가 중지된 것을 확인 가능하고, 모니터링 서버인 SQL3에 이벤트가 바로 발생한 것을 볼수 있다.

    1초 이내에 Failover되어 SQL2가 Recovery 모드에서 Principle DB로 역할이 변경되고 서비스가 지속된다.

     

    참고���료

    향상된 가용성 기능 (미러링) – SQLER 강성욱 제작. SQL서버 미러링 기능 이해에 좋다.

    Tutorial: Database Mirroring for High Availability in Windows Azure

    SQLER의 Windows Server 게시판 김재훈의 파워쉘 강좌 

    Tutorial: AlwaysOn Availability Groups in Windows Azure (PowerShell)

    SQLER.com의 SQL 질문과 답변 게시판을
Page 5 of 121 (605 items) «34567»