2017년 12월 6일 수요일

블록체인 개요 및 오픈소스 동향

블록체인(block chain)
블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가능하도록 고안되었다.
출처: 위키백과 블록체인

거래 모델의 패러다임 전환
기존 거래 Centralized Ledger
  • 중앙 집중형 구조
  • 개인과 제 3자기관 간의 거래
  • 중앙 서버가 거래 공증 및 관리

블록체인 기반 거래 Distributed Ledger
  • 분산형 구조
  • 거래내역이 모든 네트워크 참여자에게 공유 및 보관
  • 모든 거래 참여자가 거래내역을 확인하는 공증 및 관리

블록체인의 종류
Public BlockChain
  • Open Platform
  • Permissionless Ledger 무허가형 원장, 누구든지 허가 없이 블록체인의 데이터를 읽고 쓰고 검증 할수 있다.
  • 대표적으로 이더리움(Ethereum)
  • 비트코인 등의 가상화폐가 작동하는 방식으로, 누구나 해당 블록체인 네트워크에 접근 가능
  • 거래가 모든 노드들에게 공개되어 있어 보안이 필요한 다양한 거래에 활용할 수 없음
  • 관련규제 및 컴플라이언스 요소를 만족시키기 어려움
  • 블록생성(거래확정) 주기가 길어 빠른 속도가 필요한 거래에 활용하기 어려움

Private BlockChain
  • Permissioned Platform 허가형 원장, 읽기 쓰기 합의 과정에 참여할 수 있는 참여자가 미리 지정되어 있으며, 필요에 추가 제거될 수 있다.
  • 금융기관간 거래에 적합한 거래 방식 지원
  • 허가된 사용자들의 합의 과정을 통해 거래가 확정되므로 거래 확정의 주체가가 명확
  • 규제 및 컴플라이언스 요소들을 만족시킬 수 있도록 커스터마이징 가능
  • 거래의 성격에 따라 합의 알고리즘, 블록생성주기 등을 최적화 가능

오픈소스 블록체인 플렛폼 현황

HydraChain

  • https://github.com/HydraChain/hydrachain
  • Permissioned Platform을  지원하는 Ethereum 확장판
  • 사설 체인을 지향하며 주로 금융 산업을 대상
  • Ethereum 프로토콜과 가장 호환되는 소프트웨어
  • 커스트마이징 기능이 유명하며 오픈소스이고 상업적으로도 배포 가능하다.

OpenChain


  • https://www.openchain.org/
  • Stand Alone 오픈소스 Distributed ledger 기술
  • 유연한 방식으로 디지털 자산을 관리하는데 관심이 있는 회사에게 적합

2017년 12월 5일 화요일

CUBRID 주요기능

CUBRID의 특징
RDBMS 기본 기능 지원
  • 트랜잭션 완벽 보장: COMMIT/ROLLBACK/SAVEPOINT
  • 장애 발생 및 백업 복구 시 트랜잭션 일치성 보장
  • HA 환경에서 트랜잭션 일치성 보장
  • ANSI SQL 표준 및 확장된 SQL 지원: 계층형 쿼리, CTE (Common Table Expression)를 이용한 재귀적 쿼리 등
  • VIEW/TRIGGER/PRIMARY KEY/FOREIGN KEY/SERIAL 지원
고성능 보장
  • MVCC (Multiversion Concurrency Control) 지원
  • 멀티 쓰레드/멀티 서버 구조
  • 브로커 미들웨어에 의한 커넥션 풀링/로드 밸런싱/Proxy 기능 지원
  • 비용 기반 옵티마이저 지원(CBO)
  • 쿼리 플랜 캐쉬 지원
  • Disk I/O 최적화를 통한 성능 병목 구간 개선
  • 고성능 인덱스(Multi-Range/Covered/Reverse/Skip-Scan/Function based/Filtered Index) 지원

대용량 및 확장성 보장
  • 멀티 볼륨 및 볼륨 자동 추가 기능 지원
  • DB/테이블/컬럼/인덱스 무제한 생성 가능
  • 1:N 복제 구성을 통해 부하 분산 및 서비스 확장 가능
  • 테이블 파티셔닝(Partitioning)을 통한 데이터 분할 관리 기능
안정성 및 운영 편의성 제공
  • 온라인/오프라인 백업 및 복구 지원
  • 증분 백업 지원 및 병렬/압축 백업 지원
  • 장애 발생 시점 또는 특정 시점으로의 복구 지원
  • 권한 상속을 통한 사용자/그룹별 권한 관리 기능
  • HA 환경에서 장애 발생 시 자동절체(Auto-Failover) 지원
  • HA 환경에서 Sync/Async 동작 모드 지원
개발 편의성 제공
  • 다양한 SQL 문법/함수 지원을 통해 Oracle 및 MySQL 구문 호환성 향상
  • JDBC/PHP/ODBC/OLEDB/ADO.NET/Python/Ruby 등 다양한 인터페이스 지원
  • GUI 기반 통합 운영 도구 CUBRID Manager 제공
  • 스키마/데이터를 CUBRID로 마이그레이션하는 도구 CUBRID Migration Toolkit 제공

시스템 구성
데이터베이스 서버
  • 핵심 구성 요소 데이터 저장 및 관리 기능을 수행
  • 멀티스레드 기반 클라이언트/서버 방식으로 동작
  • 사용자가 입력한 질의를 처리
  • 데이베이스 내의 객체를 관리
  • 완벽한 트랜잭션을 지원
  • 백업과 복구기능을 지원

브로커
  • 서버와 외부 응용 프로그램 간의 통신을 중계하는 전용 미들웨어, 커넥션 풀링, 모니터링, 로그 추적 및 분석 기능을 제공

CUBRID 매니저로
  • 데이터베이스와 브로커를 원격에서 관리할 수 있는GUI 툴
  • SQL 질의를 수행할수 있는 편리한 기능 및 편집기 기능을 제공

데이터베이스 볼륨 구조

영구적 볼륨
  • 범용 볼륨(Generic Volume):볼륨타입 미지정시 기본
  • 데이터 볼륨(Data Volume): 데이터를 저장하는 공간
  • 임시 볼륨(Temp Volume): 질의 처리, 정렬, 최종결과 임시저장, 영구적 임시 볼륨
  • 인텍스 볼륨(Index Volume): 인덱스 정보를 유지하는 공간
  • 제어파일(Index Volume): 볼륨의 정보, 백업 정보 및 로그의 정보를 저장
  • 활성로그(Active Log): 최근 변경 사항을 포함하는 로그
  • 보관로그(Archive Log): 활성로그 공간이 모두 사용된 후에 지속적으로 생성되는 로그를 보관하기 위한 볼륨

일시적 볼륨(Temporary Volume)
  • 일시적 임시 볼륨(Temporary Temp Volume): 영구적 임시 볼륨을 지정된 공간외에 추가 공간이 필요한 경우 시스템이 일적으로 생성하는 임시 볼륨

백업 볼륨(Backup Volume)
데이터베이스에 대한 스냅샷, 백업 볼륨과 로그 볼륨을 기반으로 특정 시점까지 발생한 트랜잭션을 복구할 수 있다.

데이터베이스 서버의 기능

실행 모드
서버 프로세스를 제외한 CUBRID의 프로그램들은 종류에 따라 두 가지 실행 모드가 있다. 실행 모드는 클라이언트/서버 모드(client/server mode)와 독립 모드(standalone mode)로 나뉜다.
  • 클라이언트/서버 모드는 해당 프로그램이 클라이언트 프로세스로서 동작하여 서버 프로세스에 접속하는 방식이다.
  • 독립 모드는 해당 프로그램이 서버 프로세스의 기능을 포함하고 있어 직접 데이터베이스 파일에 접근하여 수행하는 방식이다.

HA 기능
장애가 발생해도 지속적인 서비스가 가능하게 하는 HA 기능을 제공. Shared-nothing 구조이며, CUBRID Heartbeat을 이용하여 시스템과 CUBRID의 상태를 실시간으로 감시하고 장애 발생시 Failover를 수행한다.

Java 저장 프로시저
Java 가상 머신에서 구동되는 Java 저장 프로시저를 제공한다.
  • Java 가상 머신 설치 및 환경 설정
  • Java 소스 파일 작성
  • 컴파일 및 Java 리소스 로딩
  • 로딩된 Java 클래스를 데이터베이스에서 호출할 수 있도록 등록
  • Java 저장 프로시저 호출

관계형 데이터 모델 확장
컬렉션
한 컬럼이 여러 개의 값을 가지도록 정의할 수 있다. 컬렉션 타입은 컬렉션 원소의 중복 허용 여부와 순서 유지 여부에 따라 구분.
  • SET: 각 원소의 중복을 허용하지 않는 집합으로서, 원소의 나열 순서와 무관하게 중복 없이 정렬되어 저장된다.
  • MULTISET: 각 원소의 중복을 허용하는 집합으로서, 원소의 나열 순서와 무관하다.
  • LIST: 각 원소의 중복을 허용하는 집합으로서, SET, MULTISET 과 달리 원소의 순서를 유지한다.

타입
설명
타입 정의
입력 데이터
저장 데이터
SET
중복을 허용하지 않는 합집합
col_name SET VARCHAR(20) 또는 col_name SET (VARCHAR(20))
{'c','c','c','b','b','a'}
{'a','b','c'}
MULTISET
중복을 허용하는 합집합
col_name MULTISET VARCHAR(20) 또는 col_name MULTISET (VARCHAR(20))
{'c','c','c','b','b','a'}
{'a','b','b','c','c','c'}
LIST 또는SEQUENCE
중복을 허용하고, 데이터 입력 순서대로 저장하는 합집합
col_name LIST VARCHAR(20) 또는 col_name LIST (VARCHAR(20))
{'c','c','c','b','b','a'}
{'c','c','c','b','b','a'}

상속
상속을 지원함으로써 재사용성을 제공한다. 공통의 컬럼을 가지는 상위 클래스를 생성하고, 상위 클래스를 상속받아 고유한 컬럼을 추가한 하위 클래스를 생성

CUBRID 환경변수
  • CUBRID: CUBRID 시스템이 설치된 위치를 지정
  • CUBRID_DATABASES: databases.txt 파일의 위치를 지정하는 환경 변수이다. CUBRID 시스템은 $CUBRID_DATABASES/databases.txt 파일에 데이터베이스 볼륨들의 절대 경로를 저장 관리
  • CUBRID_CHARSET: CUBRID 시스템이 데이터베이스의 로캘(언어+문자셋)로 사용할 언어를 지정하는 환경 변수
  • CUBRID_MSG_LANG: CUBRID 시스템이 명령어 사용법 메시지와 오류 메시지를 출력할 때 사용할 언어를 지정
  • CUBRID_TMP: Linux용 CUBRID에서 cub_master 프로세스와 cub_broker 프로세스의 유닉스 도메인 소켓 파일을 저장하는 위치를 지정하는 환경 변수로, 지정하지 않으면 cub_master 프로세스는 /tmp 디렉터리에, cub_broker 프로세스는 $CUBRID/var/CUBRID_SOCK 디렉터리에 유닉스 도메인 소켓 파일을 저장

Start Service
% . /home1/cub_user/.cubrid.sh
%  cubrid service start

DB 생성 및 DB Start
% cubrid createdb testdb
% cubrid server start testdb
CUBRID 서비스 시작시 같이 시작되게 하려면, cubrid.conf 파일의 server 파라미터에 testdb을 설정하면된다.
% vi cubrid.conf
[service]
service=server,broker,manager
server=testdb

질의도구
CSQL 인터프린터 도구
% csql demodb
%csql -u dba --sysadm demodb
csql [options] database_name@remote_host_name
csql -C demodb@192.168.1.3



식별자 이름의 최대 길이
단위는 바이트 길이이며, 사용하는 문자셋에 따라 문자 수와 바이트 길이는 다를 수 있음에 주의한다. (예를 들어, UTF-8 문자셋에서 한글 한 글자는 3바이트의 바이트 길이이다.)
식별자
최대 바이트 길이
Database
17
Table
254
Column
254
Index
254
Constraint
254
Java Stored Procedure
254
Trigger
254
View
254
Serial
254

데이터 타입
수치형 데이터 타입
타입
Bytes
최소값
최대값
정확/근사치
SHORT, SMALLINT
2
-32,768
32,767
정확한 수치
INTEGER, INT
4
-2,147,483,648
+2,147,483,647
정확한 수치
BIGINT
8
-9,223,372,036,854,775,808
+9,223,372,036,854,775,807
정확한 수치
NUMERIC, DECIMAL
16
정밀도 p : 1 스케일 s : 0
정밀도 p : 38 스케일 s : 38
정확한 수치
FLOAT, REAL
4
-3.402823466E+38 (ANSI/IEEE 754-1985 표준)
+3.402823466E+38 (ANSI/IEEE 754-1985 표준)
근사치 부동소수점: 7자리
DOUBLE, DOUBLE PRECISION
8
-1.7976931348623157E+308 (ANSI/IEEE 754-1985 표준)
+1.7976931348623157E+308 (ANSI/IEEE 754-1985 표준)
근사치 부동소수점: 15자리
MONETARY
12
-3.402823466E+38
+3.402823466E+38
근사치

BLOG/CLOB 데이터 타입
  • LOB 타입 컬럼에 대해서는 인덱스를 생성할 수 없다.
  • LOB 타입 컬럼에 대해서는 PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL 제약 조건을 정의할 수 없다. 또한, SHARED 속성을 정의할 수 없으며, DEFAULT 속성은 NULL 값에 대해서만 정의할 수 있다.
  • LOB 타입 컬럼/데이터는 컬렉션 타입의 원소가 될 수 없다.
  • LOB 타입 컬럼이 있는 레코드를 삭제하는 경우, LOB 컬럼 값(Locator) 및 외부 저장소 내 파일을 모두 삭제한다. 또한, 기본 키 테이블에서 LOB 타입 컬럼이 있는 레코드가 삭제됨에 따라 이를 참조하는 외래 키 테이블의 레코드가 함께 삭제되는 경우, LOB 컬럼 값(Locator) 및 외부 저장소 내 LOB 파일을 모두 삭제한다. 단, ALTER TABLE ... DROP 문을 사용하여 LOB 컬럼을 삭제하거나 DROP TABLE 문을 사용하여 해당 테이블을 삭제하는 경우, LOB 컬럼 값(Lob locator)만 삭제하고 LOB 컬럼이 참조하는 외부 저장소 내 LOB 파일은 삭제하지 않는다.

BLOB
바이너리 데이터를 DB 외부에 저장하기 위한 타입으로, BLOB 데이터의 최대 길이는 외부 저장소에서 생성 가능한 파일 크기이다. BLOB타입은 SQL 문에서 비트열 타입으로 입출력 값을 표현한다. 즉, BIT (n), BIT VARYING (n) 타입과 호환되며, 명시적 타입 변환만 허용된다. 데이터 길이가 서로 다른 경우에는 최대 길이가 작은 타입에 맞추어 절삭(truncate)된다. BLOB 타입 값을 바이너리 값으로 변환하는 경우, 변환된 데이터는 최대 1GB를 넘을 수 없다. 반대로 바이너리를 BLOB 타입으로 변환하는 경우, 변환된 데이터는 BLOB 저장소에서 제공하는 최대 파일 크기를 넘을 수 없다.

CLOB
문자열 데이터를 DB 외부에 저장하기 위한 타입으로, CLOB 데이터의 최대 길이는 외부 저장소에서 생성 가능한 파일 크기이다. CLOB 타입은 SQL 문에서 문자열 타입으로 입출력 값을 표현한다. 즉, CHAR (n), VARCHAR (n) 타입과 호환된다. 단, 명시적 타입 변환만 허용되며, 데이터 길이가 서로 다른 경우에는 최대 길이가 작은 타입에 맞추어 절삭(truncate)된다. CLOB 타입 값을 문자열 값으로 변환하는 경우, 변환된 데이터는 최대 1GB를 넘을 수 없다. 반대로 문자열을 CLOB 타입으로 변환하는 경우, 변환된 데이터는 CLOB 저장소에서 제공하는 최대 파일 크기를 넘을 수 없다.

BLOB/CLOB 저장 및 변경
  • BLOB / CLOB 타입 컬럼에는 각각 BLOB / CLOB 타입 값이 저장되며, 바이너리 또는 문자열 데이터를 입력하는 경우에는 각각 BIT_TO_BLOB(), CHAR_TO_CLOB() 함수를 사용하여 명시적으로 타입을 변환을 수행하여야 한다.
  • INSERT 문을 사용하여 LOB 컬럼에 값을 입력하면, 내부적으로는 외부 저장소에 파일을 생성하여 해당 데이터를 저장하고, 실제 컬럼 값으로 해당 파일의 경로(Locator) 정보를 저장한다.
  • DELETE 문을 사용하여 LOB 컬럼이 존재하는 레코드를 삭제하면, 해당 LOB 컬럼 값이 참조하는 파일을 함께 삭제한다.
  • UPDATE 문을 사용하여 LOB 컬럼 값을 변경하는 경우, 새로운 값이 NULL 인지에 따라 다음과 같이 동작하면서 컬럼 값을 변경한다.
    • LOB 타입 컬럼 값을 NULL 이 아닌 값으로 변경하는 경우: LOB 컬럼에 이미 외부 파일을 참조하는 locator 가 저장되어 있다면, 해당 파일을 삭제한다. 그리고 새로운 파일을 생성하여 NULL이 아닌 값을 저장한 후, LOB 컬럼 값에 새로운 파일에 대한 locator를 저장한다.
    • LOB 타입 컬럼 값을 NULL 로 변경하는 경우: LOB 컬럼에 이미 외부 파일을 참조하는 locator 가 저장되어 있다면, 해당 파일을 삭제한다. 그리고 LOB 컬럼 값에 NULL을 바로 저장한다.

-- inserting data after explicit type conversion into CLOB type column
INSERT INTO doc_t (doc_id, content) VALUES ('doc-1', CHAR_TO_CLOB('This is a Dog'));
INSERT INTO doc_t (doc_id, content) VALUES ('doc-2', CHAR_TO_CLOB('This is a Cat'));

-- inserting data after explicit type conversion into BLOB type column
INSERT INTO image_t VALUES ('image-0', 'doc-0', BIT_TO_BLOB(X'000001'));
INSERT INTO image_t VALUES ('image-1', 'doc-1', BIT_TO_BLOB(X'000010'));
INSERT INTO image_t VALUES ('image-2', 'doc-2', BIT_TO_BLOB(X'000100'));

-- inserting data from a sub-query result
INSERT INTO image_t SELECT 'image-1010', 'doc-1010', image FROM image_t WHERE image_id = 'image-0';

-- updating CLOB column value to NULL
UPDATE doc_t SET content = NULL WHERE doc_id = 'doc-1';

-- updating CLOB column value
UPDATE doc_t SET content = CHAR_TO_CLOB('This is a Dog') WHERE doc_id = 'doc-1';

-- updating BLOB column value
UPDATE image_t SET image = (SELECT image FROM image_t WHERE image_id = 'image-0') WHERE image_id = 'image-1';

-- deleting BLOB column value and its referencing files
DELETE FROM image_t WHERE image_id = 'image-1010';

BLOB/CLOB 읽기
LOB 타입 컬럼을 조회하면 컬럼이 참조하는 파일에 저장된 데이터를 출력한다. CAST() 연산자, CLOB_TO_CHAR() 함수, BLOB_TO_BIT() 함수를 사용하여 명시적 타입 변환을 수행할 수 있다.
  • CSQL에서 질의를 실행할 경우, 파일에 저장된 데이터가 아닌 컬럼 값(Locator)을 출력한다. BLOB / CLOB 컬럼이 참조하는 데이터를 출력하기 위해서는 CLOB_TO_CHAR() 함수를 사용하여 문자열로 변환해야 한다.
  • 문자열 처리 함수를 사용하기 위해서는 CLOB_TO_CHAR() 함수를 사용하여 문자열로 변환해야 한다.
  • GROUP BY 절, ORDER BY 절에 LOB 컬럼을 명시할 수 없다.
  • 비교 연산자, 관계 연산자, IN, NOT IN 연산자를 사용하여 LOB 컬럼을 비교할 수 없다. 단, IS NULL 조건식을 사용하여 LOB 컬럼 값(locator)이 NULL 인지 비교할 수 있다. 즉, 컬럼 값이 NULL이면 TRUE를 반환하는데, 컬럼 값이 NULL인 경우는 LOB 데이터를 저장하는 파일이 존재하지 않는다는 의미이다.
  • LOB 컬럼을 생성하고 데이터를 입력한 이후 LOB 데이터 파일을 삭제하면, LOB 컬럼 값(locator)이 유효하지 않은 파일을 참조하는 상태가 된다. 이처럼 LOB locator와 LOB 데이터 파일이 매칭되지 않는 컬럼에 대해 CLOB_TO_CHAR(), BLOB_TO_BIT(), CLOB_LENGTH(), BLOB_LENGTH() 함수를 사용하면 NULL을 출력한다.


-- displaying locator value when selecting CLOB and BLOB column in CSQL interpreter
SELECT doc_t.doc_id, content, image FROM doc_t, image_t WHERE doc_t.doc_id = image_t.doc_id;
-- using string functions after coercing its type by CLOB_TO_CHAR( )
SELECT CLOB_TO_CHAR(content), SUBSTRING(CLOB_TO_CHAR(content), 10) FROM doc_t;
SELECT CLOB_TO_CHAR(content) FROM doc_t WHERE CLOB_TO_CHAR(content) LIKE '%Dog%';
SELECT CLOB_TO_CHAR(content) FROM doc_t ORDER BY CLOB_TO_CHAR(content);
SELECT * FROM doc_t WHERE content LIKE 'This%';

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...