본문 바로가기
연구노트

SingleStore DB Directory Layout

by 에이플랫폼 [Team SingleStore Korea] 2023. 10. 20.

[1] 개요

그동안 SingleStore 를 설치하는 여러 내용들이 있었습니다. 이제부터는 설치된 SingleStore 의 디렉토리 구조와 각종 설정 파일들의 역할을 알아보도록 하겠습니다. 이번 포스트에서 설명할 환경은 Windows10 WSL2 를 기준으로 패키지 관리 프로그램이 디폴트이 설치한 SingleStore 를 기준으로 설명합니다. tarball 로 사용자환경에 맞게 커스텀으로 설치한 환경은 지금 설명과 많이 다릅니다. 설치하는 방법은 아래 링크를 참조하시기 바랍니다.

https://a-platform.tistory.com/124

 

Windows 10 WSL2 에 SingleStore 설치

[1] 개요 SingleStore 는 현재 공식적으로 Intel 계열의 Linux Platform 만 지원하고 있습니다. 지난 포스트에서 Arm 계열의 M1 Mac 에 설치하는 방법을 설명할 때도 실제로는 Docker Desktop 에서 AMD64 아키텍처를

a-platform.tistory.com

 

[2] /etc/memsql/memsqlctl.hcl : Memsqlctl Config File

 

version = 1
nodeMetadataFile = "/var/lib/memsql/nodes.hcl" 
defaultInstallDir = "/var/lib/memsql"
user = "memsql"​

 

* nodeMetadataFile : Node Meta Data File 또는 memsqlctl state file 로 현재 Host 에 설치된 Node 들의 정보

* defaultInstallDir : Node 가 설치된 Default Directory

* user : SingleStore Software 및 각종 파일의 Owner

[3] /var/lib/memsql/ : 디폴트 노드 설치 디렉토리

 

/var/lib/memsql
├── 4dd26075-2e57-4fe9-bd60-e80f9c6762a9
├── 60854544-c2ee-4c0b-b572-61fc0bcef7fe
├── db_files
├── nodes.hcl
└── nodes.hcl.lock

 

* Hashed Node ID 2개가 Directory 로 존재합니다. 하나는 Master Aggregator, 다른 하나는 Leaf

* db_files : secure_file_priv 엔진 변수로 설정된 directory 로 File Read/Write 가 가능한 디렉토리

* nodes.hcl : 아래 참조

[4] /var/lib/memsql/nodes.hcl : 현재 Host 에 설치된 Node 들의 정보

 

version = 1
node {
  memsqlConfigPath = "/var/lib/memsql/4dd26075-2e57-4fe9-bd60-e80f9c6762a9/memsql.cnf"
  password {
    cipherText = "DhtEzDGl4ts+A1LxAeOPP7BtHaV/NeVzJ2KJAZvuzOA="
  }
}
node {
  memsqlConfigPath = "/var/lib/memsql/60854544-c2ee-4c0b-b572-61fc0bcef7fe/memsql.cnf"
  password {
    cipherText = "QnD1U1mCisIWmhoMPHVU+76n4TMdZUkh+IB4uWankzo="
  }
}
secure = "ahyjdqEKrfYeh2vuC8aYNTHIHCV47HWwpNKo3B5lmac="
 

* 현재 Aggregator, Leaf 등 2개의 Node 가 설치됨

* memsqlConfigPath : 각각의 Node 별로 engine variable 을 설정하는 memsql.cnf 파일의 위치

* password 및 ciperText : root 비밀번호 및 암호화된 텍스트


[5] /var/lib/memsql/<hashed node id>/memsql.cnf : SingleStore Server 구동에 필요한 Engine 변수 설정

 

[server]
auditlogsdir          = auditlogs
bind_address          = 127.0.0.1
datadir               = data
pid_file              = memsqld.pid
plancachedir          = plancache
port                  = 3307
tracelogsdir          = tracelogs
basedir               = .
core_file             = true
lc_messages_dir       = ./share
lock_wait_timeout     = 60
secure_file_priv      = /var/lib/memsql/db_files
snapshot_trigger_size = 2g
socket                = memsql.sock
tmpdir                = .

* 각종 directory : auditlogs, data, plancache, tracelogs, base

* port : 기본은 3306 이나 하나의 host 에서 port를 달리 설치하였으므로 3307, 3308 등으로 설정될 수 있음

* snapshot_trigger_size : 인메모리 로우스토어 사용시 DML 의 크기가 2G가 될 때 메모리 Snapshot 이 Disk로 Write 됨. 다음 Snapshot 이 Disk로 Write 될 때까지는 DML은 Transaction Log 파일에 먼저 Write 됨

* 수동으로 변경하는 것은 권장되지 않으며 대신 sdb-admin update-config 명령어 사용이 권장됨

[6] /var/lib/memsql/<hashed node id>/ : 노드별 데이터 및 설정파일 디렉토리

60854544-c2ee-4c0b-b572-61fc0bcef7fe
├── auditlogs
├── data
├── memsql.cnf
├── plancache
└── tracelogs
 

* auditlogs : audit logging 이 설정된 경우 해당 로그 저장 위치

* data : 컬럼스토어 파일, 스냅샷, 트랜잭션 로그 등등의 주요 데이터 파일 저장 위치

* plancache : SQL 컴파일후 작성된 Plan 이 저장되어 있는 Cache 위치

* tracelogs : SingleStore 서버의 활동 내역이 로깅되는 memsql.log 및 query.log, command.log 등 저장

[7] /var/lib/memsql/<hashed node id>/data : 주요 file 들의 저장 위치

data
├── blobs
├── logs
├── memsql.sock
├── memsql_id
├── memsql_proxy.sock
├── memsql_role
├── memsqld.pid
├── memsqld_safe.pid
├── snapshots
└── tempblobs

 

* blobs : ColumnStore Segment 파일 저장 위치

* logs : RowStore Transaction Log 파일 저장 위치

* snapshots : RowStore Snapshot 파일 저장 위치

* memsql_role : Aggregator / Leaf 역할 표시

* memsqld_safe.pid, memsqld_pid : SingleStore Server Daemon Process ID 저장

[8] User Database 생성 전 Data Directory 주요 파일 정보

 

neo@AP-L14:/var/lib/memsql/60854544-c2ee-4c0b-b572-61fc0bcef7fe/data$ ls -l blobs snapshots logs
blobs:
total 4
drwxr-xr-x 2 memsql memsql 4096 Sep 26 11:17 1

logs:
total 98304
-rw------- 1 memsql memsql 16777216 Sep 27 09:41 cluster_log_v1_0
-rw------- 1 memsql memsql 16777216 Sep 26 11:17 cluster_log_v1_4096
-rw------- 1 memsql memsql 16777216 Sep 27 09:41 information_schema_log_v1_0
-rw------- 1 memsql memsql 16777216 Sep 27 09:41 information_schema_log_v1_4096
-rw------- 1 memsql memsql 16777216 Sep 27 09:41 memsql_log_v1_0
-rw------- 1 memsql memsql 16777216 Sep 26 11:17 memsql_log_v1_4096

snapshots:
total 24
-rw------- 1 memsql memsql 4171 Sep 26 11:17 cluster_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 09:41 information_schema_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 26 11:17 memsql_snapshot_v1_0_0
 

[9] testdb Database 생성 후 Data Directory 주요 파일 정보

 

neo@AP-L14:/var/lib/memsql/60854544-c2ee-4c0b-b572-61fc0bcef7fe/data$ memsql -p -e "create database testdb"
Enter password:
neo@AP-L14:/var/lib/memsql/60854544-c2ee-4c0b-b572-61fc0bcef7fe/data$ ls -l blobs snapshots logs
blobs:
total 40
drwxr-xr-x 2 memsql memsql 4096 Sep 26 11:17 1
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2000
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2001
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2002
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2003
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2004
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2005
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2006
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2007
drwxr-xr-x 2 memsql memsql 4096 Sep 27 17:07 2008

logs:
total 4423700
-rw------- 1 memsql memsql  16777216 Sep 27 17:07 cluster_log_v1_0
-rw------- 1 memsql memsql  16777216 Sep 26 11:17 cluster_log_v1_4096
-rw------- 1 memsql memsql  16777216 Sep 27 17:06 information_schema_log_v1_0
-rw------- 1 memsql memsql  16777216 Sep 27 17:06 information_schema_log_v1_4096
-rw------- 1 memsql memsql  16777216 Sep 27 17:07 memsql_log_v1_0
-rw------- 1 memsql memsql  16777216 Sep 26 11:17 memsql_log_v1_4096
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_0_log_v1_0
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_0_log_v1_65536
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_1_log_v1_0
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_1_log_v1_65536
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_2_log_v1_0
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_2_log_v1_65536
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_3_log_v1_0
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_3_log_v1_65536
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_4_log_v1_0
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_4_log_v1_65536
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_5_log_v1_0
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_5_log_v1_65536
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_6_log_v1_0
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_6_log_v1_65536
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_7_log_v1_0
-rw------- 1 memsql memsql 268435456 Sep 27 17:07 testdb_7_log_v1_65536
-rw------- 1 memsql memsql  67108864 Sep 27 17:07 testdb_log_v1_0
-rw------- 1 memsql memsql  67108864 Sep 27 17:07 testdb_log_v1_16384

snapshots:
total 96
-rw------- 1 memsql memsql 4171 Sep 26 11:17 cluster_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:06 information_schema_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 26 11:17 memsql_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_0_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_1_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_2_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_3_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_4_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_5_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_6_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_7_snapshot_v1_0_0
-rw------- 1 memsql memsql 4171 Sep 27 17:07 testdb_snapshot_v1_0_0
 

* blobs 에서는 2000 ~ 2008 디렉토리가 생성되어 reference partition + partition 0~7 이 랜덤하게 매핑됨 이 후 테이블이 생성되고 DML 이 발생되면 Segment 파일이 생성/병합/삭제가 지속적으로 발생함

* logs 에서는 각각의 partition 별로 디폴트 256 MB 의 트랜잭션 로그 2개씩이 각각 생성

* snapshots 에서는 각각의 partition 별로 snapshot 파일이 기본 크기로 생성

* DML 발생에 따라 log_file_size_partitions(256MB) 크기의 파일이 계속 추가됨

* 트랜잭션 로그 파일 크기가 snapshot_trigger_size(2GB) 를 넘어가면 Snapshot 파일이 새로 생성됨

* log_file_size_partitions, snapshot_trigger_size 는 업무 요건에 따라 변경 가능

[10] 마무리

이번 포스트에서는 SingleStore 의 주요 데이터 파일 및 설정 파일의 용도 및 위치 등의 Layout 을 살펴 보았습니다. 대부분의 설정 파일들의 위치는 대부분 고정되어 있으며 해당 파일의 위치를 다른 설정 파일에서 항상 참조할 수 있게 기술하고 있으므로 도움이 될 것으로 기대합니다.

미리 설명을 드리자면 ColumnStore 파일을 저장하는 blobs 디렉토리 및 내부 파일은 다른 RDBMS 인 Oracle 이나 MySQL 과 같이 직관적으로 보이지는 않습니다. 컬럼별로 압축 저장이 되는 Segment 파일에 각 파티션별로 분산 저장되어 있으며 DML 이 지속적으로 발생하면 백그라운드 merger 쓰레드에 의해 병합/삭제/생성이 매우 활발하게 이뤄지기 때문입니다. 역으로 생각하면 DBA 나 개발자가 ColumnStore 파일에 대해 그다지 관심을 기울이지 않아도 된다는 얘기도 됩니다. 전체적인 Disk 의 크기, Disk 속도 정도에만 신경을 쓰면 나머지는 SingleStore 가 알아서 관리하고 사용하기 때문입니다.

앞으로 다른 포스트에서 좀 더 자세한 설명을 할 수 있으리라 보고 이번 포스트를 마무리합니다.