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


    特别注意

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

     vim /etc/clickhouse-server/config.xml

    0.0.0.0

    前言

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

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

    操作命令
    1. -- 查看存储策略
    2. select * from system.storage_policies
    3. -- 查看磁盘
    4. select * from system.disks
    官网文档
    1. ## ttl值
    2. https://ClickHouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#mergetree-table-ttl
    参考文档
    1. ### 多级磁盘
    2. https://blog.csdn.net/weixin_37692493/article/details/114118400
    3. ###
    4. https://blog.csdn.net/SmartCodeTech/article/details/127513358
    5. ### 不错
    6. https://blog.csdn.net/weixin_47388410/article/details/120885690

    线上配置

    1. <storage_configuration>
    2. <disks>
    3. <disk0>
    4. <path>/opt/data/clickhouse/path>
    5. <keep_free_space_bytes>1024000000keep_free_space_bytes>
    6. disk0>
    7. <fast_ssd>
    8. <path>/opt/data/clickhouse_fast/path>
    9. <keep_free_space_bytes>1024000000keep_free_space_bytes>
    10. fast_ssd>
    11. disks>
    12. <policies>
    13. <single>
    14. <volumes>
    15. <single>
    16. <disk>disk0disk>
    17. single>
    18. volumes>
    19. single>
    20. <moving_from_ssd_to_hdd>
    21. <volumes>
    22. <hot>
    23. <disk>fast_ssddisk>
    24. <max_data_part_size_bytes>1073741824max_data_part_size_bytes>
    25. hot>
    26. <cold>
    27. <disk>disk0disk>
    28. cold>
    29. volumes>
    30. <move_factor>0.2move_factor>
    31. moving_from_ssd_to_hdd>
    32. policies>
    33. storage_configuration>
    示例:
    1. <path>/data1/ClickHouse/data/path>
    2. <storage_configuration>
    3. <disks>
    4. <hot>
    5. <path>/data1/ClickHouse/hot/path>
    6. hot>
    7. <cold>
    8. <path>/data2/ClickHouse/cold/path>
    9. cold>
    10. disks>
    11. <policies>
    12. <ttl>
    13. <volumes>
    14. <hot>
    15. <disk>hotdisk>
    16. hot>
    17. <cold>
    18. <disk>colddisk>
    19. cold>
    20. volumes>
    21. ttl>
    22. policies>
    23. storage_configuration>
    语法格式
    • < path> 为ClickHouse默认的存储路径,找到该标签后在下方添加存储策略标签
    • :固定标签,定义存储策略。
    • < dicks> 固定标签,下面会定义磁盘名称,以及磁盘绝对路径。
    • < hot>、< cold>:自定义标签,用来标记该路径,可按照此名称定义便于区分。
    • < policies>:固定标签,定义具体存储策略名称。
    • < ttl>:自定义标签,定义具体存储策略的名称,用于表级TTL,可按照此名称定义便于区分。
    • < volumes>:固定标签,定义卷组。
    • < hot>、< cold>:卷组名称,每个卷组下可以包括一个或多个disk标签,disk标签取值为< disks >标签下定义的磁盘名称。
    检查
    1. vm-01 :) select * from system.storage_policies;
    2. SELECT *
    3. FROM system.storage_policies
    4. ┌─policy_name────────────┬─volume_name─┬─volume_priority─┬─disks────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┐
    5. │ default │ default │ 1 │ ['default'] │ JBOD │ 0 │ 0 │
    6. │ moving_from_ssd_to_hdd │ hot │ 1 │ ['fast_ssd'] │ JBOD │ 1073741824 │ 0.2 │
    7. │ moving_from_ssd_to_hdd │ cold │ 2 │ ['disk0'] │ JBOD │ 0 │ 0.2 │
    8. │ single │ single │ 1 │ ['disk0'] │ JBOD │ 0 │ 0.1 │
    9. └────────────────────────┴─────────────┴─────────────────┴──────────────┴─────────────┴────────────────────┴─────────────┘
    10. 4 rows in set. Elapsed: 0.008 sec.
    11. vm-01 :) select * from system.disks;
    12. SELECT *
    13. FROM system.disks
    14. ┌─name─────┬─path───────────────────────┬──free_space─┬─total_space─┬─keep_free_space─┬─type──┐
    15. │ default │ /var/lib/clickhouse/ │ 10822782976 │ 18238930944 │ 0 │ local
    16. │ disk0 │ /opt/data/clickhouse/ │ 9798782976 │ 17214930944 │ 1024000000 │ local
    17. │ fast_ssd │ /opt/data/clickhouse_fast/ │ 9798782976 │ 17214930944 │ 1024000000 │ local
    18. └──────────┴────────────────────────────┴─────────────┴─────────────┴─────────────────┴───────┘
    19. 3 rows in set. Elapsed: 0.002 sec.
    20. -- 切换库
    21. vm-01 :) use default;
    22. -- 检查
    23. show create table t1;
    创建表
    1. -- 创建表
    2. > create table t1(`id` Int32,`name` String) engine=MergeTree() order by id settings storage_policy='moving_from_ssd_to_hdd';
    3. -- 检查
    4. SELECT name, data_paths, metadata_path, storage_policy from system.tables where name in ('t1','t2','t3')
    模拟写入
    1. --
    2. insert into t1 values(1,'aa'),(2,'bb'),(3,'cc');
    3. -- check
    4. tree /opt/data/clickhouse_fast/
    5. tree /opt/data/clickhouse/
    查看表数据和分区存储信息
    1. -- 查看表数据和分区存储信息,可以看到按照分区将数据写入到了不同的磁盘目录下
    2. SELECT name, data_paths, metadata_path, storage_policy from system.tables where name ='t1'
    3. -- 查看分区存储信息
    4. select name, disk_name, path from system.parts where table = 't1';

    多磁盘数据迁移

    手动模拟分区合并

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

    1. --
    2. optimize table t1;
    3. --
    4. select name, disk_name, path from system.parts where table = 't1' and active;
    多磁盘分区迁移
    1. ##
    2. ALTER TABLE t1 MOVE PART 'all_2_2_0' TO VOLUME 'cold'
    3. ##
    4. vm-01 :) select name, disk_name, path from system.parts where table = 't1' and active;
    5. SELECT
    6. name,
    7. disk_name,
    8. path
    9. FROM system.parts
    10. WHERE (table = 't1') AND active
    11. ┌─name──────┬─disk_name─┬─path─────────────────────────────────────────────────┐
    12. │ all_1_1_0 │ fast_ssd │ /opt/data/clickhouse_fast/data/default/t1/all_1_1_0/ │
    13. │ all_2_2_0 │ fast_ssd │ /opt/data/clickhouse_fast/data/default/t1/all_2_2_0/ │
    14. └───────────┴───────────┴──────────────────────────────────────────────────────┘
    15. 2 rows in set. Elapsed: 0.010 sec.
    16. vm-01 :) select * from system.storage_policies;
    17. SELECT *
    18. FROM system.storage_policies
    19. ┌─policy_name────────────┬─volume_name─┬─volume_priority─┬─disks────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┐
    20. │ default │ default │ 1 │ ['default'] │ JBOD │ 0 │ 0 │
    21. │ moving_from_ssd_to_hdd │ hot │ 1 │ ['fast_ssd'] │ JBOD │ 1073741824 │ 0.2 │
    22. │ moving_from_ssd_to_hdd │ cold │ 2 │ ['disk0'] │ JBOD │ 0 │ 0.2 │
    23. │ single │ single │ 1 │ ['disk0'] │ JBOD │ 0 │ 0.1 │
    24. └────────────────────────┴─────────────┴─────────────────┴──────────────┴─────────────┴────────────────────┴─────────────┘
    25. 4 rows in set. Elapsed: 0.006 sec.
    26. vm-01 :) ALTER TABLE t1 MOVE PART 'all_2_2_0' TO VOLUME 'cold'
    27. ALTER TABLE t1
    28. MOVE PART 'all_2_2_0' TO VOLUME 'cold'
    29. Ok.
    30. 0 rows in set. Elapsed: 0.005 sec.
    31. vm-01 :) select name, disk_name, path from system.parts where table = 't1' and active;
    32. SELECT
    33. name,
    34. disk_name,
    35. path
    36. FROM system.parts
    37. WHERE (table = 't1') AND active
    38. ┌─name──────┬─disk_name─┬─path─────────────────────────────────────────────────┐
    39. │ all_1_1_0 │ fast_ssd │ /opt/data/clickhouse_fast/data/default/t1/all_1_1_0/ │
    40. │ all_2_2_0 │ disk0 │ /opt/data/clickhouse/data/default/t1/all_2_2_0/ │
    41. └───────────┴───────────┴──────────────────────────────────────────────────────┘
    42. 2 rows in set. Elapsed: 0.003 sec.

    策略下沉并应用

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

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

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

    冷热数据分离

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

    基于move factor的数据移动策略
    1. vm-01 :) select * from system.storage_policies;
    2. SELECT *
    3. FROM system.storage_policies
    4. ┌─policy_name────────────┬─volume_name─┬─volume_priority─┬─disks────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┐
    5. defaultdefault1 │ ['default'] │ JBOD │ 00
    6. │ moving_from_ssd_to_hdd │ hot │ 1 │ ['fast_ssd'] │ JBOD │ 10737418240.2
    7. │ moving_from_ssd_to_hdd │ cold │ 2 │ ['disk0'] │ JBOD │ 00.2
    8. │ single │ single │ 1 │ ['disk0'] │ JBOD │ 00.1
    9. └────────────────────────┴─────────────┴─────────────────┴──────────────┴─────────────┴────────────────────┴─────────────┘
    10. 4 rows in set. Elapsed: 0.004 sec.
    11. vm-01 :) select * from system.disks;
    12. SELECT *
    13. FROM system.disks
    14. ┌─name─────┬─path───────────────────────┬──free_space─┬─total_space─┬─keep_free_space─┬─type──┐
    15. default/var/lib/clickhouse/10813464576182389309440local
    16. │ disk0 │ /opt/data/clickhouse/9789464576172149309441024000000local
    17. │ fast_ssd │ /opt/data/clickhouse_fast/9789464576172149309441024000000local
    18. └──────────┴────────────────────────────┴─────────────┴─────────────┴─────────────────┴───────┘
    19. 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 也是从前面的卷移动到后面的卷。

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

    基于TTL的数据移动策略
    1. -- 创建时指定 TTL
    2. CREATE TABLE ttl_test_tbl
    3. (
    4. `f1` String,
    5. `f2` String,
    6. `f3` Int64,
    7. `f4` Float64,
    8. `date` Date
    9. )
    10. ENGINE = MergeTree()
    11. PARTITION BY date
    12. ORDER BY f1
    13. TTL date + INTERVAL 90 DAY TO DISK 'disk0'
    14. SETTINGS storage_policy = 'moving_from_ssd_to_hdd';
    15. -- 修改表的 TTL
    16. ALTER TABLE example_table
    17. MODIFY TTL d + INTERVAL 1 DAY ;
    检查
    1. vm-01 :) show tables;
    2. SHOW TABLES
    3. ┌─name─────────┐
    4. │ enum │
    5. │ student │
    6. │ tt │
    7. │ ttl_test_tbl │
    8. └──────────────┘
    9. 4 rows in set. Elapsed: 0.005 sec.
    10. vm-01 :) desc ttl_test_tbl;
    11. DESCRIBE TABLE ttl_test_tbl
    12. ┌─name─┬─type────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
    13. │ f1 │ String │ │ │ │ │ │
    14. │ f2 │ String │ │ │ │ │ │
    15. │ f3 │ Int64 │ │ │ │ │ │
    16. │ f4 │ Float64 │ │ │ │ │ │
    17. dateDate │ │ │ │ │ │
    18. └──────┴─────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
    19. 5 rows in set. Elapsed: 0.002 sec.
    20. vm-01 :) show create table ttl_test_tbl;
    21. SHOW CREATE TABLE ttl_test_tbl
    22. ┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
    23. CREATE TABLE db_devops.ttl_test_tbl
    24. (
    25. `f1` String,
    26. `f2` String,
    27. `f3` Int64,
    28. `f4` Float64,
    29. `date` Date
    30. )
    31. ENGINE = MergeTree()
    32. PARTITION BY date
    33. ORDER BY f1
    34. TTL date + toIntervalDay(90) TO DISK 'disk0'
    35. SETTINGS storage_policy = 'moving_from_ssd_to_hdd', index_granularity = 8192
    36. └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
    37. 1 rows in set. Elapsed: 0.002 sec.

    参考文档:

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

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

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

    报错需要修改如下:

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

    1. <moving_from_ssd_to_hdd>
    2. <volumes>
    3. <default>
    4. <disk>defaultdisk>
    5. default>
    6. default>
    7. <hot>
    8. <disk>fast_ssddisk>
    9. <max_data_part_size_bytes>1073741824max_data_part_size_bytes>
    10. hot>
    11. <cold>
    12. <disk>disk0disk>
    13. cold>
    14. volumes>
    15. <move_factor>0.2move_factor>
    16. moving_from_ssd_to_hdd>

  • 相关阅读:
    Jmeter基础入门教程【12】--常用功能详解:JDBC
    Mac OS 用户开启 8080 端口
    需求复盘 | 职责分离原则开发实战
    SpringBoot整合SpringSecrity+JWT ---复制即用
    k8s-service-3-clusterip
    C# 支付宝小程序 ---小程序支付
    shell脚本常用语句记录--持续更新
    《算法竞赛·快冲300题》每日一题:“彩虹数”
    希望大家给我一些关于实习和就业的建议
    菜鸟逆袭成为大佬,就靠这份《数据中心设施运维指南》,啃完你就知道多香了
  • 原文地址:https://blog.csdn.net/knight_zhou/article/details/132655953