본문 바로가기

Database

[Cockroach] Architecture - SQL Layer

참조 : www.cockroachlabs.com/docs/v20.2/architecture/sql-layer.html#interactions-with-other-layers

 

SQL Layer | CockroachDB Docs

 

www.cockroachlabs.com

 


 

Overview

각 노드가 대칭적으로 동작하므로 어느 노드로 접속을 해도 상관없음

접속한 노드 = Gateway Node

유저에게서 받은 요청을 SQL Statement 형태로 주어지므로 이를 KV operation을 위한 Plan으로 변경을 하여 transaction layer로 전송

 

 

Components

Component Desc
Relational
structure
rows & columns -> Table 구성 -> Database 구성
전통적인 관계형 특징의 구조를 제공
- Constraints 등 -> Consistency 유지 위해 Application 단의 추가 로직 불필요
SQL API ANSI SQL Standard 의 많은 부분을 구현하여 Relational structure 를 나타냄
www.cockroachlabs.com/docs/v20.2/sql-feature-support 참조
ACID-semantic transaction 사용 가능
PostgreSQL
write protocol
대부분의 PostgreSQL호환 드라이브를 지원
- GORM (Go), Hibernate (Java)와 같은 많은 PostgreSQL ORM 등
SQL parser, 
planner, 
executor
Parsing
주어진 쿼리는 구문 분석 되고 문자열 버전을 AST(abstract syntax tree)로 변환

Logical Planning
AST는 다음 3단계를 거쳐서 query paln으로 변경됨
1. High-level logical query plan으로 변경
   -> Semantic analysis 수행 (쿼리의 valid여부, resolving name, 불필요한 중간 계산 제거 등 수행)
2. Logical plan은 항상 유효한 변환 최적화를 통해 단순화됨
3. Logical plan은 실행가능한 다양한 방법을 평가하고 최소 비용으로 실행계획을 선택하는 검색엔진을
   사용하여 최적화
이 단계들의 결과로 최적화된 Logical Plan이 생성됨 -> EXPLAIN으로 조회 가능

Physical Planning
해당 쿼리를 어느 Node에서 처리해야 하는지를 결정 (/w Range locality information)
이 단계의 결과로 Physical Plan이 생성 -> EXPLAIN(DISTSQL) 로 조회 가능

Query Execution
Physical Plan은 수행을 위해서 Node(or Nodes)에게 전달됨
-> 각 노드에선 처리를 위해서 "logical process"가 spawn됨 (Logical flow에 의해 Node내 혹은 Noder간 통신을 수행) 
-> 각 결과를 합쳐서 Gateway Node로 보내서 Client에게 전달함
* Logical process들은 쿼리에 의해 조작된 Scalar 값을 encoding하여 사용(Binary 형태로) 하므로
  디스크에서 읽은 데이터는 다시 decoding을 해서 Client에 전달해야 함

Vectorized query execution
vectorized query가 enable되면 Physical Plan은 vectorized execution engine에 전달 됨
Engine은 row 단위데이터를 columar format으로 변환되어 메모리에 저장됨 -> 엔진에서 신속하게 처리
Engine에서 처리를 다 하고나면 다시 row단위로 변환 후 SQL interface로 반환
Encoding SQL Layer를 제외한 하위 Layer에서는 bytes단위로 처리됨 -> 이에 대한 Encoding 필요
indexed column의 경우 byte encoding이 나타내는 데이터와 동일한 order를 유지하는 것이 중요하며 이를 위해서 sorted key-value map을 이용함
단, Primary key가 아닌 경우는 공간은 덜 사용하지만 ordering을 유지하지 않는 value encoding을 사용
Dist SQL Cockroach DB 는 분산DB이므로 일부 쿼리에 대해 분산SQL 최적화 도구를 활용해서 여러 Range를 포함하는 쿼리 속도를 크게 높일 수있음
Non-distributed query에서는 coordinate node에서 쿼리에 match되는모든 데이터를 일단 받은 후에 Data set에 대한 계산을 수행함
하지만 Distributed query는 각 Node에서 필요한 계산을 수행한 후에 그 결과를 coordinate node로 보내고 그 결과를 취합하여 result를 생성함 -> coordinate node로 전송되는 데이터양을 크게 줄임
각 Node에서 나뉘어서 처리가 되므로 개별 Node의 storage보다 큰 row dataset을 처리할 수 있음

분산된 방식으로 처리하기 위해서 몇가지 개념을 소개함
- Logical Plan : 위에서 설명한 AST/Plan nod tree와 유사하게 추상(non-distributed) data flow를 나타냄
- Physical Plan : 개념적으로 Logical Plan을 physical node에 Mapping하는 것을 말함
  -> Cluster topology에 따라서 replicate되고 specialized 됨
  Cluster에서 schedule되고 수행 됨