1.Altibase Sharding 소개#
이 장은 Altibase Sharding의 개념과 특징에 대하여 설명한다.
샤딩 개요#
샤딩 개념 및 모델#
샤딩(Sharding)은 한 대의 데이터베이스에 저장했던 데이터를 여러 대의 데이터베이스에 분산하여 저장 및 처리하는 스케일 아웃 기술이다.

[그림 1‑1] sharding 개념
샤딩의 유형은 일반적으로 코디네이터를 이용하여 데이터를 분산하여 처리하는 서버측 샤딩(server-side sharding)과 응용프로그램에서 데이터를 분산하여 처리하는 클라이언트측 샤딩(client-side sharding) 방식이 있다. 그리고 이 두 가지 방식을 모두 수용하는 하이브리드 샤딩(hybrid sharding) 방식도 가능하다.
-
서버측 샤딩(Server-side Sharding)
-
클라이언트측 샤딩(Client-side Sharding)
-
하이브리드 샤딩(hybrid sharding)
서버측 샤딩(Server-side Sharding)#

[그림 1‑2] 서버측 샤딩
서버측 샤딩은 응용프로그램들과 호환하기 위하여 분할된 데이터베이스를 통합하는 코디네이터(coordinator)가 필요하다. 코디네이터는 응용프로그램에서 요청 받은 질의처리에 필요한 데이터의 위치를 파악하고, 해당하는 데이터베이스들에 질의를 분산 처리하여 그 결과를 통합하여 반환한다.
이 구조는 코디네이터의 도움으로 기존 응용프로그램 변경을 최소화할 수 있는 장점이 있다. 반면 코디네이터 처리 용량을 넘어서면 병목현상(bottle-neck)이 발생하여 샤딩 시스템을 확장하기 어려운 단점이 있다.
클라이언트측 샤딩(Client-side Sharding)#

[그림 1‑3] 클라이언트측 샤딩
클라이언트측 샤딩은 응용프로그램에서 데이터가 위치한 데이터베이스를 미리 알고, 직접 데이터베이스에 접속하는 구조이다.
이 구조는 샤딩 확장에 따른 용량과 성능 확장이 가능하고 코디네이터 부하 한계로 인한 제약점이 없다는 장점이 있다. 그러나, 응용 프로그램에서 분산 데이터베이스 접속을 판단하고 통합 질의를 수행해야하기 때문에, 프로그램 작성이 복잡해진다는 단점이 있다.
하이브리드 샤딩(Hybrid Sharding)#
하이브리드 샤딩은 클라이언트측 샤딩과 서버측 샤딩을 동시에 사용할 수 있는 샤딩 방식이다.
애플리케이션은 데이터의 통합이 필요한 경우 서버측 샤딩을 선택하거나, 확장과 성능이 필요한 경우 클라이언트측 샤딩을 선택하여 각 샤딩의 장점을 취하고 단점을 보완할 수 있다.

[그림 1‑4] 하이브리드 샤딩
용어#
샤드 노드(shard node)#
샤딩 시스템을 구성하는 각각의 데이터베이스 인스턴스이다. 최대 128개의 샤드 노드를 지원한다.
샤드 메타(shard meta)#
샤드 노드의 정보, 샤드 객체, 분산 설정 등 샤드 관련 정보가 저장되는 메타 테이블들을 총칭하여 샤드 메타라고 한다. 샤드 메타 테이블들은 sys_shard 사용자의 객체로 관리된다.
샤드 코디네이터(shard coordinator)#
분산된 데이터베이스를 통합하여 질의를 최적화하고 수행하는 분산 질의 처리기이다.
샤드 라이브러리(shard library)#
하이브리드 샤딩을 지원하는 응용프로그램 라이브러리이다.
샤드 데이터(shard data)#
분산된 데이터 조각이다. 전체 분산 데이터베이스의 데이터 일부를 가지고 있다.
샤드 커넥션(shard connection)#
외부 커넥션과 내부 커넥션을 통칭하여 샤드 커넥션이라고 한다.
외부 커넥션(external connection)#
외부 네트워크를 사용한 샤드 노드의 연결을 외부 커넥션이라고 하며 외부 커넥션은 사용자 커넥션과 샤드 라이브러리 커넥션의 두 가지가 있다.
사용자 커넥션(user connection)#
클라이언트가 샤드 메타 데이터베이스에 명시적으로 접속한 연결이다.
샤드 라이브러리 커넥션(shard library connection )#
샤드 라이브러리를 사용한 클라이언트가 데이터 처리를 위해 샤드 노드들에 자동으로 접속한 연결이다.
내부 커넥션 (internal connection)#
내부 네트워크를 사용한 샤드 노드의 연결을 내부 커넥션이라고하며 샤드 노드들 간에 내부적으로 사용하는 것으로 코디네이터 커넥션이 있다.
코디네이터 커넥션 (coordinator connection)#
샤드 노드들 간에 내부적으로 사용하는 연결이다.
샤드 세션(shard session)#
사용자 커넥션으로 연결된 세션과 관련하여 열린 모든 세션의 그룹을 샤드 세션이라 한다.
코디네이팅 샤드 노드(coordinating shard node)#
샤드 노드들 중 사용자가 접속한(사용자 커넥션) 샤드 노드를 말한다.
분산 방식(split method)#
샤딩 시스템에서 데이터를 위치시키는 방법이다. 데이터의 특성에 맞게 적용할 수 있는 다양한 분산 방식을 제공한다. 현재 지원하는 분산 방식은 다음과 같다.
-
HASH
-
RANGE
-
LIST
-
COMPOSITE
-
CLONE
-
SOLO
샤드 객체(shard object)#
분산 저장 및 처리되는 객체를 지칭한다. 현재 지원하는 분산객체는 다음과 같다.
- Table
- Procedure
샤드 테이블(shard table)#
Altibase Sharding에서 제공하는 분산 방식에 따라 설정된 테이블을 샤드 테이블이라고 하며 샤드 테이블에 대한 정보는 샤드 메타에 등록된다. 샤드 테이블은 다음과 같이 분류된다.
- 샤드 키 분산 테이블
-
단일 샤드 키 분산 테이블 ( HASH, RANGE, LIST )
-
복합 샤드 키 분산 테이블 ( COMPOSITE )
- 복제 분산 테이블 ( CLONE )
- 독립 분산 테이블 ( SOLO )
샤드 쿼리(shard query)#
샤딩으로 분산된 데이터베이스에서 쿼리는 샤드 쿼리와 논샤드 쿼리로 분류한다.
샤드 쿼리는 분산된 테이블의 레코드를 쿼리 수행하여도 결과가 논리적으로 동일한 테이블의 레코드를 처리한 것과 동일하다. 논샤드 쿼리는 샤드 쿼리가 아닌 모든 쿼리를 지칭한다.
클라이언트측 샤딩으로 수행할 경우, 스케일 아웃이 가능하다. 샤딩으로 데이터베이스를 분산하면, 샤드 쿼리를 사용하는 것이 좋다.

[그림 1‑5] 샤드 쿼리

[그림 1‑6] 논샤드 쿼리
샤드 쿼리의 몇 가지 예를 보면 다음과 같다.
SELECT * FROM s1 WHERE k1=1;
SELECT * FROM s1;
UPDATE s1 SET i2=1 WHERE k1=1;
DELETE FROM s1 WHERE k1>3;
샤드 쿼리가 아닌 몇 가지 예를 보면 다음과 같다.
SELECT COUNT(*) FROM s1;
SELECT k1, COUNT(*) FROM s1 group by k1;
SELECT * FROM s1 order by k1;
Altibase Sharding은 스케일아웃을 위하여 가능한 한 샤드 쿼리를 샤드 라이브러리를 사용하여 하이브리드 샤딩(클라이언트측 샤딩)으로 수행하는 것을 권장한다.
논샤드 쿼리는 샤드 코디네이터의 중간 처리를 거치게 되어 질의 처리 성능이 샤드 쿼리에 비해 떨어지므로 논샤드 쿼리를 튜닝하여 클라이언트측 샤딩으로 수행하는 것이 좋다.
샤드 뷰(SHARD view)#
Altibase Sharding은 샤드 뷰를 제공한다. 쿼리가 논샤드 쿼리인 경우, 앞에 SHARD 키워드를 추가하면 샤드 노드에 논샤드 쿼리를 전송할 수 있다.
샤드 뷰를 사용하면 샤드 코디네이터의 부하를 줄이거나, 사용자가 의도하여 분산 쿼리를 수행할 수 있다.
샤드 코디네이터의 부하를 줄이는 예는 다음과 같다.
SELECT SUM(k1) FROM s1;
위 쿼리를 각 샤드 노드에서 부분 합을 얻고 코디네이터에서 취합하도록 다음과 같이 수정할 수 있다. 가능한 한 코디네이터의 부하를 샤드 노드로 분산하는 것이 스케일아웃 측면에서 더 유리하다.
SELECT SUM(s) FROM SHARD(SELECT SUM(k1) s FROM s1);
또한 아래와 같이 샤드 뷰를 이용하여 테이블의 레코드 수를 노드별로 얻는 쿼리 작성도 가능하다.
SELECT * FROM SHARD(SELECT shard_node_name(), COUNT(*) FROM s1);
샤드 쿼리 분석기(shard query analyzer)#
사용자의 쿼리가 샤드 쿼리인지 논샤드 쿼리인지 분석한다. 샤드 쿼리인 경우 샤드 코디네이터 없이 클라이언트측 샤딩에서 독립적으로 수행할 수 있도록 분석 결과를 생성한다.
샤드 분석결과는 쿼리 수행 시마다 재사용되어, 샤드 코디네이터에서 샤드 쿼리 분석으로 생기는 부하는 크지 않다.
샤드 쿼리 최적화기(shard query optimizer)#
사용자의 쿼리가 논샤드 쿼리이면 쿼리를 분석하여 샤드 데이터 영역에 요청할 부분과 샤드 코디네이터에서 수행할 부분으로 분리하고, 최적화하여 분산 플랜을 생성한다.
샤드 키(shard key)#
분산 정의의 기준이 되는 컬럼 또는 파라미터이다. 현재 샤드 키로 사용할 수 있는 데이터 타입은 다음과 같다.
- SMALLINT
- INTEGER
- BIGINT
- CHAR
- VARCHAR
샤드 키워드(shard keyword)#
Altibase Sharding에서 지원하는 키워드로 임의의 데이터가 존재하는 샤드 노드로 쿼리를 수행하게 할 수 있다. 샤드 키워드의 종류는 다음과 같다.
- SHARD
- NODE
샤드 지원 구문의 앞이나 SELECT문의 샤드 뷰 앞에 사용하면 샤드 키워드의 성격에 맞게 해당 쿼리를 수행하여 그 결과를 반환한다.
SHARD SELECT shard_node_name(),COUNT(*) FROM s1;
NODE[DATA] SELECT shard_node_name(),COUNT(*) FROM v$session;
NODE[DATA(‘node1’)] SELECT * FROM s1;
샤드 프로시저(shard procedure)#
샤딩 시스템에 설정된 분산 정의된 프로시저로 지정된 인자의 값을 기준으로 분산 수행된다. 프로시저 내의 쿼리에 대해서는 사용자가 분산 처리하도록 작성해야 한다.
샤드 플랜(shard plan)#
질의가 샤드 코디네이터에서 분산 수행되는 경우의 질의 수행계획을 말한다. 샤드 플랜에는 샤드 노드에서 분산 수행된 질의의 수행계획을 포함한다.
샤드 트랜잭션(shard transaction)#
애플리케이션이 생성한 트랜잭션에서 수행하는 질의의 따라 샤드 노드들에 분산 트랜잭션을 생성하게 된다. 이 트랜잭션들을 샤드 트랜잭션이라고 한다.
샤드 트랜잭션은 다음과 같이 분류할 수 있다.
- 다중 노드 트랜잭션(multiple node transaction)
분산 트랜잭션을 허용하지만, 샤드 트랜잭션의 일관성을 보장하지 않는다.
샤드 메타 번호(Shard Meta Number )#
샤드 메타 번호(SMN)란 샤드 메타에 대한 버전 관리 번호 이다.
용어 및 개요 정리#
전체적인 Altibase Sharding 시스템에서 사용되는 용어에 대해서 [그림 1-7]에서 도식화 하였다.

[그림 1‑7] Altibase Sharding 용어 및 개요
Altibase Sharding 개요#
Altibase Sharding 소개#
Altibase Sharding은 Altibase에 샤딩 기술을 도입하여 저장 용량과 시간당 처리량을 향상시키고 대용량의 데이터베이스를 분산처리할 수 있게 한다.
Altibase Sharding은 하이브리드 샤딩으로써, 기존의 SQL을 분석하여 자동으로 클라이언트측 샤딩이나 서버측 샤딩으로 수행할 것인지를 분석하여 경로를 최적화한다.
Altibase Sharding은 다양한 분산 방식과 분산 객체, 유틸리티를 지원하고 있으며, 다양한 업무에서 샤딩을 적용할 수 있다.
기존의 SQL을 수정하지 않고, 샤드 전용 라이브러리만 교체하는 것으로 Altibase Sharding을 쉽게 적용할 수 있다. 뿐만 아니라 기존 응용프로그램을 전혀 수정하지 않은 상태에서도 서버측 샤딩을 적용할 수 있다.

[그림 1‑8] Altibase Sharding의 하이브리드 샤딩
Altibase Sharding 구성 요소#
Altibase Sharding은 사용자 응용프로그램 측에서 동작하는 샤드 라이브러리와 샤드 노드 존재하는 샤드 메타, 데이터 그리고 샤드 코디네이터로 구성되며, 이들 구성요소가 서로 유기적으로 연계되어 분산 처리를 수행한다.

[그림 1-9] Altibase Sharding 구성 요소
Altibase Sharding 장점#
Altibase Sharding은 일반적인 샤딩의 장점 외에도 추가적인 장점을 가지고 있다.
선형 확장성#
Altibase Sharding은 Altibase에 샤딩 기술을 도입하여 성능 병목을 제거하고 샤드 노드를 추가하여 저장 용량과 시간당 처리량을 선형적으로 향상시켜 대용량의 데이터를 분산 처리할 수 있다.
오류 독립성#
Altibase Sharding을 통해 사용자는 하나의 데이터베이스를 논리적으로 나누어 관리할 수 있다. 하나의 샤드 노드가 비정상적이거나 속도가 느려지더라도 다른 샤드 노드의 성능이나 가용성에는 영향을 미치지 않는다.
애플리케이션 호환성#
Altibase Sharding은 서버측 샤딩과 클라이언트측 샤딩을 동시에 지원하는 하이브리드 샤딩을 지원한다. 사용자 쿼리의 쿼리 최적화를 통해, 자동으로 성능에 유리한 클라이언트측 샤딩으로 수행되거나 호환성이 높은 서버측 샤딩으로 수행된다.
특히, Altibase Sharding의 하이브리드 샤딩은 기존 응용프로그램 소스나 기존 SQL을 수정하지 않고, 샤드 전용 라이브러리만 교체하는 것으로 적용할 수 있다.
사용자 정의 데이터 분산#
Altibase Sharding을 통해 사용자는 데이터베이스의 데이터를 원하는 형태로 분산할 수 있도록 정의할 수 있다.
예를 들면, 특정 관할 구역에 대한 데이터를 사용자가 원하는 샤드 노드에 위치시킬 수 있기 때문에, 논리적으로 특정 구역에 대한 데이터를 모을 수 있다.
또한 지역적으로 가까운 데이터들을 물리적으로 가까운 샤드 노드에 위치시킬 수 있기 때문에, 물리적으로 특정 관할 구역에 가까운 데이터를 모아둘 수도 있다.
이중화를 통한 고가용성#
Altibase Sharding은 이중화를 지원한다. 이중화를 이용하여 샤딩환경에서도 안전한 HA(High Availability)를 구축할 수 있다.
Altibase Sharding 구성#
Altibase Sharding은 다음 요소로 구성되어 있다.
- 응용프로그램
- 샤드 라이브러리
- 샤드 노드
- 샤드 메타
- 샤드 데이터
응용프로그램은 샤드 라이브러리를 사용하여 클라이언트측 샤딩과 서버측 샤딩을 사용할 수 있으며, 그 외의 라이브러리를 사용하는 경우 서버측 샤딩만을 사용할 수 있다.
샤드 메타는 샤드 노드 구성 및 샤드 객체에 관련된 정보 및 샤딩에 필요한 메타 데이터를 저장한다.
샤드 코디네이터는 샤드 쿼리 분석기, 최적화기, 실행기로 구성되어있으며 쿼리를 분석하고 최적화하여 전체 샤드 노드들간의 데이터 및 트랜잭션 처리를 조율한다.
샤드 데이터는 실제 데이터가 분산 저장되어 있는 데이터베이스이다.
샤딩 시스템 구성#
Altibase Sharding 시스템은 모든 샤드 노드가 샤드 메타, 코디네이터 및 데이터 저장소에 대한 역할을 할 수 있도록 구성해야 한다.
하나의 샤드 노드는 그림 1-10과 같이 고가용성을 고려하여 데이터를 Standby로 이중화하는 것을 권장한다.
Altibase Sharding 시스템은 단일 장애점(SPOF: single point of failure)이 없는 시스템 구성으로 높은 신뢰성을 가질 수 있으며 코디네이터의 부하를 분산 시킬 수 있는 장점을 가지고 있다.

[그림 1‑10] Altibase Sharding 시스템 구성
Altibase Sharding 특징#
Altibase Sharding은 Altibase DBMS를 기반으로 데이터를 분산 저장하며, 클라이언트측 샤딩과 서버측 샤딩을 동시에 사용하는 하이브리드 샤딩을 제공한다.
지능적인 클라이언트측 샤딩#
일반적으로 샤딩은 서버측 샤딩을 주로 제공하면서, 부분적으로 클라이언트측 샤딩을 지원한다. 그러나 알티베이스의 샤딩은 클라이언트측 샤딩을 서버측 샤딩과 동일하게 제공한다.
일반적인 클라이언트측 샤딩의 특징은 다음과 같다.
-
커넥션 시점 샤딩
응용프로그램에서 특정 노드를 지정하여 접속하는 방식이다. 다른 노드에 접근하기 위해서는 재접속을 해야 한다. -
SQL생성 시점 샤딩
응용프로그램에서 쿼리를 생성할 때 수행할 노드를 지정하는 방식이다. 다른 노드에 접근하기 위해서는 쿼리를 재생성해야 한다.
Altibase Sharding의 클라이언트측 샤딩의 특징은 다음과 같다.
-
SQL수행 시점 샤딩
서버측 샤딩과 동일하게, 응용프로그램에서 쿼리를 수행하는 시점에 자동으로 수행할 샤드 노드가 선택된다. 사용자는 샤드 노드를 구분할 필요가 없다. -
하이브리드 샤딩
쿼리에 따라 클라이언트측이나 서버측으로 수행경로를 변경하여 성능을 최대화한다.
쉬운 SQL 작성#
Altibase Sharding환경에서는 별도의 API나 SQL 힌트 등의 추가 인터페이스 없이 사용자의 질의(SQL)만으로 샤딩 기능을 사용할 수 있다. 또한 분산 테이블과 일반 테이블을 구분하지 않고 SQL을 작성하는 것만으로 샤딩을 사용할 수 있다.
특히, Altibase Sharding은 사용자가 하이브리드 샤딩을 고려하여 쿼리를 튜닝할 수 있도록 추가적인 샤드 키워드를 제공하여 쉽게 SQL을 작성할 수 있다.
쉬운 샤드 설정#
Altibase Sharding은 Altibase 패키지에 내장된 기본 기능이다. Altibase Sharding을 사용하려면, 이 기능을 활성화하고 샤드 설정만 추가하면 이미 사용중인 데이터베이스를 샤드 데이터베이스로 변경할 수 있다. 따라서 데이터베이스를 재생성할 필요가 없으며, 프로퍼티 설정을 통하여 샤드 노드로 사용할 수 있다.
Altibase Sharding은 샤딩 시스템을 운영, 관리하는데 필요한 DBMS_SHARD 패키지를 제공한다. 이 패키지에서 제공하는 서브프로그램을 이용하여 샤드를 구성하고 관리하며, 다른 샤드 노드에 직접 접속하지 않고도 원격 샤드 노드를 관리할 수 있는 기능을 제공한다.
No SPOF(No Single Point Of Failure)#
Altibase Sharding의 샤드 메타와 샤드 코디네이터는 모든 샤드 노드에서 동일하게 수행할 수 있는 구성 요소 이므로, 통합 구성시 전체 샤딩 시스템의 단일 장애점(single point of failure)이 없다는 특징을 갖는다.
샤드 쿼리 분석기 (Shard Query Analyzer)#
Altibase Sharding의 샤드 쿼리 분석기는 사용자의 질의를 분석하여 최적의 수행 경로와 수행 방법을 선택한다.
샤드 쿼리 분석기는 샤드 노드에 입력되는 모든 쿼리를 분석하여 서버측 샤딩으로 수행하는 쿼리와 클라이언트측 샤딩으로 수행하는 쿼리로 구분한다.
클라이언트측 샤딩으로 수행하는 경우 샤딩의 확장성과 성능을 모두 극대화할 수 있으며, 서버측 샤딩으로 수행하는 경우 샤드 쿼리 최적화기가 가장 효율적인 분산 플랜을 생성한다.
샤드 쿼리 최적화기 (Shard Query Optimizer)#
샤드 코디네이터의 샤드 쿼리 최적화기는 서버측 샤딩에 대한 최적의 분산 쿼리를 생성하고, 분산 쿼리에 대한 분산 플랜을 생성한다.
사용자 쿼리가 서버측 샤딩으로 수행되는 쿼리로 분류된 경우, 해당 쿼리를 서버측에서 수행하기 위해서 분산부와 통합부로 구분한다. 분산부는 각 샤드 노드에서 수행할 부분(분산) 쿼리이고, 통합부는 각 노드에서 수행한 결과를 모아서 수행할 나머지(통합) 쿼리이다.
가능한 많은 부분을 분산부로 처리하는 것이 성능을 극대화할 수 있기 때문에 샤드 쿼리 최적화기는 최대한 샤드 쿼리 변환(Shard Transformation)을 수행한다.
샤드 쿼리 실행기 (Shard Query Executor)#
Altibase Sharding의 샤드 쿼리 실행기는 클라이언트측 샤딩의 실행기와 서버측 샤딩의 실행기로 구분한다. 클라이언트측 샤딩의 실행기는 샤드 라이브러리에서 동작하며, 서버측 샤딩의 실행기는 샤드 노드에서 샤드 코디네이터를 통해서 동작한다.
OLTP 쿼리#
클라이언트측 샤딩의 실행기는 응응프로그램의 클라이언트 라이브러리에서 동작한다. 사용자의 쿼리를 최초 prepare시 분석한 후 쿼리 execute 시에는 추가 분석없이 실행할 수 있으므로, 다음과 같은 OLTP (Online Transaction Processing) 업무 특성에 적합하다.
-
대용량 데이터베이스를 대상으로 하는 업무
-
매우 짧은 시간에 읽거나 조작하는 업무를 하나의 트랜잭션 단위로 수행하는 업무
-
읽거나 조작하는 데이터가 매우 적은 업무
-
매우 많은 사용자가 동시에 수행하는 업무
-
매우 짧은 시간에 높은 처리량이 요구되는 업무
OLAP 쿼리#
서버측 샤딩의 실행기는 현재 접속 중인 노드에서 동작하고, 샤드 쿼리 분석기가 변환한 분산 쿼리와 통합 쿼리를 수행한다. 서버측 샤딩의 실행기는 분산 쿼리를 각 샤드 노드에서 동시에 병렬 수행하고 통합 쿼리를 수행하므로, 샤드 노드의 수에 비례하여 성능과 처리량을 늘어난다. 따라서 다음과 같은 OLAP (Online Analytical Processing) 업무 특성에 적합하다.
- 동일한 데이터에 여러 기준을 적용하여 다차원 데이터 분석을 하는 업무
샤드 트랜잭션#
샤드 트랜잭션이란 클라이언트측 샤딩으로 생성된 트랜잭션과 서버측 샤딩으로 생성된 트랜잭션을 통합함으로써, 트랜잭션내의 쿼리를 클라이언트측인지 서버측 샤딩인지 구분하지 않고 수행하는 기능이다.
Altibase Sharding의 하이브리드 샤딩은 OLTP성 쿼리와 OLAP성 쿼리를 하나의 트랜잭션으로 지원하므로, 각 쿼리를 최적의 수행 경로로 수행한다.

[그림 1‑12] Shard Query Analyzer & Optimizer & Executor
위 그림은 하이브리드 샤딩으로 사용자의 쿼리가 수행되는 예를 보여준다. Q3-1와 Q3-2는 샤드 쿼리 분석기가 Q3에서 생성한 분산 쿼리와 통합 쿼리이다.
Q1) INSERT INTO t1(key, c1) VALUES (1, 100);
Q2) UPDATE t1 SET c1=c1+1 WHERE key=2;
Q3) SELECT SUM(c) total_count FROM (SELECT COUNT(*) c FROM t1);
Q3-1) SELECT COUNT(*) c FROM t1;
Q3-2) SELECT SUM(c) total_count FROM temp;
다양한 샤드 쿼리와 함수 지원#
Altibase Sharding은 아래의 쿼리를 지원한다.
- INSERT
- INSERT SELECT
- UPDATE
- DELETE
- SELECT
- Join
- Outer Join
- Aggregate function
- Grouping
- Ordering
- Subquery
쿼리가 샤드 쿼리인지 논샤드 쿼리인지 여부는 샤드 플랜을 조회하여 확인할 수 있다. 논샤드 쿼리로 플랜이 조회되는 경우 샤드(SHARD) 키워드를 이용하여 좀 더 효율적인 쿼리로 튜닝할 수 있다. 뿐만 아니라 다음과 같은 샤드 지원 함수들을 제공한다.
-
SHARD_NODE_NAME
-
SHARD_KEY
다양한 분산 객체#
일반적인 샤딩은 샤드 테이블에 한해 물리적 데이터 분산만 적용하지만, Altibase Sharding은 샤드 프로시저를 분산하여 수행할 수 있다.
샤드 프로시저의 경우 인자를 샤드 키로 적용하여 논리적인 분산을 수행하는 방식으로 샤딩을 수행한다.
다양한 분산 방식#
Altibase Sharding은 아래와 같이 다양하게 데이터 분산 방식을 제공한다.
샤드 키는 테이블 종류(파티셔닝 테이블, 메모리 테이블, 디스크 테이블 등)와 상관없이 설정할 수 있으며 최대 두 개까지 샤드 키를 갖는 복합 키를 지원한다.
샤드 키 분산 방식은 아래와 같다.
-
해시(hash) 분산 방식
-
범위(range) 분산 방식
-
리스트(list) 분산 방식
-
복합(composite) 샤드 키 분산 방식
-
복제(clone) 분산 방식
-
독립(solo) 분산 방식

[그림 1‑13] Altibase Sharding 분산 방식
해시(Hash) 분산 방식#
Altibase Sharding의 해시 분산은 샤드 키에 해당하는 값을 내장된 hash함수를 이용하여 분산하는 것을 말한다.
Altibase는 대부분의 데이터 타입에 최적화된 해시 함수를 제공한다. 해시 함수는 데이터를 균등하게 분산하는데 이용된다. Altibase Sharding은 해시 함수로부터 구한 해시 값에 나머지 연산을 수행한 값을 이용하여, 전체 데이터를 1000개의 그룹으로 나누어 관리한다. 각 그룹마다 샤드 노드를 지정하여 데이터를 임의로 분산시킬 수 있다.
-
hash_group[1] = { record(x) | if (mod(hash(shard key value of x),1000)==0) };
-
hash_group[2] = { record(x) | if (mod(hash(shard key value of x),1000)==1) };
-
…
-
hash_group[1000] = { record(x) | if (mod(hash(shard key value of x),1000)==999) };
이렇게 구분된 1000개의 hash group을 사용자의 필요에 따라 분산 정의한다. 예를 들면 user_ id를 기준으로 해시 분산 방식으로 설정하는 경우, user_id의 해시 값을 1000개의 그룹으로 나누어 다음과 같이 설정한다.
-
1~300번 hash group – 샤드 노드1
-
301~600번 hash group – 샤드 노드2
-
601~1000번 hash group – 샤드 노드 3
데이터를 분산하기 전 다음과 같은 해시 분산 방식으로 데이터를 분산했을 때 데이터의 분포 상태를 예측할 수 있다.
SELECT hash, COUNT(*) FROM (SELECT mod(hash(user_id),1000)+1 hash FROM table) GROUP BY hash;
범위(Range) 분산 방식#
해시 분산 방식을 사용하면 데이터가 비교적 균등하게 분산되는 반면, 특정 데이터가 어느 노드에 위치하는지 알기 어려워진다.
범위 분산 방식은 샤드 키 값으로 해당 데이터가 어느 노드에 위치하는지 관리자가 쉽게 알 수 있어 유리하다. 또한 해시 분산 방식에 비해 비교적 샤드 노드 확장이 쉬운 장점이 있다. 다만, 데이터가 샤드 노드들에 고르게 분산될 수 있도록 범위를 지정하는 것이 좋다.
예를 들면 샤드키 user_ id 로 범위 분산 방식을 적용하는 경우 다음과 같이 설정한다.
-
{ record(x) | (shard key value of x) \<= ‘9’ } -> 샤드 노드 1
-
{ record(x) | ‘9’ < (shard key value of x) \<= ‘M’ } -> 샤드 노드 2
-
{ record(x) | ‘M’ < (shard key value of x) \<= ‘Z’ } -> 샤드 노드 3
범위 분산 방식 역시 데이터를 분산하기 전에 쿼리로 데이터의 분포를 예측할 수 있다.
SELECT hash, COUNT(*) FROM (SELECT mod(hash(user_id),1000)+1 hash FROM table) GROUP BY hash;
그러나 범위 분산 방식으로 데이터를 고르게 분산했더라도, 운영 중에 데이터가 변경됨으로써 불균형이 발생할 수 있기 때문에 지속적으로 데이터 분포의 모니터링이 필요하다.
리스트(List) 분산 방식#
리스트 분산은 샤드 키 값을 특정값과 일치하는지 확인하여 분산하는 방식이다. 범위 분산 방식보다 더 직관적이고 특정 샤드 키 값에 대하여 쿼리를 수행하는 경우에도 유리하다.
예를 들면 지역을 샤드 키로 설정하고 리스트 분산 방식으로 설정하면 다음과 같다.
-
{ record(x) | (shard key value of x) = ‘서울’ } -> 샤드 노드1
-
{ record(x) | (shard key value of x) = ‘부산’ } -> 샤드 노드 2
-
{ record(x) | (shard key value of x) = ‘대구’ } -> 샤드 노드 3
이 경우 데이터를 지역별로 분산하여, 지역별 통계 쿼리 작성에 유리하다. 리스트 분산 방식도 범위 분산 방식처럼 데이터가 샤드 노드들에 고르게 분산될 수 있도록 지정하는 것이 좋다.
복합(Composite) 샤드 키 분산 방식#
복합 샤드 키 분산 방식은 두 개의 샤드 키를 적용한 분산 방식으로 각 샤드 키는 해시, 범위, 리스트 분산 방식 중 선택하여 적용한다.
예를 들면 지역명을 샤드 키(리스트 분산)로 적용하고 고객번호를 서브 샤드 키(해시 분산)로 적용하면 다음과 같다.
-
{ record(x) | (shard key value of x) = ‘서울’ and hash(sub-shard key value of x) <= 500 } -> 샤드 노드1
-
{ record(x) | (shard key value of x) = ‘서울’ and hash(sub-shard key value of x) <= 1000 } -> 샤드 노드 2
-
{ record(x) | (shard key value of x) = ‘강원’ and hash(sub-shard key value of x) <= 1000 } -> 샤드 노드 3
복제(Clone) 분산 방식#
샤딩 환경에서는 데이터가 분산 저장되기 때문에 여러 샤드 노드에서 수행되는 질의를 처리하기 어렵다. 이런 문제를 보완하기 위해 Altibase Sharding은 데이터 전체를 사용자가 지정한 여러 샤드 노드에 복제 저장하는 복제 분산 방식을 제공한다.
복제 분산 방식은 객체의 데이터를 분산하는 것이 아니라, 객체 자체를 중복 저장하는 방식이다. 복제 분산 방식을 적용한 샤드 테이블은 join, subquery등 샤드 쿼리의 제약이 거의 없이 사용할 수 있다.
복제 분산 방식은 샤드 키를 지정할 필요가 없고 사용자가 원하는 샤드 노드를 선택적으로 지정한다.
복제 분산이 적용된 샤드 객체에 대한 접근은 샤드 노드들 중에서 임의 선택하여 수행한다. 예를 들어 복제 분산이 적용된 샤드 테이블을 조회하는 경우, 복제 테이블이 저장된 노드들 중에서 트랜잭션에서 가장 먼저 접근한 샤드 노드를 우선하여 선택한다. 먼저 접근한 샤드 노드가 없는 경우에는, 노드를 임의로 선택하여 데이터를 조회한다.
독립(Solo) 분산 방식#
독립 분산은 샤드 키를 적용한 데이터 단위의 분산이 아닌 샤드 객체 단위의 분산 방식이다. 사용자가 지정한 하나의 노드에만 객체를 저장한다는 면에서 복제 분산 방식과 차이가 있다.
-
TABLE_1 –> 샤드 노드 1
-
TABLE_2 –> 샤드 노드 2
-
TABLE_3 –> 샤드 노드 1
샤드 객체 전체를 하나의 샤드 노드에 위치시키기 때문에 샤드 키를 추가할 필요가 없고 샤드 객체 하나만을 대상으로 쿼리를 수행할 때 쿼리 제약이 없다.
쉬운 마이그레이션#
기존 데이터베이스를 샤드 데이터베이스로 마이그레이션하는 경우, shardLoader 유틸리티를 사용하여 쉽고 빠르게 마이그레이션할 수 있다. shardLoader는 샤드 데이터베이스 데이터 업로드 전용 유틸리티로 사용방법은 iLoader와 유사하다.
shardLoader는 클라이언트측 샤딩 기능을 이용한 데이터 업로드 유틸리티로 데이터 노드의 수가 많을수록 업로드 속도도 향상된다.
기존의 iLoader도 사용가능 하지만, iLoader는 서버측 샤딩으로 동작하므로 shardLoader를 사용하는 것 보다는 성능이 떨어진다.
다양한 분산 데이터 이동 방법 지원#
샤딩 시스템을 운영하다보면, 샤드 노드의 불균형 상태가 발생할 수 있다.
-
특정 샤드 노드의 분산 데이터 집중
-
특정 샤드 노드의 읽기/쓰기 집중
-
특정 샤드 노드의 장애로 인한 교체
-
샤드 노드 증설
관리자는 이 때 데이터 분산 방법의 변경을 고려해야 한다. Altibase Sharding은 데이터 분산 방법을 변경하고 데이터 이동을 위해서 다음의 두 가지 방법을 제공한다.
- 데이터 재구축 (Rebuild Data)
- 리샤딩 (Resharding)
데이터 재구축 (Rebuild Data)#
데이터 재구축은 샤딩 시스템의 구성을 전체적으로 점검하고 재구성 하는 방법으로 전체 샤딩 시스템의 데이터를 한번에 고려하여 재구축 할 수 있다.
이를 위해서 다음의 샤드 패키지를 제공하며, 샤드 데이터의 분산 방법을 변경 후 데이터 재구축 관련 패키지를 이용하여 데이터 점검과 이동을 할 수 있다.
- DBMS_SHARD.CHECK_DATA
- DBMS_SHARD.REBUILD_DATA
- DBMS_SHARD.REBUILD_DATA_NODE
이 샤드 패키지는 분산 정보와 데이터의 유효성을 확인하고 전체 샤딩 시스템을 고려하여 데이터를 재구축 하므로 서비스 운영중에 사용할 수 없다.
리샤딩 (Resharding)#
Altibase Sharding의 리샤딩이란 서비스 운영 중에 데이터 일부를 하나의 샤드 노드에서 다른 샤드 노드로 이동하는 것을 말한다.
리샤딩은 주로 노드 증설 혹은 특정 노드의 부하 집중에 따른 데이터 이동을 위하여 사용되며, 서비스 운영 중에 사용할 수 있는 장점을 가진다.