원제 : Stack Overflow Architecture
번역 : Stack Overflow Architecture
Update: Startup – ASP.NET MVC, Cloud Scale & Deployment shows an interesting alternative approach for a Windows stack using ServerPath/GoGrid for a dedicated database machine, elastic VMs for the front end, and a free load balancer.
Stack Overflow는 무명의 두 사람이 만든 사랑하는 프로그래머들이 질문과 답을 하는 사이트입니다. 정확하지 않습니다. Stack Overflow는 최상의 프로그래머이자 블로그 스타인 Jeff Atwood와 Joel Spolsky가 개발했습니다. 잠시 둘러봐도 Stack Overflow는 유명한 식당을 소유하는 것과 같습니다. 조엘은 세상의 1/3 이상의 프로그래머가 Stack Overflow를 이용하고 있다고 추산하는데, 무엇인가 좋은 것을 제공하기 때문입니다..
나는 순수한 이기적인 이유를 위해 Stack Overflow를 깊이 좋아했는데, Stack Overflow는 내 눈을 찔러 고통을 주는 몇 가지 어려운 문제를 해결하는데 도움을 주었기 때문입니다. 또한 나는 인류학적으로 설계 철학에 바탕을 둔 사과없음에 감사합니다. 기술자에게 행동에서 설계를 사용하면 여러분이 좌절시키기 원하는 응답을 권장하거나 최소화하기를 원합니다. 이는 시너지 효과 같은 것을 생성하는 자의식적인 메커니즘입니다.
나에게 Stack Overflow 이야기에 대한 주요부분은 잠재적으로 큰 문제들을 위한 실행 가능한 솔루션으로 확장(scale up)을 한 강력한 사례입니다. 최근 관심은 NoSQL 데이터베이스를 이용하여 확장(scale out)하는 것입니다.
그러나 Stack Overflow는 Google 이 아니고 대부분의 사이트와도 다릅니다. 설계 옵션을 생각할 때 Stack overflow를 잊지마시길. 멀티코어, 큰 RAM 장치와 병렬 프로그래밍 기술의 장점이 있는 시대에서, 더 이상 차갑지 않기 때문에 확장(scale up)은 실행가능한 전략이며, 가장자리에 방치해서는 안됩니다. 언젠가 우리는 두 세계의 최고를 가지겠지만, 현재는 만들어야 하는 고통이 큰 선택이고 이 선택이 당신의 운명을 결정합니다.
조엘은 비슷한 크기의 사이트와 비교하여 유사한 성능을 내는데 1/10의 하드웨어를 사용한다는 것을 자랑합니다. 그는 다른 사이트에 좋은 프로그래머가 있는가 궁금해합니다. 그들이 어떻게 했는지 보고 여러분이 판단해보세요.
Site: http://stackoverflow.com
The Stats
Platform
- 2 x Lenovo ThinkServer RS110 1U
- 4 cores, 2.83 Ghz, 12 MB L2 cache
- 500 GB datacenter hard drives, mirrored
- 8 GB RAM
- 500 GB RAID 1 mirror array
- 1 x Lenovo ThinkServer RD120 2U
- 8 cores, 2.5 Ghz, 24 MB L2 cache
- 48 GB RAM
배울 교훈
Jeff와 Joel가 그들로 받은 코멘트로부터 받은 혼합한 교훈입니다.Stack Overflow에 대한 내용이 많이 없는 것이 사실입니다. 우리는 그들의 장비, 도구 사슬과, 그들이 웹서버 코드에서 직접 데이터베이스에 접근하는 2-tier 아키텍처를 사용한다는 것을 압니다. 우리는 태그와 같은 것을 구현한 방법을 모릅니다. 관심이 있다면 explanation of their schema로부터 정보를 얻을 수 있습니다. 둘다 논란이 많고 흥미로운 토론의 주제입니다.
토론
아키텍처 프로파일 후보에 따르면 Stack Overflow는 2개의 중요한 HighScalability 배지를 받았습니다.: Microsoft Stack 배지와 Scale Up 배지.Microsoft Stack Badge
Stack Overflow 가 전반적으로 Microsoft Stack 을 사용하기 때문에 Microsoft Stack 배지를 받았습니다: OS, database, C#, Visual Studio, ASP .NET. 사람들은 LAMP와 어떻게 비교되는가에 항상 관심을 가지지만, 저는 이 비교를 보여줄 사례 연구가 많이 없습니다..Plenty of Fish의 Markus Frind는 가끔 Microsoft stack을 전형적으로(poster child)로 사용하기로 유명하지만, 분명히 가능한 조금만 stack을 사용하기 때문에 좋은 예는 아닙니다. 반대로 Stack Overflow는 때때로 퇴짜를 맞을지라도 MS에 대한 사랑을 보여주는데 자신만만합니다.
라이선스로 인해 함께하는 경향이 있기 때문에 Microsoft stack과 scale up 접근법을 분리하기 어렵습니다. 수십개의 코어를 추가하여 Scale up에서 scale out으로 전환하는 위치에 있다면, MS 라이선스가 여러분을 꽉 물어뜯을 것입니다.
라이센싱을 제쳐두고 C#, Visual Studio, .Net이 매우 생산적인 환경임을 발견했습니다. . C#/.Net은 Java/JVM. ASP .NET이 항상 나를 항상 엉망으로 혼란시켜 온 것만큼 좋습니다. SQL Server에 대한 두드림은 비용을 지불할 수 있는가이며 만약 여러분을 괴롭히지 않는다면 탄탄한 선택입니다. Windows 운영체계는 다른 대체 운영체계처럼 믿음직스럽지 않지만 잘 동작합니다.
특별히 여러분이 Windows 중심으로 일하고 있다면, 여기까지가 Microsoft stack으로 작업하는 scale up 솔루션입니다.
Scale Up Badge
scale out 대 scale up, 임대 대 구매 전쟁을 재현하고 싶지 않습니다. 이런 이슈의 철저한 토론은 Scaling Up vs. Scaling Out 와 Server Hosting — Rent vs. Buy? 을 보도록 하세요. 여러분이 혼란스럽지 않고 다 읽은 후에도 상처받지 않는다면 아마도 자료들을 이해하지 못한 것입니다Stack Overflow은 그들의 확장 요구사항을 접하기 위한 scale up 전략을 사용했기 때문에 Scale Up 배지를 수여했습니다. Stack Overflow가 제한에 도달했을 때, 더 큰 장비와 더 많은 돈을 추가하여 수직으로 확장하였습니다.
Stack Overflow는 scale up을 위한 달콤한 곳입니다. 너무 크지도 않고, Alexa 순위 1666 등이고 월 16백만 페이지뷰를 가지고 있는 상당히 큰 사이트입니다. Google 규모는 아니지만, 아마도 그럴 필요도 없지만, 많은 사이트들이 가지고 싶어 열광할 것입니다. 게다가 그들은 많은 미디어도 올리지 않았습니다. 그들은 수백만의 사용자와 함께 하는 복잡한 소셜 네트워크를 이용한 수십억의 트윗도 하지 않았습니다. 그들의 사용자 수는 자기 제한입니다. 그리고 그들이 확장하고자 할 때 취할 수 있는 방향들이 여전히 있습니다.(caching, 더 많은 웹 서버, 빠른 디스크, 더 많은 반정규화, 더 많은 메모리, 약간의 파티셔닝 등). 모든 것에서 잘 만들었고 2-tier CRUD 응용프로그램으로 매우 쓸만합니다.
NoSQL is Hard
이 경우에 Stack Overflow 가 scale up 대신에 scale out을 했다면 어떻게 되었을까요?드러나지 않은 것이 NoSQL이 어렵다는 것입니다. 관계형 데이터베이스는 많은 단점이 있지만, 비용과 복잡성을 감춰주면서 일반적인 많은 작업을 간단하게 만들어줍니다. 공장에 얼마나 많은 검정 Prius가 있는지 알아내는 것은 매우 쉬운 작업입니.
대부분의 NoSQL 데이터베이스에 대한 것이 아닙니다(여기서 일반적으로 말하자면, 몇몇 NoSQL 데이터베이스 다른 것에 비해 더 많은 기능을 가지고 있습니다). 여러분이 앞에서 예를 든 검은 Prius 차의 대수를 파악하는 프로그램 코드를 가지고 있을 수 있습니다. 어떤 합계(aggregate) 연산자도 없습니다. 여러분은 2차 인덱스를 관리해야 합니다. 검색도 없습니다. 파티션을 넘어스는 분산 질의도 없습니다. Group By 또는 Order By도 없습니다. 결과 집합을 쉽게 페이징하는 커서도 없습니다. 100개의 큰 레코드를 한번에 리턴하면 시간초과가 될 것입니다. 작업을 위한 IO 양의 제한 때문에 매우 한정적인 할당이 있을 것입니다. 질의 언어는 표현력이 부족합니.
이 모든 것의 가장 큰 문제는 트랜잭션이 임의의 경계를 넘을 수 없다는 것입니다. 단일 레코드나 작은 entity group 을 넘어서는 ACID 보장도 없습니다. 여러분이 머리를 한번만 굴려봐도 프로그래머에게 결코 즐거운 전망을 주지 않는 것을 알 수 있습니다. 참조는 수동으로 관리되어야 합니다. 관계도 수동으로 관리되어야 합니다. 실패가 발생할 때 정확하게 동작하는 cascading 삭제도 없습니다. 반정규화된 모든 복제는 수동으로 추적해야 하고 부분적인 실패의 가능성과 외부적인 뚜렷한 일치하지 않는 계정을 감안하기 위해 업데이트 되어야 합니다.
이런 모든 기능은 여러분이 직접 작성해야 합니다. 유연성 때문에 코드 작성은 OLAP/map-reduce 상황처럼 커지거나, 서술적인 접근법은 여전히 매우 커지거나 잘 깨지지 않는 코드로 만들어야 합니다.
여러분이 얻는 것은 대용량의 데이터를 쓰는 능력입니다. 잃는 것은 만족입니다. 프로그래머는 분산 동작에는 비용이 들고 장애가 언제든지 일어나는 시스템을 다루고 있다는 것을 항상 잘 알고 있어야 합니다.
이 모든 것이 진정한 확장과 분산 시스템 구축의 가격이지만, 정말로 여러분이 지불하고 싶은 가격입니까?
다중임대 문제(The Multitenancy Problem, HTTP://EN.WIKIPEDIA.ORG/WIKI/MULTITENANCY)
StackExchange를 통해 Stack Overflow는 자임대 사업을 하고 있습니다. Stack Overflow는 직접 호스팅이나 white label application 호스팅으로 StackExchange를 제공합니다.(http://en.wikipedia.org/wiki/White-label_product)그들의 아키텍처가 매우 많은 사이트를 처리하기 확장되는지 보는 것은 매우 재미있습니다. Salesorce 는 다중임대의 제왕이고 오라클을 데이터베이스로 사용한다고 해도, 기본적으로 오라클을 매우 적게 사용하며 오라클 위에 자신의 테이블 구조와 색인과 질의 처리기를 작성했습니다. 이 모든 것이 다중임대를 지원하기 위한 것입니다.
많은 다른 사용자를 지원하는 일은 특별히 커스터마이징을 허용하고 버전컨트롤을 지원하는 일이 보여지는 것과는 다르게 어렵기 때문에 Salesforce는 극단적입니다.
분명하게 모든 사용자들이 보안, 커스터마이징, 확장 이유 때문에 하나의 서버에서 동작하지 않습니다.
사용자를 위해 데이터베이스를 생성하고, 특정 사용 단위로 서버를 공유하고, 필요한만큼 서버를 추가하면 될 거라 생각할 수 있습니다. 사용자들이 하나의 서버만 필요하다면 여러분은 대박입니다.
이런 일은 실제로 잘 일어나지 않는 것 같습니다. 이상하게도 데이터베이스 관리자는 데이터베이스를 추가하거나 업데이트를 위해 최적화하지 않습니다. 데이터베이스 생성은 매우 무거운 동작이고 현재 고객들에게 시스템에 락킹이 발생한 것 처럼 성능을 저하시킵니다. 업그레이드 이슈 또한 문제가 있습니다. 컬럼을 추가하는 것은 높은 트래픽 상황에서 문제인 테이블 락을 발생시킵니다. 새로운 인덱스 추가도 또한 매우 긴 시간이 걸리며 성능을 저하시킵니다. 사용자들은 업그레이드를 더욱 복잡하게 만드는 전문성(specializations)을 가지고 있습니다.
이런 문제를 처리하기 위해 Salesforce의 아키텍트 수석인 Craig Weissman은, 테이블이 고객별로 생성되지 않는 혁신적인 접근법을 고안했습니다. 모든 고객들로의 모든 데이터는 인덱스를 포함하여 같은 데이터 테이블로 맵핑됩니다. 이런 테이블의 스키마는 orgid, oid, value0, value1, value 500과 유사합니다. “orgid”는 조직 ID이고 데이터가 결코 섞이지 않는 방법입니다. 매우 광범위하고 드문 테이블인데, 오라클이 매우 잘 처리합니다. 수만개의 테이블과 고객 필드는 데이터 테이블로 맵핑됩니다.
이런 접근방법으로 Salesforce는 어떤 별도의 옵션을 가지지 않고 테이블에 어떤 것이 있는지 해석하는 인프라를 구축했습니다. 오라클은 트랜잭션, 일치, 데드락 발견을 처리하기 위해 사용됩니다. 장점은 버전관리를 처리하는 인터프리트 레이어가 있기 때문이며, 처리 로직을 만들었기 때문에 상대적으로 간결한 것입니다. 낯설지만 사실입니다.
읽을 거리
이 목록은 Jeff 가 Stack Overflow에 연대기로 기록한 몇 가지 게시물입니다. Jeff 는 무엇을 왜 했는지에 대해 공개하는데 놀라울 정도입니다. 댓글은 종종 엄청납니다. 배울 게 많이 있습니다.'실제 아키텍처' 카테고리의 다른 글
How Ravelry Scales to 10 Million Requests Using Rails (0) | 2009.09.22 |
---|---|
How Google Serves Data from Multiple Datacenters (0) | 2009.08.24 |
Scaling Twitter: Making Twitter 10000 Percent Faster (0) | 2009.06.27 |
PlentyOfFish Architecture (0) | 2009.06.26 |
Digg Architecture (0) | 2009.04.04 |