免费建微网站平台,网站开发技术要学什么软件,阿里云可以做电商网站吗,淄博张店网站排名优化存储策略
clickhouse从19.15开始#xff0c;MergeTree实现了自定义存储策略的功能#xff1a;
JBOD策略#xff1a;这种策略适合服务器挂多磁盘但没做raid的场景。JBOD是一种轮询策略#xff0c;每次执行INSERT或者MERGE#xff0c;所以产生的新分区会轮询写入各个磁盘。…存储策略
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
配置
storage_configurationdisksdisk_01path/data/chbase/data_01//path/disk_01disk_02path/data/chbase/data_02//path/disk_02disk_03path/data/chbase/data_03//path/disk_03/diskspoliciesjbod_policiesvolumesjbod_volumediskdisk_01/diskdiskdisk_02/disk/jbod_volume/volumes/jbod_policies/policies
/storage_configuration查看disk配置
localhost :) SELECT name, path, formatReadableSize(free_space) AS free, formatReadableSize(total_space) AS total, formatReadableSize(keep_free_space) AS reserved FROM system.disks;┌─name────┬─path────────────────────────────┬─free──────┬─total─────┬─reserved─┐
│ default │ /data/database/clickhouse/data/ │ 13.19 GiB │ 29.98 GiB │ 0.00 B │
│ disk_01 │ /data/chbase/data_01/ │ 13.19 GiB │ 29.98 GiB │ 0.00 B │
│ disk_02 │ /data/chbase/data_02/ │ 13.19 GiB │ 29.98 GiB │ 0.00 B │
│ disk_03 │ /data/chbase/data_03/ │ 13.19 GiB │ 29.98 GiB │ 0.00 B │
└─────────┴─────────────────────────────────┴───────────┴───────────┴──────────┘查看policies策略
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;┌─policy_name───┬─volume_name─┬─volume_priority─┬─disks─────────────────┬─max_data_part_size─┬─move_factor─┐
│ default │ default │ 1 │ [default] │ 0.00 B │ 0 │
│ jbod_policies │ jbod_volume │ 1 │ [disk_01,disk_02] │ 0.00 B │ 0.1 │
└───────────────┴─────────────┴─────────────────┴───────────────────────┴────────────────────┴─────────────┘建表测试
##使用settings storage_policyjbod_policies指定策略
localhost :) CREATE TABLE jbod_table_v1
(id UInt64
)
ENGINE MergeTree()
ORDER BY id
SETTINGS storage_policy jbod_policies##写入第一批数据创建第一个分区目录
localhost :) INSERT INTO jbod_table_v1 SELECT rand() FROM numbers(10);##查看系统分区表可以看到第一个分区all_1_1_0被写入到disk_01
localhost :) SELECT name, disk_name FROM system.parts WHERE tablejbod_table_v1;
┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01 │
└───────────┴───────────┘##写入第二批数据创建第二个分区目录
localhost :) INSERT INTO jbod_table_v1 SELECT rand() FROM numbers(10);##可以看到第二个分区all_2_2_0被写入到disk_02
localhost :) SELECT name, disk_name FROM system.parts WHERE tablejbod_table_v1;
┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01 │
│ all_2_2_0 │ disk_02 │
└───────────┴───────────┘##反复几次
localhost :) SELECT name, disk_name FROM system.parts WHERE tablejbod_table_v1;
┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01 │
│ all_2_2_0 │ disk_02 │
│ all_3_3_0 │ disk_01 │
│ all_4_4_0 │ disk_02 │
└───────────┴───────────┘JBOD策略每当生成一个新数据分区的时候分区目录会根据volume中定义的disk顺序依次轮询并写入各个disk。
HOT/COLD
配置:
storage_configurationdisksdisk_01path/data/chbase/data_01//path/disk_01disk_02path/data/chbase/data_02//path/disk_02clod_diskpath/data/chbase/cold_data//pathkeep_free_space_bytes21474836480/keep_free_space_bytes/clod_disk/diskspolicieshot_to_coldvolumeshot_volumediskdisk_01/diskdiskdisk_02/diskmax_data_part_size_bytes1048576/max_data_part_size_bytes/hot_volumecold_volumediskclod_disk/disk/cold_volume/volumesmove_factor0.2/move_factor/hot_to_cold/policies
/storage_configuration查看disk配置
localhost :) SELECT name, path, formatReadableSize(free_space) AS free, formatReadableSize(total_space) AS total, formatReadableSize(keep_free_space) AS reserved FROM system.disks;┌─name──────┬─path────────────────────────────┬─free──────┬─total─────┬─reserved──┐
│ clod_disk │ /data/chbase/cold_data/ │ 29.94 GiB │ 29.97 GiB │ 20.00 GiB │
│ default │ /data/database/clickhouse/data/ │ 16.49 GiB │ 27.94 GiB │ 0.00 B │
│ disk_01 │ /data/chbase/data_01/ │ 9.96 GiB │ 9.99 GiB │ 0.00 B │
│ disk_02 │ /data/chbase/data_02/ │ 9.96 GiB │ 9.99 GiB │ 0.00 B │
└───────────┴─────────────────────────────────┴───────────┴───────────┴───────────┘查看policies策略
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;┌─policy_name─┬─volume_name──┬─volume_priority─┬─disks─────────────────┬─max_data_part_size─┬─move_factor─┐
│ default │ default │ 1 │ [default] │ 0.00 B │ 0 │
│ hot_to_cold │ hot_volume │ 1 │ [disk_01,disk_02] │ 1.00 GiB │ 0.2 │
│ hot_to_cold │ cold_volume │ 2 │ [clod_disk] │ 0.00 B │ 0.2 │
└─────────────┴──────────────┴─────────────────┴───────────────────────┴────────────────────┴─────────────┘可以看出hot_to_cold策略有两个volume: hot_volume、cold_volume。其中hot_volume有两块磁盘disk_01、disk_02。建表测试
localhost : CREATE TABLE htc_table_1
(id UInt64
)
ENGINE MergeTree()
ORDER BY id
SETTINGS storage_policy hot_to_cold;##写入两个分区
localhost :) INSERT INTO htc_table_1 SELECT rand() FROM numbers(100000);##查看两次生成的分区采用JBOD策略均衡在disk_01、disk_02
localhost :) SELECT name, disk_name FROM system.parts WHERE tablehtc_table_1;┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01 │
│ all_2_2_0 │ disk_02 │
└───────────┴───────────┘##由于max_data_part_size_bytes配置是1M写入一个超过1M大小的分区
localhost :) INSERT INTO htc_table_1 SELECT rand() FROM numbers(300000);##可以看到第三个分区被写入到clod_disk
localhost :) SELECT name, disk_name FROM system.parts WHERE tablehtc_table_1;┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_01 │
│ all_2_2_0 │ disk_02 │
│ all_3_3_0 │ clod_disk │
└───────────┴───────────┘HOT/COLD策略由多个disk组成volume组。每当一个新数据分区生成的时候按照阈值(max_data_part_size_bytes)的大小分区目录会按照volume组中定义的顺序依次写入。
合并分区或者一次性写入的分区大小超过max_data_part_size_bytes也会被写入到COLD卷中。
分区移动
虽然MergeTree定义完存储策略后不能修改但却可以移动分区
## 将某个分区移动到当前volume的另一个disk
localhost :) ALTER TABLE htc_table_1 MOVE PART all_1_1_0 TO DISK disk_02;localhost :) SELECT name, disk_name FROM system.parts WHERE tablehtc_table_1;┌─name──────┬─disk_name─┐
│ all_1_1_0 │ disk_02 │
│ all_2_2_0 │ disk_02 │
│ all_3_3_0 │ clod_disk │
└───────────┴───────────┘##将某个分区移动到其他volume
localhost :) ALTER TABLE htc_table_1 MOVE PART all_1_1_0 TO VOLUME cold_volume;localhost :) SELECT name, disk_name FROM system.parts WHERE tablehtc_table_1;┌─name──────┬─disk_name─┐
│ all_1_1_0 │ clod_disk │
│ all_2_2_0 │ disk_02 │
│ all_3_3_0 │ clod_disk │
└───────────┴───────────┘