해당 블로그는 KT UCloud 의 지원을 받고 있습니다.
해당 글은 http://metabroadcast.com/blog/looking-with-cassandra-into-the-future-of-atlas 글을 발 번역한 것입니다. 오역에 주의하세요. 왜 성공(?) 적인 MongoDB에서 다른 NoSQL 로 옮겨갈까요? 사실 어느 하나가 특별히 나쁜 경우는 없습니다. 자신의 needs 가 바뀌거나 새로운 needs 가 생겨서 그게 적응해야 하는게 아닐까 싶습니다. 그럼 왜 atlas 의 미래에서 카산드라가 어떤 역할을 할지 함께 살펴보도록 하겠습니다.
looking with cassandra into the future of atlas
Written by Sergio Bossa on 13 Jul 2012
우리가 MongoDB 를 거의 모든 부분 에서 사용하고 있는 것은 놀라운 일은 아닙니다.
그리고 우리가 세계 최고를 지향하고, Atlas platform 에 다양한 미디어 소스 데이터를 더더욱 많이 집어 넣을려고 하는 것도 놀랍지 않습니다. Atlas platform은 MongoD의 확장성 제한을 두드려 부수고, 잘 알려지지 않은 버그를 발견하고, 디자인 결정에 대해 여러가지 궁금중을 가지도록 이끌어주고 있습니다.
이것이 곧 다가올 Atlas 4.0 버전에서 기어를 비 관계 데이터베잇 진영에서 가장 유명한 Cassandra 바꾸고 옮길려고 하는 이유입니다.
is it because you’re all crazy hipsters?
MongoDB에서 Cassandra로 옮기는 이유는 최신 기술이나 훌륭한 기술에 심취되어 있기 때문이 아니라, Atlas 플랫폼에서발생하는 데이터와 사용자 측면에서 큰 성장을 하고 있기 때문입니다.
- 장애에 대한 높은 회복성이 필요합니다. MongoDB는 replica sets을 제공하지만, replica 끼리 동기화하거나 replication이 뒤쳐졌을 때 많은 문제를 경험했습니다.
- 높은 확장성이 필요합니다. MognoDB의 global Lock과 많은 메모리에 대한 요구는 크게 증가하는 데이터 셋을 다루기에 이미 적합하지 않습니다.
그래서 다음과 같은 이유로 Cassandra로 옮기기로 결정했습니다.
- Cassandra는 JVM 위에서 동작합니다. 우리는 JVM에 대한 많은 경험이 내부적으로 있습니다.
- 스토리지 용량과 처리 성능 측면에서 확장이 가능합니다.
- Cassandra의 Column-Based 데이터 모델은 몇 분 뒤에 얘기할 몇 가지 고급 기능을 제공합니다.
- Cassandra의 Consistency Level 에 대한 설정은 높은 가용성과 일관성 요구사항에 대해서 훌륭한 제어권을 줍니다.
그러나 단순히 이론적인 고려사항에서 멈추지 않고, Cassandra를 사용하기 위해서, 프로토타이핑과 테스트을 진행했습니다.
하나의 Cassandra 클러스터를 AWS에 배포하고, 데이터 스키마를 프로토타이핑하고 CassJMeter 로 테스트를 시작했었습니다.( 현재까지 계속 CassJMeter에 공헌하고 있습니다. )
테스트는 훌륭하게 성공했습니다. Atlas 4.0으로 Cassandra 가 들어오게 되고, 몇몇 중요한 작업을 담당하게 되었습니다. 이제 우리가 직면한 여러가지 도전에 대해서 살펴볻록 하겠습니다.
first things first: organizing data in a schemaless world
Cassandra는 관계 데이터베이스를 선택하는 것과 매우 다릅니다. 또한, Cassandra 는 schemaless 데이터베이스의 일종입니다. 그러나 Cassandra는 자기 자신의 데이터 모델을 가지고 있습니다. Cassandra의 데이터 모델은 Keyspace 와 Column Family 들을 정의할 수 있고, Column Family 내부에 원하는 만큼의 많은 Column들을 만들 수 있습니다. 이것은 큰 유연함을 제공해주지만, 어떻게 데이터를 구조화 할것인지에 대해서는 확신을 주지 않습니다.
우리의 데이터는 중첩된 아이템과 여러개의 필드를 가지고 있는 아이템으로 구성되어 있습니다. 해당 데이터 모델을 Cassandra에서 사용하기 위해서 다음과 같은 방법을 할 수 있었습니다.
- 엔티티들을 불확실한 데이터로 모델링했습니다. 실제로 Cassandra는 Key/Value 저장소로 이용합니다.
- 실용적으로, Cassandra를 관계 데이터베이스 처럼 사용하기 위해서, id 로 연관된 엔티티들에 대해서 각 엔티티의 필드들을 다른 컬럼들과 연관지어서 사용했습니다.
액세스 패턴에 기반해서 데이터를 모델링 하는 것을 선택했습니다. 엔티티들이 종종 거대하고, 다른 클라이언트들이 각기 다른 시간에 다른 부분에 접근할 필요가 생겨서, 각기 다른 부분들을 쪼개어서, 하나하나를 컬럼으로 저장하는 형태로 엔티티들을 저장했습니다. 지금도 계속 전적으로 개발하고 있지만, 이것은 실제로 클라이언트가 필요한 엔티티들만 탐색하도록 하게 만들어줄 것입니다. 그로 인해서, 서버나 클라어인트 측면에서 네트웍 밴드위스나 메모리 사용량이 줄어들 것입니다.
현명하게 구현하기 위해서, 엔티티들은 Cassandra 안에 JSON 형태로 저장되어 있습니다. Jackson 을 JSON 과 오브젝트 간에 자동적으로 매핑하기 위해서 사용합니다. 방금 얘기한 쪼개는 작업을 구현하기 위해서 filters 를 사용합니다. 그리고 데이터 모델에 Jackson에 의존적인 어노테이션을 적용하는 것을 피하고 데이터 모델을 깨끗하고 직렬화나 저장시 자유게 유지하기 위해서 mixins 을 사용합니다.
다음 도전은 …
being available, or being consistent?
CAP theorem 에 대해서 들어보셨을 껍니다.그리고 eventual consistency에 대해서도 역시 들어봤을 껍니다.
데이터 모델 측면에서 Cassandra는 유연함을 주었지만, 장애 측면에서도 Consistency Level을 설정 할 수 있게 함으로써 높은 가용성과 일관성 사이에도 유연함을 제공합니다.
실용적으로, 몇개의 Cassandra Replica 가 쓰기나 읽기 요청에 대답할지에 대해서 결정할 수 있습니다. 높은 가용성과 강한 일관성 사이의 트레이드 오프에 대해서 결정할 수 있습니다.
결국 필요한 요구사항에 의해서 우리의 선택이 결정됩니다.
Atlas 플랫폼은 몇개의 백그라운드 프로세스들이 다양한 소스로 부터 데이터를 수집합니다. 이때는 데이터의 일관성이 무엇보다 중요합니다. 그래서 “Quorum” 일관성을 선택했습니다. 일관성이 깨지는 것을 피하기 위해서 과반수 이상의 노드가 성공했음을 인지해야 함을 의미합니다.
반면에, 다수의 클라이언트가 플랫폼으로 부터 데이터를 읽어갈 때는, 성능과 가용성이 가장 중요합니다. 그래서 이 때는 “one” consistency level을 선택하고, 이것은 한대의 서버만 읽기 요청에 응답하면 됩니다. 비록 이전 데이터를 넘겨줄 수도 있지만요.(이것은 나중에 자동적으로 수정될것입니다.)
그래서 데이터 모델과 액세스 패턴에 대해서 명확하게 알고 있었고, 코드를 구현했었습니다. 이제 운영을 위한 시간이었습니다.
the devil is in the operations
초반에 언급한 것 처럼, 장애 대응은 확장성 만큼 중요합니다. 그래서 실제 서비스에 추가하기 전에 여러 차례 장애 복구 테스트를 진행했습니다. Cassandra에 대해서 많은 것들을 배웠고, 지금도 다른 블로그의 주제가 될 만한 것들을 계속 많이 배우고 있습니다. 그런데, 여기에 몇 가지 주의할 부분들이 있습니다.
- 장애난 노드를 교체할 때, 현명하게 토큰을 선택해야 합니다. 안전하게 정식 공식인 “오래된 토큰 – 1 ” 을 선택합니다.
- DNS를 엉망으로 만들지 말아야 합니다. 수동으로 “auto_bootstrap”을 설정해서 새로운 노드가 bootstrap 할 때, seeds 목록안에 새로운 노드의 DNS 주소가 들어가 있도록 설정해서는 안됩니다.(역자 주: Cassandra는 bootstrap 시에 seed 목록에 있는 노드로 부터 정보를 가져옵니다. 아무 데이터나 정보가 없는 노드로 부터 정보를 가져오게 되면 음… -_-)
- 복구 과정을 문서화 하고 가능한 자동화 해야 합니다.(우리는 Puppet 을 사용합니다.)
the end?
우리는 일찍 그리고 자주 출시합니다. 그래서 Cassandra 를 Atlas 3.0에 단지 추가한 것만을 홍보하는 것만으로도 자랑스럽습니다. Cassandra는 새로운 음악 데이터를 서비스하기 위해서 글로벌 비디오&오디오의 인덱스와 음악의 메타데이터를 서비스하고 있습니다.
물론 계속 작업 중입니다. 여전히 많은 데이터는 MongoDB 안에 있고, 몇달안에 해당 데이터를 이전할 것이고, Atlas 4.0의 쿨한 기능들을 완료할 것입니다.
Cassandra 가 MongoDB 만큼 쿼리 능력을 제공하지 못하기 때문에(오직 모자라는 부분입니다.) 우리는 ElasticSearch 를 추가하기로 결정했습니다. 이것은 다음 포스트에서 다루기로 하겠습니다. 그 동안에, 이 글을 좋아하기를 바랍니다.