아파치 카산드라(Apache Cassandra)는 자유 오픈 소스 분산형 NoSQL 데이터베이스 관리 시스템(DBMS)의 하나로, 단일 장애점 없이 고성능을 제공하면서 수많은 서버 간의 대용량의 데이터를 관리하기 위해 설계되었다.
카산드라는 여러 데이터센터에 걸쳐 클러스터를 지원하며 masterless 비동기 레플리케이션을 통해 모든 클라이언트에 대한 낮은 레이턴시 운영을 허용하며, 성능 면에서 높은 가치를 보인다.
Amazon의 Dynamo 분산 스토리지 및 복제 기술과 Google의 Bigtable 데이터 및 스토리지 엔진 모델이 결합된 모델로 처음에 단계적 이벤트 기반 아키텍처 (SEDA)를 사용하여 Facebook에서 설계되었다.
- 여러개의 데이터 베이스가 복제된다. (마스터기준)
- 짧은 지연 시간
- 프로세스가 추가될 때마다 선형 처리량 증가
- 온라인 부하분산
- 분할된 키 지향 쿼리
- 유연한 스키마
카산드라는 SQL과 비슷한 Cassandra Query Language (CQL)을 이용한다.
- Keyspace: 데이터세트를 어떻게 구성할 것인지에 대한 정의를 한다. 예를들어 데이터의 사본 수
- Table: 데이터 스키마를 정의한다.
- Partition: 모든 행에 있어야 하는 기본 키의 필수 부분을 정의한다.
- Row: 파티션 키 및 선택적으로 추가 클러스터링 키로 구성된 고유한 기본 키로 식별되는 열 모음
- Column: 해당 테이블에서 행에 속하는 열을 말한다.
카산드라는 분산형이므로 여러 머신에서 동작하지만, 사용자에게는 통합된 하나로 보인다. 물리적으로 떨어져 있는 데이터센터 간에도 단일 카산드라 클러스터를 운영할 수 있다.
MySQL, 빅테이블과 같은 데이터 저장소를 확장하려면 일부 노드는 마스터로 설정해서 슬레이브로 설정한 다른 노드를 조직화해야한다. 그러나 카산드라는 "비집중화"이므로 모든 노드가 같다. 그러므로 조직화 연산을 수행하는 마스터가 없다. 대신 카산드라는 피투피(P2P) 프로토콜이며 활성 노드와 비활성 노드의 목록을 동기화하고 유지관리한다.
탄력적인 확장성(elastic scalability)은 수평 확장의 특별한 속성으로, 클러스터의 중단 없이 규모를 확대하거나 축소할 수 있다는 뜻이다.
하나의 카산드라를 추가했을 때, 카산드라는 새로 추가된 머신을 자동으로 찾아내고 작업을 할당한다. 애플리케이션의 일부를 다른 플랫폼으로 이전하거나 애플리케이션의 사용자가 없어져 클러스터를 줄여야 하는 상황이라 규모 축소를 하더라도 전체 구성을 건드릴 필요가 없다.
고가용성 시스템을 구축하려면 일반적으로 다중네트워크로 구성된 컴퓨터, 클러스터에서 운용할 수 있는 소프트웨어, 노드 장애를 인식하고 시스템의 다른 파티션으로 요청을 대체 할 수 있는 기능을 갖춰야 한다.
카산드라는 고가용성을 지원한다. 클러스터에서 시스템을 중단하지 않고 장애가 발생한 노드를 교체 할 수 있고, 다중 데이터 센터에 데이터를 복제해 로컬 성능을 개선할 수 있으며, 한 데이터 센터가 화재나 홍수 같은 치명적인 재앙을 당하더라도 다중 데이터 센터에 데이터를 복제해서 서비스 중단을 예방할 수 있다.
로우 키와 칼럼 두가지에 대한 인덱스만 가능하기 때문에 복잡한 조건의 검색이 불가능하다. 키 값을 통한 범위 검색은 데이터 분산 방식을 OrderPresservingPartitioner로 설정하여 키 값을 통해 데이터를 서버에 분배했을 경우에만 가능하다.
데이터를 입력 시에도 자동화 처리가 어렵다. 데이터에 대한 락을 사용하려면 주키퍼(Zookeeper)와 같은 전체분산 서버 관리 프로그램을 추가해서 별도로 설정해야 한다. 데이터에 대한 동시 갱신 요청이 발생할 가능성이 높거나 자동화한 트랜잭션이 필요한 서비스에서는 다른 데이터베이스를 고려해야 한다.
카산드라의 데이터 구조 최상위에는 논리적 Data 저장소인 Key space가 있고, Key space 아래에는 Table이 존재한다. Table은 다수의 row들로 구성되어있으며 각 row는 Key Value로 이루어진 칼럼들로 구성된다. 관계형 데이터베이스 관리 시스템의 DB-Table-Row-Column의 형태와 유사한 구조를 하고 있다는 걸 알 수 있다.
카산드라는 기본적으로 링(Ring) 구조를 띄고 있다. 그리고 링을 구성하는 각 노드에 데이터(Data)를 분산하여 저장한다.
파티션 키라고 불리는 데이터의 해시(hash)값을 기준으로 데이터를 분산하게 된다. 처음 각 노드가 링에 참여하게 되면, 카산드라의 conf/cassandra.yaml
에 정의된 각 설정을 통하여 각 노드마다 고유의 해시 값 범위를 부여받는다.
그런 뒤에, 외부에서 데이터의 요청이 오게 되면 해당 데이터의 파티션 키의 해시 값을 계산하여 해당 데이터가 어느 노드에 저장되어 있는지 알고 접근할 수 있는 것이다. 그리고, 카산드라는 이렇게 계산된 hash의 값을 토큰(token)이라고 부른다.