如果使用Ecs自建ClickHouse,数据量比较大的时候,存储成本会逐渐增加。

此时可以使用冷热分离的方式,将部分冷数据,转存至oss,以降低成本。

官方提供的远程存储方式有

  1. Amazon S3对象存储。
  2. Hadoop 分布式文件系统 ( HDFS )
  3. 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


自建ClickHouse低版本(22.11.1.1360以下)接入阿里云OSS_oss

通过查看代码,在匹配外部链接时,旧版本使用了如下正则,不能匹配阿里云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账号及密钥