[클릭 하우스] 클릭 하우스 TTL 데이터 생존 시간

여기에 사진 설명 삽입

1. 개요

재판 : 클릭 하우스 TTL

2. 환경

운영 환경 :

centos 7.6
Clickhouse> select version();
 
SELECT version()
 
┌─version()─┐
│ 20.4.4.18 │
└───────────┘

TTL은 Time To Live를 의미합니다 数据的存活时间. 에서 MergeTree中,可以为某个列字段或者整张表设置TTL. 当时间达到时,若列字段级别的TTL 则会删除这一列的数据;若表级别的TTL则会删除整张表的数据;若同时设置了列级别的和表级别的TTL则以先到期的为准.

열 수준 또는 테이블 수준 TTL에 관계없이이 시간 필드에 대한 INTERVAL 연산을 통해 TTL의 만료 시간을 표현하려면 Datetime 또는 날짜 유형 필드를 사용해야합니다.

예:

TTL time_column + interval 3 DAY

데이터 생존 시간이 time_column3 일 후임을 나타냅니다 .

INTERVAL에서 지원하는 작업 :second,minute,hour,day,week,month,quarter,year。

3. 적용 가능한 시나리오

데이터웨어 하우스 구축은 데이터의 수명주기를 고려해야하며 데이터의 수명주기에는 데이터의 초기 쓰기, 저장, 처리, 쿼리, 보관 및 파괴가 포함됩니다.
실제로 데이터웨어 하우스의 데이터 양이 두 배로 증가하여 막대한 저장 용량을 생성 할뿐만 아니라 관리 문제도 발생합니다. 저장 방법 변경 및 저장소 마이그레이션에는 프로젝트
비용과 위험 을 고려해야합니다 . 클릭 하우스와 같은 디자인은 효과적인 데이터 저장주기 및 파괴 문제를 효과적으로 처리 할 수 ​​있습니다. ck의 출현은 데이터 스토리지웨어 하우스의 비즈니스 선택에 또 다른 선택을 추가합니다.

요약하자면:

  1. 만료 된 데이터를 주기적으로 삭제
  2. 보관을 위해 만료 된 데이터를 주기적으로 이동

적당한:

1.2.3.分区表
4.物化视图的列

4. 컬럼 레벨의 TTL

컬럼 레벨 TTL을 설정하려면 테이블 필드를 정의 할 때 TTL 표현식을 선언해야합니다. 기본 키 필드는 TTL로 선언 할 수 없습니다.

Clickhouse> create table t_column_ttl(id UInt64 comment 'Primary key'
,create_time Datetime
,product_desc String  TTL create_time + interval 10 second
,product_type UInt8 TTL create_time + interval 10 second) 
engine=MergeTree partition by toYYYYMM(create_time) order by id;
 
 
CREATE TABLE t_column_ttl
(
    `id` UInt64 COMMENT 'Primary key', 
    `create_time` Datetime, 
    `product_desc` String TTL create_time + toIntervalSecond(10), 
    `product_type` UInt8 TTL create_time + toIntervalSecond(10)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY id
 
Ok.
 
0 rows in set. Elapsed: 0.059 sec. 
 
Clickhouse> insert into table t_column_ttl values(1,now(),'Huawei',1),(2,now()+interval 1 minute,'Apple',2);
 
INSERT INTO t_column_ttl VALUES
 
Ok.
 
2 rows in set. Elapsed: 0.018 sec. 
 
Clickhouse> select * from t_column_ttl;
 
SELECT *
FROM t_column_ttl
 
┌─id─┬─────────create_time─┬─product_desc─┬─product_type─┐
│  12020-06-15 12:10:20 │ Huawei       │            1 │
│  22020-06-15 12:11:20 │ Apple        │            2 │
└────┴─────────────────────┴──────────────┴──────────────┘
 
2 rows in set. Elapsed: 0.003 sec. 
 
Clickhouse> select sleep(10);
 
SELECT sleep(10)
 
↙ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) Received exception from server (version 20.4.4):
Code: 160. DB::Exception: Received from localhost:9000. DB::Exception: The maximum sleep time is 3 seconds. Requested: 10. 
 
0 rows in set. Elapsed: 0.111 sec. 
 
Clickhouse> select sleep(3);
 
SELECT sleep(3)
 
┌─sleep(3)─┐
│        0 │
└──────────┘
 
1 rows in set. Elapsed: 3.003 sec. 
 
Clickhouse> select * from t_column_ttl;
 
SELECT *
FROM t_column_ttl
 
┌─id─┬─────────create_time─┬─product_desc─┬─product_type─┐
│  12020-06-15 12:10:20 │ Huawei       │            1 │
│  22020-06-15 12:11:20 │ Apple        │            2 │
└────┴─────────────────────┴──────────────┴──────────────┘
 
2 rows in set. Elapsed: 0.002 sec. 
 
Clickhouse> optimize table t_column_ttl final;
 
OPTIMIZE TABLE t_column_ttl FINAL
 
Ok.
 
0 rows in set. Elapsed: 0.004 sec. 
 
Clickhouse> select * from t_column_ttl;
 
SELECT *
FROM t_column_ttl
 
┌─id─┬─────────create_time─┬─product_desc─┬─product_type─┐
│  12020-06-15 12:10:20 │              │            0 │
│  22020-06-15 12:11:20 │              │            0 │
└────┴─────────────────────┴──────────────┴──────────────┘
 
2 rows in set. Elapsed: 0.003 sec. 

Execute를 optimize命令会强制触发TTL清理다시 쿼리하면 TTL 조건이 충족 된 후 TTL 작업을 정의하는 필드 열이 데이터 유형의 기본값으로 복원되는 것을 확인할 수 있습니다.

열 필드의 TTL을 수정하거나 기존 필드의 TTL을 수정합니다.

Clickhouse> alter table t_column_ttl MODIFY COLUMN product_desc String  TTL create_time + INTERVAL  2 DAY;

필드의 TTL을 추가합니다.

Clickhouse> alter table t_column_ttl add column product_name String comment '产品名称' ttl create_time + interval 3 month;
 

– TTL 정보보기 :

Clickhouse> desc t_column_ttl;
 
DESCRIBE TABLE t_column_ttl
 
┌─name─────────┬─type─────┬─default_type─┬─default_expression─┬─comment─────┬─codec_expression─┬─ttl_expression─────────────────────┐
│ id           │ UInt64   │              │                    │ Primary key │                  │                                    │
│ create_time  │ DateTime │              │                    │             │                  │                                    │
│ product_desc │ String   │              │                    │             │                  │ create_time + toIntervalDay(2)     │
│ product_type │ UInt8    │              │                    │             │                  │ create_time + toIntervalSecond(10) │
│ product_name │ String   │              │                    │ 产品名称    │                  │ create_time + toIntervalMonth(3)   │
└──────────────┴──────────┴──────────────┴────────────────────┴─────────────┴──────────────────┴────────────────────────────────────┘
 
5 rows in set. Elapsed: 0.003 sec. 

6. 테이블 레벨 TTL

MergeTree의 테이블 매개 변수에 TTL 표현식을 추가하여 전체 테이블에 대한 TTL을 설정할 수 있습니다.

– 설정하기 전에 구성된 디스크 및 볼륨을 찾아야합니다.

Clickhouse> select * from system.disks
:-] ;
 
SELECT *
FROM system.disks
 
┌─name─────────┬─path──────────────────────┬──free_space─┬─total_space─┬─keep_free_space─┐
│ default/var/lib/clickhouse/7788174336160956405761024 │
│ disk_archive │ /data/clickhouse_archive/213757952107248353280 │
│ disk_cold    │ /data/clickhouse_cold/213757952107248353280 │
│ disk_hot1    │ /opt/clickhouse_hot1/16288342016268304384000 │
│ disk_hot2    │ /opt/clickhouse_hot2/16288342016268304384000 │
└──────────────┴───────────────────────────┴─────────────┴─────────────┴─────────────────┘
 
5 rows in set. Elapsed: 0.004 sec. 
 
Clickhouse> select * from system.storage_policies;
 
SELECT *
FROM system.storage_policies
 
┌─policy_name──────┬─volume_name─┬─volume_priority─┬─disks─────────────────────┬─max_data_part_size─┬─move_factor─┐
│ JBOD_default     │ disk_group  │               1['disk_hot1','disk_hot2']00.1 │
│ defaultdefault1['default']00 │
│ default_hot_cold │ hot         │               1['disk_hot1','disk_hot2']10485760.2 │
│ default_hot_cold │ cold        │               2['disk_cold']107374182400.2 │
│ default_hot_cold │ archive     │               3['disk_archive']00.2 │
└──────────────────┴─────────────┴─────────────────┴───────────────────────────┴────────────────────┴─────────────┘
 
5 rows in set. Elapsed: 0.006 sec. 
 

테이블의 정의 :

create table t_table_ttl(id UInt64 comment '主键',create_time Datetime comment '创建时间',product_desc String  comment '产品描述' TTL create_time + interval 10 minute,product_type UInt8 ) 
engine=MergeTree partition by toYYYYMM(create_time) order by create_time
TTL create_time  + INTERVAL 1 MONTH ,
    create_time + INTERVAL 1 WEEK TO VOLUME 'default',
    create_time + INTERVAL 2 WEEK TO DISK 'default';
 

t_table_ttl의 전체 테이블이 TTL로 설정되어 있음을 알 수 있으며, TTL 정리가 트리거되면 만료 시간을 충족하는 데이터 행이 삭제됩니다.

테이블 수준 TTL 수정 :

Clickhouse> alter table t_table_ttl modify ttl create_time + interval 2 month;
 

정보보기 :

Clickhouse> select database,name,engine,data_paths,metadata_path,metadata_modification_time,partition_key,sorting_key from system.tables where name='t_table_ttl';
 
SELECT 
    database, 
    name, 
    engine, 
    data_paths, 
    metadata_path, 
    metadata_modification_time, 
    partition_key, 
    sorting_key
FROM system.tables
WHERE name = 't_table_ttl'
 
┌─database─┬─name────────┬─engine────┬─data_paths──────────────────────────────────────┬─metadata_path──────────────────────────────────────┬─metadata_modification_time─┬─partition_key─────────┬─sorting_key─┐
│ study    │ t_table_ttl │ MergeTree │ ['/var/lib/clickhouse/data/study/t_table_ttl/']/var/lib/clickhouse/metadata/study/t_table_ttl.sql2020-06-15 13:01:32 │ toYYYYMM(create_time) │ create_time │
└──────────┴─────────────┴───────────┴─────────────────────────────────────────────────┴────────────────────────────────────────────────────┴────────────────────────────┴───────────────────────┴─────────────┘
 
1 rows in set. Elapsed: 0.010 sec. 
 

테이블 구조보기 :

Clickhouse> desc t_table_ttl;
 
DESCRIBE TABLE t_table_ttl
 
┌─name─────────┬─type─────┬─default_type─┬─default_expression─┬─comment──┬─codec_expression─┬─ttl_expression─────────────────────┐
│ id           │ UInt64   │              │                    │ 主键     │                  │                                    │
│ create_time  │ DateTime │              │                    │ 创建时间 │                  │                                    │
│ product_desc │ String   │              │                    │ 产品描述 │                  │ create_time + toIntervalMinute(10) │
│ product_type │ UInt8    │              │                    │          │                  │                                    │
└──────────────┴──────────┴──────────────┴────────────────────┴──────────┴──────────────────┴────────────────────────────────────┘
 
4 rows in set. Elapsed: 0.002 sec. 

참고 :列级别或者表级别的TTL 目前暂不支持取消操作 .

7. TTL 작동 방식

MergeTree 테이블이 TTL로 설정되면 데이터를 쓸 때 데이터 파티션이 단위로 사용되며 각 파티션 디렉토리에 ttl.txt 파일이 생성됩니다.

데이터 투입:

Clickhouse> insert into t_table_ttl(id,create_time,product_desc,product_type)values(10,now(),'Huawei',1),(20,now()+ interval 10 minute,'Apple',2);
 
 
[root@hadoop101 ~]# ls -l /var/lib/clickhouse/data/study/t_table_ttl/202006_1_1_0/
total 60
-rw-r----- 1 clickhouse clickhouse 465 Jun 15 13:14 checksums.txt
-rw-r----- 1 clickhouse clickhouse 115 Jun 15 13:14 columns.txt
-rw-r----- 1 clickhouse clickhouse   1 Jun 15 13:14 count.txt
-rw-r----- 1 clickhouse clickhouse  34 Jun 15 13:14 create_time.bin
-rw-r----- 1 clickhouse clickhouse  48 Jun 15 13:14 create_time.mrk2
-rw-r----- 1 clickhouse clickhouse  39 Jun 15 13:14 id.bin
-rw-r----- 1 clickhouse clickhouse  48 Jun 15 13:14 id.mrk2
-rw-r----- 1 clickhouse clickhouse   8 Jun 15 13:14 minmax_create_time.idx
-rw-r----- 1 clickhouse clickhouse   4 Jun 15 13:14 partition.dat
-rw-r----- 1 clickhouse clickhouse   8 Jun 15 13:14 primary.idx
-rw-r----- 1 clickhouse clickhouse  39 Jun 15 13:14 product_desc.bin
-rw-r----- 1 clickhouse clickhouse  48 Jun 15 13:14 product_desc.mrk2
-rw-r----- 1 clickhouse clickhouse  28 Jun 15 13:14 product_type.bin
-rw-r----- 1 clickhouse clickhouse  48 Jun 15 13:14 product_type.mrk2
-rw-r----- 1 clickhouse clickhouse 137 Jun 15 13:14 ttl.txt
 
可以看到在分区目录下有ttl.txt 文件,文件的内容为:
# cat ttl.txt 
ttl format version: 1
{
   
   "columns":[{
   
   "name":"product_desc","min":1592198679,"max":1592199279}],"table":{
   
   "min":1597468479,"max":1597469079}}

MergeTree가 JSON 구성 문자열을 통해 TTL 관련 정보를 저장하는 것을 볼 수 있습니다.
열은 열 수준 TTL 정보를 저장하는 데 사용됩니다.

  1. 테이블은 테이블 수준 TTL 정보를 저장하는 데 사용됩니다.
  2. 최소값과 최대 값은 각각 현재 데이터 파티션에서 TTL로 지정된 날짜 필드의 최소값과 최대 값과 INTERVAL 표현식으로 계산 된 타임 스탬프를 저장합니다.
Clickhouse> select now();
 
SELECT now()
 
┌───────────────now()─┐
│ 2020-06-15 13:28:02 │
└─────────────────────┘
 
1 rows in set. Elapsed: 0.004 sec. 

나열 됨 :

Clickhouse> select toDateTime('1592198679') ttl_min,toDateTime('1592199279') ttl_max,ttl_min - min(create_time) expire_min,ttl_max - max(create_time) expire_max from t_table_ttl;
 
SELECT 
    toDateTime('1592198679') AS ttl_min, 
    toDateTime('1592199279') AS ttl_max, 
    ttl_min - min(create_time) AS expire_min, 
    ttl_max - max(create_time) AS expire_max
FROM t_table_ttl
 
┌─────────────ttl_min─┬─────────────ttl_max─┬─expire_min─┬─expire_max─┐
│ 2020-06-15 13:24:392020-06-15 13:34:39600600 │
└─────────────────────┴─────────────────────┴────────────┴────────────┘
 
1 rows in set. Elapsed: 0.026 sec. 
 

테이블 값 :

Clickhouse> select toDateTime('1597468479') ttl_min,toDateTime('1597469079') ttl_max,ttl_min - min(create_time) expire_min,ttl_max - max(create_time) expire_max from t_table_ttl;
 
SELECT 
    toDateTime('1597468479') AS ttl_min, 
    toDateTime('1597469079') AS ttl_max, 
    ttl_min - min(create_time) AS expire_min, 
    ttl_max - max(create_time) AS expire_max
FROM t_table_ttl
 
┌─────────────ttl_min─┬─────────────ttl_max─┬─expire_min─┬─expire_max─┐
│ 2020-08-15 13:14:392020-08-15 13:24:3952704005270400 │
└─────────────────────┴─────────────────────┴────────────┴────────────┘
 
1 rows in set. Elapsed: 0.006 sec. 
 

ttl.txt에 기록 된 극단 값 간격은 TTL 표현식의 예상과 일치하는 현재 데이터 파티션에서 create_time의 최대 값 및 최소값과 정확히 일치 함을 알 수 있습니다.

일반적인 처리 논리는 TTL의 정보 기록 방법을 통해 추론 할 수 있습니다.

  1. MergeTree는 파티션 디렉터리를 단위로 사용하고 ttl.txt를 통해 만료 시간을 기록하고이를 판단 기준으로 사용합니다.
  2. 데이터 배치가 기록 될 때마다 간격 표현식의 계산 결과를 기반으로이 파티션에 대해 ttl.txt 파일이 생성됩니다.
  3. MergeTree의 병합 파티션 만 TTL 만료 데이터의 논리를 트리거합니다.
  4. 파티션을 삭제할 때 우리는 탐욕 알고리즘을 사용하기로 선택했으며 알고리즘 규칙은 가능한 한 가장 빠른 만료 시간과 가장 빠른 시간을 가진 파티션을 찾는 것입니다.
  5. TTL 만료로 인해 파티션의 열이 삭제 된 경우 병합 후 생성 된 새 파티션 디렉터리에는이 열 필드의 데이터 파일 (.bin 및 .mrk)이 포함되지 않습니다.

注意

  1. TTL의 기본 병합 빈도는 MergeTree 매개 변수에 의해 제어되며 merge_with_ttl_timeout기본 기간은 86400 초 미만입니다.
    그것은 독점적으로 독점적 인 것을 유지합니다 TTL任务队列. MergeTree의 기존 병합 작업과 달리이 값을 너무 작게 설정하면 성능이 저하 될 수 있습니다.
    이 설정은 TTL 삭제가 한 파티션에서만 24 시간마다 또는 백그라운드 병합이 발생할 때 수행됨을 의미합니다. 따라서 최악의 경우 ClickHouse는 이제 최대 24 시간마다 TTL 삭제 식과 일치하는 파티션을 삭제합니다.
    이 동작은 이상적이지 않을 수 있으므로 TTL 삭제식이 삭제 작업을 더 빠르게 수행하도록하려면 테이블의 merge_with_ttl_timeout 설정을 수정할 수 있습니다.
alter table t_table_ttl  MODIFY SETTING merge_with_ttl_timeout = 3600;

1 시간으로 설정합니다.

  1. TTL 병합을 트리거하는 것 외에도 optimize 명령은 트리거를 병합하도록 강제 할 수 있습니다.
触发一个分区合并:
optimize table t;
触发所有分区合并:
optimize table t final;
  1. 현재 ttl 선언을 삭제할 수있는 방법은 없지만 TTL 병합 작업의 시작 및 중지를 전역 적으로 제어하는 ​​방법을 제공합니다.
system stop/start TTL MERGE

관련 매개 변수 :

다음은 매개 변수 및 현재 기본값 목록입니다.

background_move_pool_size:8
background_move_processing_pool_thread_sleep_seconds:10
background_move_processing_pool_thread_sleep_seconds_random_part:1.0
background_move_processing_pool_thread_sleep_seconds_if_nothing_to_do:0.1
background_move_processing_pool_task_sleep_seconds_when_no_work_min:10
background_move_processing_pool_task_sleep_seconds_when_no_work_max:600
background_move_processing_pool_task_sleep_seconds_when_no_work_multiplier:1.1
background_move_processing_pool_task_sleep_seconds_when_no_work_random_part:1.0

추천

출처blog.csdn.net/qq_21383435/article/details/113531930