원제 : How Google Serves Data from Multiple Datacenters
번역 : 구글이 여러 데이터센터로부터 데이터를 서비스하는 방법
Update: Streamy Explains CAP and HBase's Approach to CAP. 우리는 클러스터간 복제를 적용할 계획인데, 각 클러스터는 하나의 데이터센터에 위치합니다. 원격 복제는 시스템으로 최종 일치를 진행하며, 그러나 각 클러스터는 강한 일치가 될 때까지 지속할 것입니다.
구글의 App Engine datastore 를 이끄는 Ryan Barrett은 Google I/O 2009 컨퍼런스에서 Transactions Across Datacenters (and Other Weekend Projects)를 발표하였습니다
발표에서 새로운 기술 경지를 개척할 필요가 없었기 때문에, Ryan은 훌륭한 작업 설명과 여러 데이터센터를 거쳐 작업하는 시스템을 아키텍팅 할 때 여러분이 가진 다른 옵션을 평가하였습니다. multihome이라 부르며, 동시에 여러 데이터센터로부터 작업하는 것입니다..
multihoming은 모든 컴퓨팅분야에서 가장 도전적인 분야이기 때문에, Ryan의 명쾌하고 사려깊은 태도는 편안하게 여러분을 다양한 옵션으로 이끌어줍니다. 이 여행에서 여러분은 다음을 배우게 됩니다:
- 적은 지연 쓰기(lowish latency writes)
- 데이터센터 장애 생존(datacenter failure survival)
- 강력한 일치성 보장( strong consistency guarantees).
아직 배울게 남아있습니다. 발표에 대한 나의 주석입니다:
일치성 – 읽기가 발생한 다음에 쓰기는 어떤 일이 발생할까?
데이터 읽기/쓰기는 데이터센터를 가로질러 동작하는 데이터의 가장 어려운 종류중 하나 입니다. 사용자는 신뢰성과 일치성의 특정한 단계를 기대합니다.트랜잭션 – 여러 작업에서 일관성의 확장된 방식.
여러 데이터센터에서 작업해야 하는 이유는?
여러 데이터센터에서 작업하지 못하는 이유?
다른 아키텍처 옵션(Your Different Architecture Options)
- 좋기는 하지만 훌륭하지 않습니다.
- 데이터는 보통 비동기로 복제되기 때문에 손실에 대한 취약점이 있습니다.
- 다른 데이터센터의 데이터는 장애시에 일치하지 않을 수 있습니다.
- 금융기관에서 많이 사용합니다.
- 읽기 위한 지리기반지역화를 해야합니다. 일치성은 기술에 의존합니다. 쓰기는 여전히 한 데이터센터로 제한됩니다.
- 그래서 몇몇은 단지 두 데이터센터만을 선택합니다. NASDAQ 은 가까운 곳에 두 데이턴 센터를 (낮은 지연) 가지고 있고 모든 트랜잭션에 2단계 커밋을 수행하지만, 그러나 매우 엄격한 지연 요구사항을 적용하고 있습니다.
- 개 이상의 데이터센터 이용은 근본적으로 더 어렵습니다. 여러분은 이를 위해 큐 지연, 라우팅 지연, 빛이 속도에 비용을 지불해야 합니다. 단지 작은 파이프를 이용하여 기본적으로 더 느립니다. 용량과 처리량에 지불할 수 있지만, 여러분은 지연에는 무한대로 지불해야 합니다.
실제 방법은 무엇이 있을까요?
어떤 기술이 있으며 다른 접근방법들의 tradeoffs 는 무엇입니까? 평가표가 아래에 있습니다:Backups | M/S | MM | 2PC | Paxos | |
Consistency | Weak | Eventual | Eventual | Strong | Strong |
Transactions | No | Full | Local | Full | Full |
Latency | Low | Low | Low | High | High |
Throughput | High | High | High | Low | Medium |
Data loss | Lots | Some | Some | None | None |
Failover | Down | Read-only | Read/Write | Read/Write | Read/Write |
- M/S = master/slave, MM - multi-master, 2PC - 2 Phase Commit
- 특정한 접근법을 위해 어떤 종류의 일치성, 트랜잭션, 지연, 처리량을 선택하시겠습니까? 장애시에 데이터를 잃어도 될까요? 얼마나 많이 잃을까요? 우리가 유지보수로 장애극복을 하거나 뭔가를 옮기려 할 때, 데이터센터를 퇴역시키려 할 때, 얼마나 잘 할 수 있을까요, 얼마나 기술적으로 지원할 수 있을까요?
- 복제가 비동기이기므로 지연과 처리량에 좋습니다.
- 매우 주의하지 않으면 약한/최종 일치.
- 데이터센터들에 여러 개의 복사를 가지므로, 장애가 발생하면 매우 적은 데이터를 잃으며, 많지는 않습니다. 마스터가 다른 데이터센터를 옮기기 전까지 장애극복은 읽기전용으로 지속됩니다.
- Datastore는 현재 이 메커니즘을 사용합니다. 진정한 multihoming은 데이터센터간의 특별한 hop을 가지고 있기 때문에 지연을 추가합니다. App Engine은 여전히 쓰기에서 느려서 이 특별한 hit는 괴롭습니다. 더 낮은 지연 쓰기를 여전히 제공하기 때문에 M/S는 가장 좋은 형태의 혜택을 제공합니다.
- 데이터가 충돌할 때 여러분은 나중에 모든 쓰기를 합치는 방법을 계산해야 합니다. 마치 비동기 복제와 같지만, 여러분은 여러 지역으로부터 쓰기를 제공하고 있습니다.
- 할수 있는 최선은 최종 일치입니다. 쓰기는 즉시 모든 곳으로 가지 않습니다. 이점이 패러다임 전환입니다. 백업을 하고 어떤 것도 변하지 않는 M/S 같은 강력하게 일치하는 시스템을 가정했습니다. 이들은 우리가 multihome을 만들게 도와주는 기술일 뿐입니다. 다중 쓰기가 합쳐지기 때문에 문자 그대로 시스템이 동작하는 방법을 변화시킵니다.
- 합치기 위해서 여러분은 직렬화 방법과, 모든 여러분의 쓰기에 순서를 부여하는 방법을 찾아야 합니다. 전세계적인 시계는 없습니다. 일은 병렬로 발생합니다. 여러분은 맨처음 일어날 일을 알 수 없습니다. 따라서 timestamps, local timetamps + skew, local version numbers, distributed consensus protocol 을 이용하여 만들어야 합니다. 이것은 마법이며 달성하는 몇 가지 방법이 있습니다.
- 전세계적 범위의 트랜잭션을 하는 방법은 없습니다. 다중 동시 쓰기를 하면 여러분은 트랜잭션을 보장할 수 없습니다. 따라서 여러분은 다음에 무엇을 할지 알아야 합니다.
- AppEngine 은 응용프로그램을 쉽게 만들기 위해서 강력한 일치성을 원했고, 따라서 이 옵션을 고려하지 않았습니.
- 데이터센터들이 쓰기를 처리하면 되기 때문에 장애극복은 쉽습니다.
- 주어진 2PC 트랜잭션을 위한 주조정자가 있기 때문에 반 분산(Semi-distributed )입니다. 적은 데이터센터만 있기 때문에 주조정자의 같은 집합을 통하려는 경향이 있습니다.
- 동기방식입니다. 모든 트랜잭션은 처리량을 줄이고 지연을 증가시키는 마스터를 통해 직렬화됩니다.
- AppEngine 에게는 쓰기 처리량이 중요하기 때문에 이 옵션을 심각하게 검토하지 않았습니다. 어떤 단일지점 또는 직렬화 장애는 제대로 동작하지 않을 것입니다. 추가적인 조정이 필요하기 때문에 지연은 높습니다. 쓰기 200ms 범위에서만 가능합니다.
- 이 옵션은 동작은 합니다. 여러분은 모든 데이터센터에 쓰기를 하거나 아무것도 쓰지 않을 수 있습니다. 여러분은 강력한 일치성과 트랜잭션을 얻습니다.
- N+1 데이터센터가 필요, 여러분이 하나를 다운시키면, 로드를 처리할 N개를 가지게 됩니다.
- 프로토콜 : 제안 단계와 다음에 동의 단계가 있다. 여러분은 지속되는 것으로 간주되어야 하는 것을 위해 무엇인가 지속되어야 한다고 말하기 위해 동의하는 오직 하나의 주 노드가 필요합니다.
- 2PC와 다르게 완전 분산입니다. 단일 주조정자가 없습니다.
- 다중 트랜잭션은 병렬적으로 수행됩니다. 덜 직렬화됩니다.
- 이 프로토콜에서는 2개의 추가적인 순회 조정 여행이 필요하기 때문에 쓰기는 높은 지연시간을 갖습니다.
- 이렇게 하기를 원했지만, 쓰기에 150ms 지연을 지불하지 않았는데, RDBMS의 경우 5ms 쓰기와 비교되었기 때문입니다.
- 그들은 물리적으로 폐쇄된 데이터센터에서 사용하려 했지만, 내장 멀티-데이터센터 오버헤드(라우터등)이 너무 높았습니다. 같은 데이터센터 안에서도 너무 느렸습니다.
- Paxos는 여전히 구글에서 많이(ton) 사용됩니다. 특별히 Lock 서버를 위해 사용됩니다. 데이터센터를 가로질러 하려는 것을 조정하기 위해. 특별히 상태가 데이터센터간에 이동될 때. App 가 하나의 데이터센터에서 데이터를 제공하고 있고 다른 데이터센터로 이동해야 한다면 조정은 Paxos를 통해 이뤄집니다. Memcache 관리와 오프라인 프로세싱에 사용됩니다.
다양한 읽을거리
토론
발표에서 저도 몇가지 궁금한 것이 있습니다. Google 은 분산 MVCC 접근법을 고려했을까요? 분산 MVCC는 흥미롭지만 옵션으로 발표하지 않았습니다. 확실히 Google 규모에서 in-memory 데이터 그리드는 아직 적절하지 않습니다.프로그래머의 작업을 쉽게 만들기 때문에 강력한 일치 모델을 위한 설정은 주요한 설계 목적으로써 반복해서 구체화시켜야 합니다. A counter to this is that the programming model for Google App Engine is already very difficult. The limits and the lack of traditional relational database programming features put a lot of responsibility back on the programmer to write a scalable app. I wonder if giving up strong consistency would have been such a big deal in comparison?
나는 평가표와 왜 Google App Engine이 이런 선택을 했는가에 대한 토론에 진심으로 감사드립니다. 쓰기가 이미 Google App Engine에서 느리기 때문에 그들은 더 많은 조정 레이어를 흡수하는 많은 공간(headroom)을 가지지 않았습니다. 이것들은 설계 회의에서 개발자들이 나누는 종류이지만, 그들은 보통 사무실이나 회의실 바깥에서 만들지 않았습니다. “왜 우리가 다 가질 수 없는거야 ”라고 큰 소리로 말하는 Ryan의 말을 들었습니다. 우리는 결코 모든 것을 가질 수 없습니다. 공유를 해 준 Rayn에 많이 감사드립니다.
Related Articles
'실제 아키텍처' 카테고리의 다른 글
Why are Facebook, Digg, and Twitter so hard to scale? (0) | 2009.10.13 |
---|---|
How Ravelry Scales to 10 Million Requests Using Rails (0) | 2009.09.22 |
Stack Overflow Architecture (0) | 2009.08.05 |
Scaling Twitter: Making Twitter 10000 Percent Faster (0) | 2009.06.27 |
PlentyOfFish Architecture (0) | 2009.06.26 |