如果使用Ecs自建ClickHouse,数据量比较大的时候,存储成本会逐渐增加。
此时可以使用冷热分离的方式,将部分冷数据,转存至oss,以降低成本。
- Amazon S3对象存储。
- Hadoop 分布式文件系统 ( HDFS )
- Azure Blob 存储。
没有提供阿里云OSS方式,但是阿里云OSS无缝兼容S3,所以可以借助S3方式存储至阿里云OSS。
如果直接copy官方给的 S3的配置方式,会发现如下报错,挂载失败:
<Error>
<Code>MethodNotAllowed</Code>
<Message>The specified method is not allowed against this resource.</Message>
<RequestId>xxxx</RequestId>
<HostId>xxxx</HostId>
<Method>POST</Method>
<ResourceType>Object</ResourceType>
<EC>0017-00000001</EC>
<RecommendDoc>https://api.aliyun.com/troubleshoot?q=0017-00000001</RecommendDoc>
</Error>
此问题,在22.11.1.1360版本增加oss支持,具体changelog:https://clickhouse.com/docs/en/whats-new/changelog/2022#-clickhouse-release-2211-2022-11-17 ,具体pull https://github.com/ClickHouse/ClickHouse/pull/43155
通过查看代码,在匹配外部链接时,旧版本使用了如下正则,不能匹配阿里云oss官方链接。
文件:src/IO/S3Common.cpp内
static const RE2 virtual_hosted_style_pattern(R"((.+)\.(s3|cos|obs)([.\-][a-z0-9\-.:]+))");
所以低版本可以通过在OSS使用自建域名,且域名包含s3的Domain,可以绕过此正则,通过s3协议匹配OSS。
具体配置如下:
<disks>
<default>
</default>
<oss>
<type>s3</type>
<endpoint>http://xxx.s3.xxxx/xxx/</endpoint>
<use_environment_credentials>1</use_environment_credentials>
<object_storage_type>s3</object_storage_type>
<metadata_type>local</metadata_type>
<access_key_id>xxxxx</access_key_id>
<secret_access_key>xxxx</secret_access_key>
<use_insecure_imds_request>false</use_insecure_imds_request>
</oss>
</disks>
<policies>
<default>
<volumes>
<default>
<disk>default</disk>
</default>
</volumes>
</default>
<oss>
<volumes>
<main>
<disk>oss</disk>
</main>
</volumes>
</oss>
</policies>
-- 其中 http://xxx.s3.xxxx/xxx/ 为阿里云oss绑定的域名,并且做了cname
-- access_key_id及secret_access_key 为有权限的ram账号及密钥