• clickhouse的多路径存储策略


    存储策略

    clickhouse从19.15开始,MergeTree实现了自定义存储策略的功能:

    • JBOD策略:这种策略适合服务器挂多磁盘但没做raid的场景。JBOD是一种轮询策略,每次执行INSERT或者MERGE,所以产生的新分区会轮询写入各个磁盘。这种策略可以减低单盘负载,在一定条件下提升数据并行读写的性能。
    • HOT/COLD策略:这种策略适合服务挂不通类型磁盘的场景。将磁盘分为HOT与COLD两类区域,HOT区使用小容量高速存储,注重存取性能;COLD区使用大容量低速存储,注重容量。MergeTree写入时,会在HOT区创建分区目录保存数据,当分区数据达到阈值,数据自动移动到COLD区。每个区内部也支持定义多个磁盘,支持JBOD策略。
    配置语法
    • storage_configuration 标签定义多路径存储策略
    • disks 标签定义磁盘
    • policies 标签定义策略
    • keep_free_space_bytes: 选填项,用于指定指定磁盘的预留空间,单位字节bit。
    • max_data_part_size_bytes:选填,字节为单位 默认1G,表示在这个卷的单个disk磁盘中,一个数据分区的最大磁盘存储阈值,若当前分区的数据大小超过阈值,则之后的分区会写入下一个disk磁盘。
    • move_factor:选填项,默认值为0.1,;若当前卷的可用空间大小小于factor因子,并且定义多个卷,则数据会自动移动到下一个卷。
    JBOD

    配置:

    1. <storage_configuration>
    2. <disks>
    3. <disk_01>
    4. <path>/data/chbase/data_01/</path>
    5. </disk_01>
    6. <disk_02>
    7. <path>/data/chbase/data_02/</path>
    8. </disk_02>
    9. <disk_03>
    10. <path>/data/chbase/data_03/</path>
    11. </disk_03>
    12. </disks>
    13. <policies>
    14. <jbod_policies>
    15. <volumes>
    16. <jbod_volume>
    17. <disk>disk_01</disk>
    18. <disk>disk_02</disk>
    19. </jbod_volume>
    20. </volumes>
    21. </jbod_policies>
    22. </policies>
    23. </storage_configuration>

    查看disk配置:

    1. localhost :) SELECT name, path, formatReadableSize(free_space) AS free, formatReadableSize(total_space) AS total, formatReadableSize(keep_free_space) AS reserved FROM system.disks;
    2. ┌─name────┬─path────────────────────────────┬─free──────┬─total─────┬─reserved─┐
    3. default/data/database/clickhouse/data/13.19 GiB │ 29.98 GiB │ 0.00 B │
    4. │ disk_01/data/chbase/data_01/13.19 GiB │ 29.98 GiB │ 0.00 B │
    5. │ disk_02/data/chbase/data_02/13.19 GiB │ 29.98 GiB │ 0.00 B │
    6. │ disk_03/data/chbase/data_03/13.19 GiB │ 29.98 GiB │ 0.00 B │
    7. └─────────┴─────────────────────────────────┴───────────┴───────────┴──────────┘

    查看policies策略:

    1. localhost :) SELECT policy_name, volume_name, volume_priority, disks, formatReadableSize(max_data_part_size) AS max_data_part_size, move_factor FROM system.storage_policies;
    2. ┌─policy_name───┬─volume_name─┬─volume_priority─┬─disks─────────────────┬─max_data_part_size─┬─move_factor─┐
    3. defaultdefault1 │ ['default'] │ 0.00 B │ 0
    4. │ jbod_policies │ jbod_volume │ 1 │ ['disk_01','disk_02'] │ 0.00 B │ 0.1
    5. └───────────────┴─────────────┴─────────────────┴───────────────────────┴────────────────────┴─────────────┘

    建表测试:

    1. ##使用settings storage_policy='jbod_policies'指定策略
    2. localhost :) CREATE TABLE jbod_table_v1
    3. (
    4. `id` UInt64
    5. )
    6. ENGINE = MergeTree()
    7. ORDER BY id
    8. SETTINGS storage_policy = 'jbod_policies'
    9. ##写入第一批数据,创建第一个分区目录
    10. localhost :) INSERT INTO jbod_table_v1 SELECT rand() FROM numbers(10);
    11. ##查看系统分区表,可以看到第一个分区all_1_1_0被写入到disk_01
    12. localhost :) SELECT name, disk_name FROM system.parts WHERE table='jbod_table_v1';
    13. ┌─name──────┬─disk_name─┐
    14. all_1_1_0 │ disk_01
    15. └───────────┴───────────┘
    16. ##写入第二批数据,创建第二个分区目录
    17. localhost :) INSERT INTO jbod_table_v1 SELECT rand() FROM numbers(10);
    18. ##可以看到第二个分区all_2_2_0被写入到disk_02
    19. localhost :) SELECT name, disk_name FROM system.parts WHERE table='jbod_table_v1';
    20. ┌─name──────┬─disk_name─┐
    21. all_1_1_0 │ disk_01
    22. all_2_2_0 │ disk_02
    23. └───────────┴───────────┘
    24. ##反复几次
    25. localhost :) SELECT name, disk_name FROM system.parts WHERE table='jbod_table_v1';
    26. ┌─name──────┬─disk_name─┐
    27. all_1_1_0 │ disk_01
    28. all_2_2_0 │ disk_02
    29. all_3_3_0 │ disk_01
    30. all_4_4_0 │ disk_02
    31. └───────────┴───────────┘

    JBOD策略,每当生成一个新数据分区的时候,分区目录会根据volume中定义的disk顺序依次轮询并写入各个disk。

    HOT/COLD

    配置:

    1. <storage_configuration>
    2. <disks>
    3. <disk_01>
    4. <path>/data/chbase/data_01/</path>
    5. </disk_01>
    6. <disk_02>
    7. <path>/data/chbase/data_02/</path>
    8. </disk_02>
    9. <clod_disk>
    10. <path>/data/chbase/cold_data/</path>
    11. <keep_free_space_bytes>21474836480</keep_free_space_bytes>
    12. </clod_disk>
    13. </disks>
    14. <policies>
    15. <hot_to_cold>
    16. <volumes>
    17. <hot_volume>
    18. <disk>disk_01</disk>
    19. <disk>disk_02</disk>
    20. <max_data_part_size_bytes>1048576</max_data_part_size_bytes>
    21. </hot_volume>
    22. <cold_volume>
    23. <disk>clod_disk</disk>
    24. </cold_volume>
    25. </volumes>
    26. <move_factor>0.2</move_factor>
    27. </hot_to_cold>
    28. </policies>
    29. </storage_configuration>

    查看disk配置:

    1. localhost :) SELECT name, path, formatReadableSize(free_space) AS free, formatReadableSize(total_space) AS total, formatReadableSize(keep_free_space) AS reserved FROM system.disks;
    2. ┌─name──────┬─path────────────────────────────┬─free──────┬─total─────┬─reserved──┐
    3. │ clod_disk │ /data/chbase/cold_data/29.94 GiB │ 29.97 GiB │ 20.00 GiB │
    4. default/data/database/clickhouse/data/16.49 GiB │ 27.94 GiB │ 0.00 B │
    5. │ disk_01/data/chbase/data_01/9.96 GiB │ 9.99 GiB │ 0.00 B │
    6. │ disk_02/data/chbase/data_02/9.96 GiB │ 9.99 GiB │ 0.00 B │
    7. └───────────┴─────────────────────────────────┴───────────┴───────────┴───────────┘

    查看policies策略:

    1. localhost :) SELECT policy_name, volume_name, volume_priority, disks, formatReadableSize(max_data_part_size) AS max_data_part_size, move_factor FROM system.storage_policies;
    2. ┌─policy_name─┬─volume_name──┬─volume_priority─┬─disks─────────────────┬─max_data_part_size─┬─move_factor─┐
    3. defaultdefault1 │ ['default'] │ 0.00 B │ 0
    4. │ hot_to_cold │ hot_volume │ 1 │ ['disk_01','disk_02'] │ 1.00 GiB │ 0.2
    5. │ hot_to_cold │ cold_volume │ 2 │ ['clod_disk'] │ 0.00 B │ 0.2
    6. └─────────────┴──────────────┴─────────────────┴───────────────────────┴────────────────────┴─────────────┘
    7. 可以看出,hot_to_cold策略有两个volume: hot_volume、cold_volume。其中hot_volume有两块磁盘:disk_01、disk_02

    建表测试:

    1. localhost : CREATE TABLE htc_table_1
    2. (
    3. `id` UInt64
    4. )
    5. ENGINE = MergeTree()
    6. ORDER BY id
    7. SETTINGS storage_policy = 'hot_to_cold';
    8. ##写入两个分区
    9. localhost :) INSERT INTO htc_table_1 SELECT rand() FROM numbers(100000);
    10. ##查看两次生成的分区采用JBOD策略均衡在disk_01、disk_02
    11. localhost :) SELECT name, disk_name FROM system.parts WHERE table='htc_table_1';
    12. ┌─name──────┬─disk_name─┐
    13. all_1_1_0 │ disk_01
    14. all_2_2_0 │ disk_02
    15. └───────────┴───────────┘
    16. ##由于max_data_part_size_bytes配置是1M,写入一个超过1M大小的分区
    17. localhost :) INSERT INTO htc_table_1 SELECT rand() FROM numbers(300000);
    18. ##可以看到第三个分区被写入到clod_disk
    19. localhost :) SELECT name, disk_name FROM system.parts WHERE table='htc_table_1';
    20. ┌─name──────┬─disk_name─┐
    21. all_1_1_0 │ disk_01
    22. all_2_2_0 │ disk_02
    23. all_3_3_0 │ clod_disk │
    24. └───────────┴───────────┘

    HOT/COLD策略,由多个disk组成volume组。每当一个新数据分区生成的时候,按照阈值(max_data_part_size_bytes)的大小,分区目录会按照volume组中定义的顺序依次写入。

    合并分区或者一次性写入的分区大小超过max_data_part_size_bytes,也会被写入到COLD卷中。

    分区移动

    虽然MergeTree定义完存储策略后不能修改,但却可以移动分区

    1. ## 将某个分区移动到当前volume的另一个disk
    2. localhost :) ALTER TABLE htc_table_1 MOVE PART 'all_1_1_0' TO DISK 'disk_02';
    3. localhost :) SELECT name, disk_name FROM system.parts WHERE table='htc_table_1';
    4. ┌─name──────┬─disk_name─┐
    5. all_1_1_0 │ disk_02
    6. all_2_2_0 │ disk_02
    7. all_3_3_0 │ clod_disk │
    8. └───────────┴───────────┘
    9. ##将某个分区移动到其他volume
    10. localhost :) ALTER TABLE htc_table_1 MOVE PART 'all_1_1_0' TO VOLUME 'cold_volume';
    11. localhost :) SELECT name, disk_name FROM system.parts WHERE table='htc_table_1';
    12. ┌─name──────┬─disk_name─┐
    13. all_1_1_0 │ clod_disk │
    14. all_2_2_0 │ disk_02
    15. all_3_3_0 │ clod_disk │
    16. └───────────┴───────────┘

  • 相关阅读:
    常用的Content-Type对比
    Day52 前端开发 JS 函数 BOM DOM
    部署LVS-DR群集 待续。。
    【Leetcode】top 100 矩阵
    享受新的安卓功能带来乐趣
    二十三种设计模式
    volatile和原子量atomic如何对抗编译器优化?
    手机备忘录怎么设置每月5号提醒事件
    otomegame游戏音频提取通用教程
    1250名微软员工自曝工资待遇,以求薪酬公平
  • 原文地址:https://blog.csdn.net/wsq1011/article/details/136395115