本文为您介绍在阿里云E-MapReduce的ClickHouse集群上,如何通过OSS进行数据的冷热分离。通过本文操作,您既可以在保证集群读写性能的基础上,自动维护集群上的冷热数据,又可以充分利用计算和存储资源,以降低成本。
前提条件
已在EMR控制台上创建EMR-5.7.0及以上版本的ClickHouse集群,详情请参见创建ClickHouse集群。
使用限制
本文操作仅适用于EMR-5.7.0及以上版本的ClickHouse集群。
操作流程
步骤一:在EMR控制台添加磁盘
- 进入ClickHouse配置页面。
- 登录EMR on ECS控制台。
- 在顶部菜单栏处,根据实际情况选择地域和资源组。
- 在集群管理页面,单击目标集群操作列的集群服务。
- 在集群服务页面,单击ClickHouse服务区域的配置。
- 在服务配置区域,单击server-metrika页签。
- 修改storage_configuration的参数值。
- 保存配置。
- 在ClickHouse服务的配置页面,单击保存。
- 在确认修改对话框中,输入执行原因,打开自动更新配置开关,单击确定。
- 部署客户端配置。
- 在ClickHouse服务的配置页面,单击部署客户端配置。
- 在执行集群操作对话框中,输入执行原因,单击确定。
- 在确认对话框中,单击确定。
步骤二:验证配置
- 使用SSH方式登录ClickHouse集群,详情请参见登录集群。
- 执行如下命令,启动ClickHouse客户端。
clickhouse-client -h core-1-1 -m
说明 本示例登录core-1-1节点,如果您有多个Core节点,可以登录任意一个节点。 - 执行如下命令,查看磁盘信息。
select * from system.disks;
返回信息如下所示。┌─name─────┬─path────────────────────────────────┬───────────free_space─┬──────────total_space─┬─keep_free_space─┬─type──┐ │ default │ /var/lib/clickhouse/ │ 83868921856 │ 84014424064 │ 0 │ local │ │ disk1 │ /mnt/disk1/clickhouse/ │ 83858436096 │ 84003938304 │ 10485760 │ local │ │ disk2 │ /mnt/disk2/clickhouse/ │ 83928215552 │ 84003938304 │ 10485760 │ local │ │ disk3 │ /mnt/disk3/clickhouse/ │ 83928301568 │ 84003938304 │ 10485760 │ local │ │ disk4 │ /mnt/disk4/clickhouse/ │ 83928301568 │ 84003938304 │ 10485760 │ local │ │ disk_oss │ /var/lib/clickhouse/disks/disk_oss/ │ 18446744073709551615 │ 18446744073709551615 │ 0 │ oss │ └──────────┴─────────────────────────────────────┴──────────────────────┴──────────────────────┴─────────────────┴───────┘
- 执行如下命令,查看磁盘存储策略。
select * from system.storage_policies;
返回信息如下所示。┌─policy_name─┬─volume_name─┬─volume_priority─┬─disks─────────────────────────────┬─volume_type─┬─max_data_part_size─┬─move_factor─┬─prefer_not_to_merge─┐ │ default │ single │ 1 │ ['disk1','disk2','disk3','disk4'] │JBOD │ 0 │ 0 │ 0 │ │ oss_ttl │ local │ 1 │ ['disk1','disk2','disk3','disk4'] │JBOD │ 0 │ 0.2 │ 0 │ │ oss_ttl │ remote │ 2 │ ['disk_oss'] │JBOD │ 0 │ 0.2 │ 0 │ └─────────────┴─────────────┴─────────────────┴───────────────────────────────────┴─────────────┴────────────────────┴─────────────┴─────────────────────┘
当回显信息如上文所示时,表示磁盘扩容操作完成。
步骤三:进行冷热分离
对已有的表进行改造
- 在ClickHouse客户端执行如下命令,查看当前的存储策略。
SELECT storage_policy FROM system.tables WHERE database='<yourDatabaseName>' AND name='<yourTableName>';
本文示例中命令中的
<yourDataName>
为数据库名,<yourTableName>
为表名。如果返回信息如下所示,则需要参见下一步骤添加一个volume。<default> <volumes> <single> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </single> </volumes> </default>
- 扩展当前的存储策略。在EMR控制台ClickHouse服务的配置页签,增加volume内容,详细信息如下。
<default> <volumes> <single> <disk>disk1</disk> <disk>disk2</disk> <disk>disk3</disk> <disk>disk4</disk> </single> <!-- 以下是新增的volume remote --> <remote> <disk>disk_oss</disk> </remote> </volumes> <!-- 多个volume时需要指定move_factor --> <move_factor>0.2</move_factor> </default>
- 执行以下命令,修改TTL。
ALTER TABLE <yourDataName>.<yourTableName> MODIFY TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote';
- 执行以下命令,查看各个part的分布。
select partition,name,path from system.parts where database='<yourDataName>' and table='<yourTableName>' and active=1
返回信息如下。┌─partition───────────┬─name─────────────────────┬─path──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 2022-01-11 19:55:00 │ 1641902100_1_90_3_193 │ /var/lib/clickhouse/disks/disk_oss/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902100_1_90_3_193/ │ │ 2022-01-11 19:55:00 │ 1641902100_91_96_1_193 │ /var/lib/clickhouse/disks/disk_oss/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902100_91_96_1_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_97_124_2_193 │ /mnt/disk3/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_97_124_2_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_125_152_2_193 │ /mnt/disk2/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_125_152_2_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_153_180_2_193 │ /mnt/disk4/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_153_180_2_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_181_186_1_193 │ /mnt/disk3/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_181_186_1_193/ │ │ 2022-01-11 20:00:00 │ 1641902400_187_192_1_193 │ /mnt/disk4/clickhouse/store/fc5/fc50a391-4c16-406b-a396-6e1104873f68/1641902400_187_192_1_193/ │ └─────────────────────┴──────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────┘ 7 rows in set. Elapsed: 0.002 sec.
说明 如果结果类似上所示,则表明数据根据时间做了冷热分离。热数据存放在本地盘中,冷数据存放在OSS中。其中,/var/lib/clickhouse/disks/disk_oss是disk_oss的metadata_path的默认值。/mnt/disk{1..4}/clickhouse是本地盘路径。
创建新的表
- 创建语法
CREATE TABLE <yourDataName>.<yourTableName> [ON CLUSTER cluster_emr] ( column1 Type1, column2 Type2, ... ) Engine = MergeTree() -- or Replicated*MergeTree() PARTITION BY <yourPartitionKey> ORDER BY <yourPartitionKey> TTL <yourTtlKey> TO VOLUME 'remote' SETTINGS storage_policy='oss_ttl';
说明 命令中的<yourPartitionKey>为ClickHouse的分区键。<yourTtlKey>为您设置的TTL信息。 - 示例
CREATE TABLE test.test ( `id` UInt32, `t` DateTime ) ENGINE = MergeTree() PARTITION BY toStartOfFiveMinute(t) ORDER BY id TTL toStartOfMinute(addMinutes(t, 5)) TO VOLUME 'remote' SETTINGS storage_policy='oss_ttl';
说明 本示例中,表格会将5分钟内的数据存放在本地,过了5分钟后,数据会被移动到remote volume中,也就是OSS中。
相关配置
- server-config
merge_tree.allow_remote_fs_zero_copy_replication:设置为true,以在Replicated*MergeTree使用DiskOSS等远程存储时利用OSS的多副本进行备份,ClickHouse的一个Shard下的多个副本中的数据仅会备份元数据。
- server-users
- profile.${your-profile-name}.s3_min_upload_part_size:Write Buffer中的数据量高于该参数值时,会将数据写到OSS中。
- profile.${your-profile-name}.s3_max_single_part_upload_size}:Write Buffer中的数据量高于该参数值时,使用MultipartUpload,详情请参见分片上传(MultipartUpload) 。