기술자료

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

빅테이블과 다이나모의 장점을 흡수한 카산드라

기술자료
빅데이터 분류
빅데이터일반
작성자
dataonair
작성일
2013-12-17 00:00
조회
8347



빅테이블과 다이나모의 장점을 흡수한

카산드라



NoSQL 데이터베이스 중 이미 검증되고 향상된 분산 환경에서의 데이터베이스 처리 기술을 포괄하는 카산드라는 어도비, eBay, HP, Netflix 등과 같이 전 세계 사용자들의 빅데이터를 처리하는 실전 시스템에 적용돼 있다. 이 글에서는 구글 빅테이블(Bigtable), 아마존 다이나모(Dynamo)의 핵심기술이 녹아든 카산드라의 설계 철학과 발전과정, 구성요소 및 비즈니스 적용에 대한 구체적인 내용 등을 살펴보고 앞으로의 전망을 소개한다.



NoSQL 솔루션 중 하나인 카산드라는 그 이름을 그리스 신화의 예언녀 ‘카산드라(Cassandra)’에서 빌려왔다고 한다. 신화 속의 카산드라가 트로이인들에게 정확한 미래를 예측하고 제공했듯이 빅데이터 시대의 카산드라 데이터베이스도 빅데이터의 불확실한 환경에서 정확성과 미래 예측을 제공하는 주요 구성원으로서의 바람을 담아 명명됐을 것이다.

tech_img816.png

tech_img817.png

페이스북이 오픈소스를 기반으로 소셜 서비스를 시작할 무렵부터 개발 및 활용한 카산드라는 여느 분산 데이터베이스와 마찬가지로 수많은 서버들 사이에서 측정 불가능할 정도의 데이터를 저장 및 관리하고자 하는 목적에서 디자인, 설계, 개발됐다. 2008년에 이르러 카산드라는 페이스북의 품에서 떠나 아파치 인큐베이터 프로젝트로 출발해, 2010년에 이르러 탑 레벨 아파치 프로젝트로 인정받게 된다. 근 2년 만에 오픈소스 커뮤니티에서 핵심 프로젝트로 인정받게 된 것이다. 피어-투-피어 시메트릭(peer-to-peer symmetric) 노드를 기본 설계 개념으로 하고 시스템 실패 시 싱글 포인트 에러를 미연에 방지하는 핵심 기능을 제공하는 등, 카산드라는 빅데이터 시대의 핵심적인 분산 환경 데이터베이스를 제공한다. 카산드라가 제공하는 빅데이터 분산 데이터베이스 환경에서의 또 다른 장점은 어드민(admini strator)이 어떤 데이터가 복제되고 또 얼마나 많은 데이터가 카피될 것인지를 결정할 권한을 가지게 된다는 것이다.

페이스북에서 처음 카산드라를 개발한 아비나쉬 라쉬만(Avinash Lakshman)에 따르면 카산드라는 P2P 네트워크에서의 스트럭처드(structured) 스토리지 시스템으로서 시작됐다. 페이스북 내에서 인덱스 서치(index search) 문제를 어떻게 풀지를 고민하던 아비나쉬는 전 세계에서 매초마다 페이스북 사용자들이 만들어내는 엄청난 데이터의 저장과 그 데이터양의 증가에 맞게 처리할 수 있도록 고안된 카산드라를 만들어내게 된다. 즉, 하드디스크와 메모리 소요와 같은 비용(cost)을 최소화하면서 데이터의 처리 속도가 데이터양에 리니어하게 (linearly) 비례하는 솔루션을 찾게 된 것이다.

데이터 모델의 초창기 구성철학을 살펴보면 다음과 같다. 먼저 모든 로우(row)는 유니크 키에 의해 인식된다. 키는 스트링이며 그 사이즈에 제한이 없다. 두 번째, 카산드라의 인스턴스는 하나의 테이블을 갖는다. 테이블은 하나 이상의 사용자에 의해 정의된 컬럼(column) 패밀리를 지닌다. 컬럼들은 이름, 밸류, 사용자 정의된 타임스탬프(timestamp)로 구성된다. 무한대의 컬럼들로 구성 가능한 수퍼컬럼(supercolu mn)이 있으며 구성 시 컬럼과 수퍼컬럼 둘 중 하나를 선택할 수 있다.

tech_img818.png

tech_img819.png

데이터 분포, 복제, 에러 처리의 기본 철학은 다음과 같다. 데이터 분포는 기본적으로 클러스터에서의 수많은 노드들을 거쳐 일어나는데 컨시스턴트 해싱(Consistent Hashing)과 오더 프리저빙 해시(Order Preserving Hash) 기능에 기반한다. 클러스터 멤버십은 가십 스타일(Gossip Style) 멤버십 알고리즘을 통해 유지되며 각 노드들에서의 에러는 Accrual Style Failure Detector를 사용해 모니터링된다. 데이터 복제는 높은 유용성에 기여한다. 데이터센터들을 걸쳐 복제된 데이터들은 사용자가 원할 때 가장 가까운 데이터센터의 데이터를 제공할 수 있게 된다. 즉 읽기의 시간이 최소화된다.

이렇듯 카산드라는 초기 설계철학에 근거해 현재 전 세계적으로 열풍이 일고 있는 빅데이터 기술의 핵심으로 자리 잡았다. 카산드라는 더 많은 데이터 레인지(range)를 사용하며 외부 소스로부터의 데이터를 처리하고 애플리케이션의 목표에 맞는 수많은 데이터를 저장할 수 있는 인텔리전스를 포함하는 솔루션의 근간을 제공한다. 이는 결국 프로덕트 세일즈를 증가시키고 사용자 참여, 경험을 향상시키는 결과를 얻을 수 있도록 해준다.

카산드라 구성요소

페이스북 플랫폼에서 파생된 카산드라는 성능(performance)을 유지하면서 확장성(scalability)과 유용성(availability)을 극대화시키는 전략을 위해 아마존과 구글의 다이나모와 빅테이블의 장점을 취했다. 특히 빅테이블에서 가져온 수퍼컬럼 패밀리(supercolumn family) 데이터 모델은 컬럼 인덱스의 편리함, 로그 스트럭처 업데이트, 쿼리 결과 미리보기(materialized view), 그리고 빌트인 캐시를 가능케 해 주었다. 카산드라에 도입된 다이나모의 주요 피처(feature)들은 다음과 같다.

● Symmetric, P2P 아키텍처
● Gossip-based 클러스터 매니지먼트
● 분산 해시 테이블
- Pluggable partitioning
- Pluggable topology discovery
- Pluggable placement strategies
● 튜닝 가능한 eventual consistency

구글의 빅테이블에서 도입된 피처들은 다음과 같다.

● 스파스(Sparse) 컬럼 데이터 모델 : 수퍼컬럼 패밀리
● SSTable 디스크 스토리지
- Commit 로그에 적용
- Memtable 버퍼 및 소트
- Immutable SSTable 파일
● 하둡 통합 기능

구글 빅테이블과 아마존 다이나모의 특징적 장점들을 모두 취해 분산 환경을 위한 최적의 데이터베이스로 발전한 카산드라는 특히 확장성과 데이터 쓰기 속도에 있어 그 장점이 있다. 카산드라는 기존의 RDBMS 시스템에 비해 데이터 변화가 있을 시 오리지널 데이터 파일에 다시 쓰여지지 않는다. 이는 데이터 읽기와 랜덤 데이터 액세스를 일으키지 않는다. 커밋로그와 SSTable은 순차적 쓰기와 함께 새로운 파일로서 디스크로 플러시되기(flushed) 때문이다.

분산 환경에서의 컬럼 데이터베이스로 인정되는 카산드라는 Riptano라는 회사가 커머셜 버전으로 발전시켜 현재는 Datastax가 커머셜 버전을 관리하고 있다. 커머셜화되면서 다이나모의 Consistent Hashing, Partitioning, Replication 기능은 더욱 발전됐고, 빅테이블의 Column Families, Memtable, SSTable은 구체적이고 디테일화된다. 신축적 운용이 가능하고 자동화된 Provisioning 기능도 카산드라의 특징 중 하나다. 이로 인해, 분산 환경에서의 적은 대기시간(low latency)은 쓰기뿐 아니라 읽기에서도 카산드라가 상대적 우위를 지닐 수 있도록 해준다. 카산드라에서 사용되는 프로토콜들로는 로우레벨 아nary 커스텀 프로토콜, 다른 노드들의 위치 및 상태 정보를 알아내기 위한 Gossip 프로토콜 등이 있다.

기본 스토리지 유닛으로는 컬럼이 쓰이며 컬럼 패밀리는 like 레코드의 집합, 레코드 레벨 오토머시티(atomicity), 인덱스가 포함된다. 구체적으로 각 컬럼은 네임(Name)과 밸류(Value)를 지니게 되는데 각각 byte[]이며 sort order, conflict resolution 기능을 지닌다. 키 스페이스(keyspace)는 탑레벨 네임스페이스로 일반적으로 하나의 애플리케이션 당 하나가 존재한다. 정리해보면 카산드라는 쉬운 설치 및 셋업 환경에 더해, 분산 환경에서의 빅데이터 처리를 위한 데이터베이스로서 다음과 같은 여섯 가지 핵심적인 특징을 가진다.

● 클러스터들에 분산된 데이터
- 클라우드, 데이터 압축
● 분산 환경에서의 리니어한 확장성
- 어디서나 읽고 쓸 수 있는 디자인
- 신축성 있는 확장성
● 데이터센터들에 분산 복제된 노드들
- 싱글 포인트 실패 방지
● 튜닝 가능한 데이터 처리 정책
- 보장된 데이터 안정성
● 맵리듀스(MapReduce) 지원
- 캐시/추가적인 하드웨어 불필요
● 자바/파이썬 지원 커스텀 쿼리 언어 CQL
- 융통성 있고 다이내믹한 스키마

왜 카산드라를 써야만 하는가

현존하는 데이터 처리를 위해 카산드라를 활용해야 하는 이유는 크게 두 가지로 요약될 수 있다. 먼저 거의 리얼타임에 가까운 속도로 데이터에 접근할 수 있고 데이터를 처리할 수 있다는 것이 첫 번째 이유다. 스케일이 달라져도 이에 맞춰 인터렉티브하고 웹 베이스의 애플리케이션을 돌릴 수 있는 환경을 제공한다. 이는 기존의 Relational 데이터베이스에 비해 월등히 빠른 Insert와 분산된 카운터들의 사용, 그리고 Solid-State 드라이브를 채택해 활용할 수 있는 환경에 기인한다. 두 번째 이유는 분산된 데이터센터들에 맞게 애플리케이션이 구축될 수 있도록 지원하는 점이다. 공간적, 논리적으로 분산된 데이터센터들을 활용해 구축되는 애플리케이션은 high-level redundancy, failover, 벡업 솔루션 및 리커버리(recovery) 능력을 제공하고 또 수준 높은 Granular Control이 가능토록 함으로써 성능과 동시에 지속성 모두를 최적화하도록 해준다.

카산드라는 아파치 프로젝트로서 자바 언어로 만들어졌다. 컬럼에 의해 쿼리되는 분산 데이터베이스 처리 기술을 밑바탕으로 찾고자 하는 데이터들의 인덱스를 참조한다. 분산 환경에서의 해시 테이블과 같이 사용될 수 있으며 이는 SQL과 비슷한 언어인 커스텀된 CQL 언어에 의해 손쉽게 찾아질 수 있다. 물론, JOIN과 같은 기능에 좋은 성능을 발휘하지 못하는 NoSQL 카산드라는 불필요하다고 생각되는 JOIN 기능을 약화시키고 분산환경에서의 확장성과 스피드를 극대화하는 전략을 취했다.

카산드라의 기술적 특성으로 Insertion과 같은 프로세싱에서 데이터의 유효기간(expiration)을 설정할 수 있으며 상대적으로 읽기보다 빠른 쓰기가 가능한 점을 들 수 있다. 물론 Relational 데이터베이스에 비해선 월등히 빠른 쓰기 및 읽기 처리가 가능하다. 또 아파치 하둡과 궁합이 잘 맞는 맵리듀스 기술을 적절히 사용할 수 있으나 하둡/HBase와는 달리 카산드라 노드들은 마스터 노드 없이 같은 레벨에서 처리되고 데이터베이스들을 넘나들며 복제가 가능하다.

로깅(Logging)과 같은 쓰기(write)가 많은 처리환경이나 데이터 정형성이 중요한 프로세싱일 때 카산드라는 빛을 발한다. 또 시스템 빌딩에 리유스(reuse)하는 컴포넌트가 많은 자바를 요구하는 환경일 때에 카산드라가 주로 쓰인다. 주로 적용되는 분야로는 은행 시스템과 파이낸셜 인더스트리 애플리케이션, 그리고 특히 쓰기 처리가 중요한 데이터 분석 애플리케이션 등이 있다.

카산드라 상업화, 비즈니스 적용 및 시스템 구축

카산드라의 상업화를 지원하는 업체는 Datastax(http:// www.datastax.com)이다. 가장 기본적인 패키지로서 카산드라를 활용하는 프로덕트 라인에는 Datastax Enterprise, Datastax Community로서의 데이터베이스 소프트웨어가 있으며 매니지먼트 소프트웨어로 OpsCenter가 있다. 서비스 라인으로는 카산드라 활용 컨설팅과 지속적인 핫픽스와 같은 업데이트 서비스가 있다(커뮤니티용인 Datastax Community는 무료 다운로드 가능). 카산드라와 같이 빅데이터를 처리하는 데 최적화된 NoSQL 데이터베이스는 다음과 같은 빅데이터의 본질적 특성이 고려되는 비즈니스 솔루션을 개발하는 데 도움이 된다.

● Velocity : 빅데이터는 온라인 시스템, 센서 네트워크, 소셜 미디어, 웹/모바일 클릭스트림 등과 같은 다양한 데이터 소스에서 실시간으로 생산된다.
● Variety : 빅데이터는 스트럭처된, 세미 스트럭처된, 또 언스트럭처된 것과 같이 다양한 데이터 타입으로 구성된다.
● Volume : 빅데이터는 그야말로 현재의 데이터 용량을 뛰어넘는 테라바이트(terabyte) 또는 페타바이트(petabyte)가 기본이 되는 데이터의 양이다.
● Complexity : 빅데이터는 지정학적 또는 논리적으로 여러 데이터센터에 흩어져 저장되는 것으로 클라우드 등과 같은 아주 복잡한 환경에 존재한다.

어도비는 카산드라를 Adobe Audience Manager에 적용해 활용한다. 이는 디지털 마케팅 슈트로 수집할 수 있는 다양한 디지털 데이터 소스들로부터의 데이터를 모으고, 이 위에 태스크를 수행하고 또 최적화하는 데 활용한다. eBay는 연관된 여러 개의 애플리케이션들(Social Signals, Hunch 등)에 카산드라를 적용했다. 이 애플리케이션들은 전 세계 수백 개의 데이터센터들에 흩어져 있는 eBay의 데이터들과 연동돼 실시간으로 태스크를 수행하도록 카산드라 위에 설계 및 개발됐다. 카산드라는 이미 설계 단계에서부터 쉬운 인스톨과 구축을 목표로 삼았다. 카산드라를 사용하고자 하는 자바 개발자라면 다음과 같은 간단한 스텝들을 거쳐 다음의 simple insert 코드를 수행해 보자.

Step 1. 카산드라를 http://cassandra.apache.org/download/에서 다운로드한다. 필요하다면 http://wiki.apache.org/cassandra/ VersionsAndBuilds에서 소스 코드를 다운로드해 빌드할 수 있다.
Step 2. 자신의 환경에 맞도록 설정한다. 카산드라 configuration 파일은 conf 디렉터리에 있다. 설정 시 카산드라에서 사용되는 디렉터리와 메모리 allocation을 수행한다.
Step 3. 카산드라를 시작한다. 카산드라는 커맨드라인에서 ‘bin/ Cassandra -f’ 명령으로 실행된다. 서비스는 foreground에서 실행돼야 한다. Stop을 원한다면 ‘Control-C’를 누른다.
Step 4. cassandra-cli 사용하기. ‘bin/cassandra-cli’는 인터렉티브한 커맨드라인 인터페이스로서 사용자에게 스키마를 변형할 수 있고 데이터를 변형할 수 있는 환경을 제공한다. 예를 들어, ‘bin/ cassandra-cli’를 통해 로컬 카산드라 인스턴스에 접속해 ‘create keyspace MyTest’를 수행하면 ‘MyTest’라는 키스페이스가 만들어진다.

<리스트 1> 자바 메인 코드와 카산드라와 연동, insert하는 내부 함수 예제…
// utf-8 인코딩을 사용하여 byte[] / String을 번역하는 시리얼라이저
private static StringSerializer stringSerializer = StringSerializer.get();public static void insertData() {
try {

// 클러스터 오브젝트를 만든다.
Cluster cluster = HFactory.getOrCreateCluster("My Cluster", "localhost:9160");

// CLI를 사용하여 키스페이스 오브젝트를 만든다.
Keyspace keyspace = HFactory.createKeyspace("AuthDB", cluster);

// utf-8 인코딩을 사용하여 뮤테이토 오브젝트를 만든다.
Mutator mutator = HFactory.createMutator(keyspace, stringSerializer);

// 이미 존재하는 키에 뮤테이토 오브젝트를 사용하여 컬럼을 insert한다.
mutator.insert("sample", "authCollection",
HFactory.createStringColumn("my_username", "admin"));
mutator.insert("sample", "authCollection",
HFactory.createStringColumn("my_password", "admin"));

System.out.println("데이터가 제대로 insert됐습니다!");
} catch (Exception ex) {
System.out.println("Error encountered while inserting data!!");
ex.printStackTrace() ;
}
}public static void main(String[] args){
insertData();
}

여기까지 진행했다면 싱글 카산드라 노드에서 성공적으로 작업을 수행한 것이다. 카산드라 클러스터의 1개 노드를 만들었다면 원하는 만큼 노드들을 추가할 수도 있다. 카산드라 노드들은 Gossip이라는 메커니즘을 통해 정보를 교환한다. 이에 더해 정상적으로 동작하는 노드들을 시드(Seed)로 지정, 노드 확장을 할 수 있다. 노드 추가를 하고 설정하는 좀더 구체적인 내용은 아파치 카산드라 공식 페이지를 참고하자(http://wiki.apache.org/ cassandra/). 앞의 4개 스텝들과 같이 간단한 스텝을 통해 완성할 수 있을 것이다. 이제 시스템 셋팅 및 설정이 끝났다면 <리스트 1>과 같은 간단한 예제를 자바 프로젝트에 삽입해 수행할 수 있다.
카산드라에 대한 정보는 인터넷에서 손쉽게 구할 수 있다. 하지만, 좀더 깊이 있는 정보를 얻을 수 있는 컨퍼런스로는 ‘NYC Big Data Tech Day(2013년 3월 20일)’, ‘Hadoop Summit 2013(2013년 6월 26)’, ‘Oreilly Strata Conference and Hadoop World 2013(2013년 10월 28일)’ 등이 있다. 깊이 있는 최신 정보로 무장해 카산드라와 함께 빅데이터 활용의 시대로 뛰어들자.