ClickHouse多级磁盘和冷热数据分离实践

特别注意

  • ck可以大小写区分也可以不区分
  • ck 配置文件中的各个卷的是有顺序的。
开启远程访问

 vim /etc/clickhouse-server/config.xml

<listen_host>0.0.0.0</listen_host>

前言

ClickHouse 的冷热数据分离和ES的类似,可以选择冷数据跑在哪个数据目录上。

总的来说 ClickHouse 冷热存储架构的整体设计思想是:本地 SSD 存储查询热数据,远端Nas存储查询相对不那么频繁的数据,从而节约存储成本,支持更多的数据存储需求。

操作命令

-- 查看存储策略
select * from system.storage_policies-- 查看磁盘select * from system.disks

官网文档

## ttl值
https://ClickHouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#mergetree-table-ttl

参考文档

###  多级磁盘
https://blog.csdn.net/weixin_37692493/article/details/114118400### 
https://blog.csdn.net/SmartCodeTech/article/details/127513358### 不错
https://blog.csdn.net/weixin_47388410/article/details/120885690

线上配置

    <storage_configuration><disks><disk0><path>/opt/data/clickhouse/</path><keep_free_space_bytes>1024000000</keep_free_space_bytes></disk0><fast_ssd><path>/opt/data/clickhouse_fast/</path><keep_free_space_bytes>1024000000</keep_free_space_bytes></fast_ssd></disks><policies><single><volumes><single><disk>disk0</disk></single></volumes></single><moving_from_ssd_to_hdd><volumes><hot><disk>fast_ssd</disk><max_data_part_size_bytes>1073741824</max_data_part_size_bytes></hot><cold><disk>disk0</disk></cold></volumes><move_factor>0.2</move_factor></moving_from_ssd_to_hdd></policies></storage_configuration>

示例:

<!-- 为了便于查找,我们建议在默认的存储路径下方添加存储策略 -->
<path>/data1/ClickHouse/data/</path> <storage_configuration><disks><hot><!-- 这里注意,使用存储策略后,建议任何数据路径之间不要有子集关系 --><path>/data1/ClickHouse/hot/</path>  </hot><cold><path>/data2/ClickHouse/cold/</path></cold></disks><policies><ttl><volumes><hot><disk>hot</disk></hot><cold><disk>cold</disk></cold></volumes></ttl></policies></storage_configuration>

语法格式

  • < path> 为ClickHouse默认的存储路径,找到该标签后在下方添加存储策略标签<storage_configuration>。
  • <storage_configuration>:固定标签,定义存储策略。
  • < dicks> 固定标签,下面会定义磁盘名称,以及磁盘绝对路径。
  • < hot>、< cold>:自定义标签,用来标记该路径,可按照此名称定义便于区分。
  • < policies>:固定标签,定义具体存储策略名称。
  • < ttl>:自定义标签,定义具体存储策略的名称,用于表级TTL,可按照此名称定义便于区分。
  • < volumes>:固定标签,定义卷组。
  • < hot>、< cold>:卷组名称,每个卷组下可以包括一个或多个disk标签,disk标签取值为< disks >标签下定义的磁盘名称。

检查

vm-01 :) select * from system.storage_policies;SELECT *
FROM system.storage_policies┌─policy_name────────────┬─volume_name─┬─volume_priority─┬─disks────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┐
│ default                │ default     │               1 │ ['default']  │ JBOD        │                  0 │           0 │
│ moving_from_ssd_to_hdd │ hot         │               1 │ ['fast_ssd'] │ JBOD        │         1073741824 │         0.2 │
│ moving_from_ssd_to_hdd │ cold        │               2 │ ['disk0']    │ JBOD        │                  0 │         0.2 │
│ single                 │ single      │               1 │ ['disk0']    │ JBOD        │                  0 │         0.1 │
└────────────────────────┴─────────────┴─────────────────┴──────────────┴─────────────┴────────────────────┴─────────────┘4 rows in set. Elapsed: 0.008 sec. vm-01 :)  select * from system.disks;SELECT *
FROM system.disks┌─name─────┬─path───────────────────────┬──free_space─┬─total_space─┬─keep_free_space─┬─type──┐
│ default  │ /var/lib/clickhouse/       │ 10822782976 │ 18238930944 │               0 │ local │
│ disk0    │ /opt/data/clickhouse/      │  9798782976 │ 17214930944 │      1024000000 │ local │
│ fast_ssd │ /opt/data/clickhouse_fast/ │  9798782976 │ 17214930944 │      1024000000 │ local │
└──────────┴────────────────────────────┴─────────────┴─────────────┴─────────────────┴───────┘3 rows in set. Elapsed: 0.002 sec. -- 切换库
vm-01 :) use default;--  检查
show create table t1;

创建表

-- 创建表> create table t1(`id` Int32,`name` String) engine=MergeTree() order by id settings storage_policy='moving_from_ssd_to_hdd';--  检查
SELECT name, data_paths, metadata_path, storage_policy from system.tables where name in ('t1','t2','t3')

模拟写入

-- 
insert into t1 values(1,'aa'),(2,'bb'),(3,'cc');-- check
tree /opt/data/clickhouse_fast/
tree /opt/data/clickhouse/

查看表数据和分区存储信息

--  查看表数据和分区存储信息,可以看到按照分区将数据写入到了不同的磁盘目录下
SELECT name, data_paths, metadata_path, storage_policy from system.tables where name ='t1'--  查看分区存储信息
select name, disk_name, path from system.parts where table = 't1';

多磁盘数据迁移

手动模拟分区合并

手动模拟分区合并,分区合并会自动将其他磁盘目录下数据进行合并,并存储在其中某一磁盘下

-- 
optimize table t1;-- 
select name, disk_name, path from system.parts where table = 't1' and active;
多磁盘分区迁移
##
ALTER TABLE t1 MOVE PART 'all_2_2_0' TO VOLUME 'cold'## 
vm-01 :) select name, disk_name, path from system.parts where table = 't1' and active;SELECT name,disk_name,path
FROM system.parts
WHERE (table = 't1') AND active┌─name──────┬─disk_name─┬─path─────────────────────────────────────────────────┐
│ all_1_1_0 │ fast_ssd  │ /opt/data/clickhouse_fast/data/default/t1/all_1_1_0/ │
│ all_2_2_0 │ fast_ssd  │ /opt/data/clickhouse_fast/data/default/t1/all_2_2_0/ │
└───────────┴───────────┴──────────────────────────────────────────────────────┘2 rows in set. Elapsed: 0.010 sec. vm-01 :) select * from system.storage_policies;SELECT *
FROM system.storage_policies┌─policy_name────────────┬─volume_name─┬─volume_priority─┬─disks────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┐
│ default                │ default     │               1 │ ['default']  │ JBOD        │                  0 │           0 │
│ moving_from_ssd_to_hdd │ hot         │               1 │ ['fast_ssd'] │ JBOD        │         1073741824 │         0.2 │
│ moving_from_ssd_to_hdd │ cold        │               2 │ ['disk0']    │ JBOD        │                  0 │         0.2 │
│ single                 │ single      │               1 │ ['disk0']    │ JBOD        │                  0 │         0.1 │
└────────────────────────┴─────────────┴─────────────────┴──────────────┴─────────────┴────────────────────┴─────────────┘4 rows in set. Elapsed: 0.006 sec. vm-01 :) ALTER TABLE t1 MOVE PART 'all_2_2_0' TO VOLUME 'cold'ALTER TABLE t1MOVE PART 'all_2_2_0' TO VOLUME 'cold'Ok.0 rows in set. Elapsed: 0.005 sec. vm-01 :) select name, disk_name, path from system.parts where table = 't1' and active;SELECT name,disk_name,path
FROM system.parts
WHERE (table = 't1') AND active┌─name──────┬─disk_name─┬─path─────────────────────────────────────────────────┐
│ all_1_1_0 │ fast_ssd  │ /opt/data/clickhouse_fast/data/default/t1/all_1_1_0/ │
│ all_2_2_0 │ disk0     │ /opt/data/clickhouse/data/default/t1/all_2_2_0/      │
└───────────┴───────────┴──────────────────────────────────────────────────────┘2 rows in set. Elapsed: 0.003 sec. 

策略下沉并应用

通过设置表的TTL值将表的历史的数据下沉到 moving_from_ssd_to_hdd 冷标签(历史元的存储盘)中。

新创建的表将冷数据迁移到 moving_from_ssd_to_hdd 标签磁盘中。
-- 创建新表并应用某个存储策略
create table t1(`id` Int32,`name` String) engine=MergeTree() order by id settings storage_policy='moving_from_ssd_to_hdd';-- 修改表的 TTL
ALTER TABLE example_table MODIFY TTL d + INTERVAL 1 DAY ;

修改原有的表应用某个存储策略
-- 查看storage_policies
SELECT policy_name,volume_name,volume_priority,disks,formatReadableSize(max_data_part_size) AS max_data_part_size,move_factor
FROM system.storage_policies-- 修改原有的表应用相应的存储策略
alter table  test02 modify setting storage_policy='moving_from_ssd_to_hdd';

冷热数据分离

上面说的磁盘多级磁盘的配置,修改表的存储策略,可以应用到不同的磁盘中。如果通过表的TTL值,自动去对历史数据分到网络存储盘。新数据到本地磁盘了?

基于move factor的数据移动策略
vm-01 :)  select * from system.storage_policies;SELECT *
FROM system.storage_policies┌─policy_name────────────┬─volume_name─┬─volume_priority─┬─disks────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┐
│ default                │ default     │               1 │ ['default']  │ JBOD        │                  0 │           0 │
│ moving_from_ssd_to_hdd │ hot         │               1 │ ['fast_ssd'] │ JBOD        │         1073741824 │         0.2 │
│ moving_from_ssd_to_hdd │ cold        │               2 │ ['disk0']    │ JBOD        │                  0 │         0.2 │
│ single                 │ single      │               1 │ ['disk0']    │ JBOD        │                  0 │         0.1 │
└────────────────────────┴─────────────┴─────────────────┴──────────────┴─────────────┴────────────────────┴─────────────┘4 rows in set. Elapsed: 0.004 sec. vm-01 :) select * from system.disks;SELECT *
FROM system.disks┌─name─────┬─path───────────────────────┬──free_space─┬─total_space─┬─keep_free_space─┬─type──┐
│ default  │ /var/lib/clickhouse/       │ 10813464576 │ 18238930944 │               0 │ local │
│ disk0    │ /opt/data/clickhouse/      │  9789464576 │ 17214930944 │      1024000000 │ local │
│ fast_ssd │ /opt/data/clickhouse_fast/ │  9789464576 │ 17214930944 │      1024000000 │ local │
└──────────┴────────────────────────────┴─────────────┴─────────────┴─────────────────┴───────┘3 rows in set. Elapsed: 0.005 sec. 

在上面的例子中,我们配置了一个存储策略:

  • 包含了2个卷(volume)。数据默认写入到default磁盘。
  • move factor 设置为0.2。当default磁盘空间小于20%时,将数据迁移到磁盘data2。
  • 默认卷max_data_part_size_bytes设置为xx G,大于xx G的part数据,不会写入到默认卷。

注意: 配置文件中的各个卷的顺序非常重要。当CK有新数据写入的时候,数据会优先写到第一个卷。再依次写道后面的卷。move_factor 也是从前面的卷移动到后面的卷。

## 以上参考文章如下
https://yunche.pro/blog/?id=64

基于TTL的数据移动策略
-- 创建时指定 TTL
CREATE TABLE ttl_test_tbl
(`f1` String,`f2` String,`f3` Int64,`f4` Float64,`date` Date
)
ENGINE = MergeTree()
PARTITION BY date
ORDER BY f1
TTL date + INTERVAL 90 DAY TO DISK 'disk0'
SETTINGS storage_policy = 'moving_from_ssd_to_hdd';-- 修改表的 TTL
ALTER TABLE example_tableMODIFY TTL d + INTERVAL 1 DAY ;
检查
vm-01 :) show tables;SHOW TABLES┌─name─────────┐
│ enum         │
│ student      │
│ tt           │
│ ttl_test_tbl │
└──────────────┘4 rows in set. Elapsed: 0.005 sec. vm-01 :) desc ttl_test_tbl;DESCRIBE TABLE ttl_test_tbl┌─name─┬─type────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ f1   │ String  │              │                    │         │                  │                │
│ f2   │ String  │              │                    │         │                  │                │
│ f3   │ Int64   │              │                    │         │                  │                │
│ f4   │ Float64 │              │                    │         │                  │                │
│ date │ Date    │              │                    │         │                  │                │
└──────┴─────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘5 rows in set. Elapsed: 0.002 sec. vm-01 :) show create table ttl_test_tbl;SHOW CREATE TABLE ttl_test_tbl┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE db_devops.ttl_test_tbl
(`f1` String,`f2` String,`f3` Int64,`f4` Float64,`date` Date
)
ENGINE = MergeTree()
PARTITION BY date
ORDER BY f1
TTL date + toIntervalDay(90) TO DISK 'disk0'
SETTINGS storage_policy = 'moving_from_ssd_to_hdd', index_granularity = 8192 │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘1 rows in set. Elapsed: 0.002 sec. 

参考文档:

## 腾讯云
https://cloud.tencent.com/document/product/1299/63662

修改已有的表的存储策略实践

vm-01 :) alter table  knight modify setting storage_policy='moving_from_ssd_to_hdd';ALTER TABLE knightMODIFY SETTING storage_policy = 'moving_from_ssd_to_hdd'Received exception from server (version 20.8.3):
Code: 36. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: New storage policy shall contain volumes of old one. 0 rows in set. Elapsed: 0.004 sec. 

报错需要修改如下:

报错的意思是 新的存储策略需要包含旧的磁盘卷。

            <moving_from_ssd_to_hdd><volumes><!-- 增加的部分 --><default><disk>default</disk></default></default><hot><disk>fast_ssd</disk><max_data_part_size_bytes>1073741824</max_data_part_size_bytes></hot><cold><disk>disk0</disk></cold></volumes><move_factor>0.2</move_factor></moving_from_ssd_to_hdd>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HOperatorSet.GenRandomRegions 有内存泄漏或缓存,释放不掉

开发环境 VS2022 win7 halcon12 halcon18 随机生成100个园 不释放 private void butTemp_Click(object sender, EventArgs e) { butTemp.Enabled false; HOperatorSet.SetSystem("clip_region", "false"); …

【Lychee图床】本地电脑搭建私人图床,公网远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

springboot配置统一返回结果类

目录结构&#xff1a; Result类&#xff1a; package com.xxxx.common.result;import lombok.Data;Data public class Result<T> {//状态码private Integer code;//信息private String message;//数据private T data;//构造私有化private Result() { }//设置数据,返回对…

报文信息转换器

HttpMessageConverter HttpMessageConverter:报文信息转换器&#xff0c;将请求报文转换为Java对象&#xff0c;或将Java对象转换为响应报文。它提供了两个注解和两个类型&#xff1a; RequestBody, ResponseBody, RequestEntity, ResponseEntity(响应用的较多) 准备 创建模块并…

行业追踪,2023-08-30

自动复盘 2023-08-30 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

WebStorm使用PlantUML

虽然 WebStorm 没有官方的 PlantUML 插件&#xff0c;但我们可以使用第三方插件 PlantUML Integration 来实现在 WebStorm 中使用 PlantUML。 以下是使用 PlantUML Integration 插件&#xff0c;在 WebStorm 中设计一个 Vue 模块的步骤&#xff1a; 安装 PlantUML Integratio…

从一到无穷大 #13 How does Lindorm TSDB solve the high cardinality problem?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言优势挑战系统架构细节/优化存储引擎索引写入查询 经验Ablation Study总结 引言 …

一文速学-让神经网络不再神秘,一天速学神经网络基础(七)-基于误差的反向传播

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

期货-股票交易规则

交易时间 港股&#xff1a;9:00~9:20 集合竞价&#xff0c;9:3012:00&#xff0c;13:0016:00 持续交易&#xff0c;16:00~16:10 随机收市竞价沪股&#xff1a;9:00~9:25 集合竞价&#xff0c;9:3011:30&#xff0c;13:0015:00 持续交易&#xff0c;11:30~12:00 交易申报深股&a…

基于边缘物联网关的智慧零售应用方案

推动经济健康发展增长&#xff0c;就要持续促进和扩大消费需求&#xff0c;提升消费体验。随着物联网技术的普及&#xff0c;面向日常消费的智慧零售应用迎来爆发式增长&#xff0c;不仅可以提升消费者消费体验&#xff0c;还可以提高商家营销和管理效率。本篇就为大家简单介绍…

Ubuntu入门04——目录与文件

目录 1.显示当前工作目录 2.更改目录 3.创建工作目录 4.删除工作目录 5.移动文件或者文件夹 6.文件夹and文件查看命令 7. 回到根目录&#xff0c;回到上一级 8.删除工作目录 9.查看目录和文件 10.以树状图列出目录内容 11.文件查找 12.在数据库中查找文件或目录 1…

抖音设计系统Semi Design:解构、原理与实现

摘要&#xff1a; 本文将深入探讨抖音设计系统Semi Design&#xff0c;阐述其定义、分析其原理&#xff0c;并通过详细代码展示其实现方法。本文旨在为设计师、开发人员和相关领域的研究者提供有关Semi Design的深入理解和实用指南。 引言 抖音&#xff0c;作为一款全球流行的…

uni-app:实现右侧弹窗

效果&#xff1a; 代码&#xff1a; <template><view class"container"><button click"showModal true">点击按钮</button><view class"modal-overlay" v-if"showModal" click"closeModal">…

Camx-Dump Raw Frames

1.dump eeprom data vendor/qcom/proprietary/camx/src/settings/common/camxsettings.xml 两种方式dump数据&#xff1a; 一. Push a configuration file to/vendor/etc/camera/camxoverridesettings.txt adb shell "echo dumpSensorEEPROMDataTRUE >> /vendor/e…

mobx和redux的区别?如何选择?

一、 mobx和redux的区别 Redux通常适用于大型应用程序&#xff0c;而MobX更适合小到中型应用程序&#xff0c;这是因为它们在设计理念和使用方式上有一些区别&#xff0c;这些区别在不同规模和复杂度的应用中产生了影响&#xff1a; Redux&#xff1a; 严格的架构&#xff1a…

linux并发服务器 —— 项目实战(九)

阻塞/非阻塞、同步/异步 数据就绪 - 根据系统IO操作的就绪状态 阻塞 - 调用IO方法的线程进入阻塞状态&#xff08;挂起&#xff09; 非阻塞 - 不会改变线程的状态&#xff0c;通过返回值判断 数据读写 - 根据应用程序和内核的交互方式 同步 - 数据的读写需要应用层去读写 …

ML+LLMs:利用LLMs大语言模型赋能或者结合ML机器学习算法进行具体应用的简介、具体案例之详细攻略

ML+LLMs:利用LLMs大语言模型赋能或者结合ML机器学习算法进行具体应用的简介、具体案例之详细攻略 目录 利用LLMs赋能或者结合ML算法进行具体应用的简介

poll epoll初学习

正是select这些缺点&#xff0c;才有了poll 1.I/O多路转接之poll 2.I/O多路转接之epoll 其中的struct epoll_event:

react-grapesjs——开源代码学习与修改(初出茅庐)

文章目录 ⭐前言⭐grapesjs初始化过程&#x1f496; 渲染大体流程&#x1f496; Editor对象 创建&#x1f496; EditorModel 对象创建&#x1f496; load modules 加载定义的目录模块Module&#x1f496; StyleManager渲染过程 ⭐修改grapesjs配置项⭐总结⭐ 如何修改开源代码⭐…

外贸爬虫系统

全球智能搜索 全球智能搜索 支持全球所有国家搜索引擎&#xff0c;及社交平台&#xff0c;精准定位优质的外贸客户&#xff0c;免翻墙 全球任意国家地区实时采集 搜索引擎全网邮箱电话采集 社交平台一键查看采集&#xff08;Facebook,Twitter,Linkedin等&#xff09; 职位…