【ClickHouse系列】使用S3实现ClickHouse的无限量存储

首先说明此S3并非ClickHouse支持的S3表引擎,而是可以使用MergeTree表引擎直接将数据存到S3中。

可能被第一句话绕蒙了,先来大致了解下这两种方式:S3表引擎DiskS3

S3表引擎

创建S3表,注意原生S3表引擎只支持S3的公有读写,不支持配置AK/SK

CREATE TABLE s3_test (
    dt Date,
    id Int64,
    data String
) ENGINE = S3('http://{s3url}/{bucket}/{file}', 'CSV');

插入数据

INSERT INTO s3_test VALUES (NOW(),1,'A'),(NOW(),2,'B'),(NOW(),3,'C'),(NOW(),4,'D'),(NOW(),5,'E'),(NOW(),6,'F');

查询数据

SELECT *
FROM s3_test

┌─────────dt─┬─id─┬─data─┐
│ 2020-08-141 │ A    │
│ 2020-08-142 │ B    │
│ 2020-08-143 │ C    │
│ 2020-08-144 │ D    │
│ 2020-08-145 │ E    │
│ 2020-08-146 │ F    │
└────────────┴────┴──────┘

6 rows in set. Elapsed: 0.040 sec.

这种方式是建立S3表引擎,利用该引擎打通的S3接口来实现S3的读写(S3表引擎不支持S3的追加写),简单来说就是实现S3的基本接口。

DiskS3

DiskS3是真正用S3实现了底层存储,和表引擎无关,可以在S3存储的基础上使用MergTree表引擎,即MergeTree表引擎既有其本身的特性,而且将数据都用S3进行了存储。

配置方法

当然使用这个方式就需要进行一些特殊的配置,如下,可将该配置文件放在/etc/clickhouse-server/config.d目录下

<yandex>
    <storage_configuration>
        <disks>
            <s3>
                <type>s3</type>
                <endpoint>http://{s3url}/{bucket}/{path}/</endpoint>
                <access_key_id>{ak}</access_key_id>
                <secret_access_key>{sk}</secret_access_key>
            </s3>
        </disks>
        <policies>
            <s3>
                <volumes>
                    <main>
                        <disk>s3</disk>
                    </main>
                </volumes>
            </s3>
        </policies>
    </storage_configuration>
</yandex>

其实DiskS3也是借助了ClickHouse灵活的存储策略支持,比如可以配置多块盘,配置冷热数据分离存储等等。

扩展内容

冷热数据分离存储配置方法

<yandex>
    <storage_configuration>
        <disks>
            <ssd>
                <path>/ssd/clickhouse</path>
            </ssd>
            <hdd>
                <path>/hdd/clickhouse</path>
                <keep_free_space_bytes>10485760</keep_free_space_bytes>
            </hdd>
        </disks>
        <policies>
            <ssd_to_hdd>
                <volumes>
                    <hot>
                      <disk>ssd</disk>
                  <max_data_part_size_bytes>1073741824</max_data_part_size_bytes>
                    </hot>
                    <cold>
                        <disk>hdd</disk>
                    </cold>
                    <move_factor>0.2</move_factor>
                </volumes>
            </ssd_to_hdd>
        </policies>
    </storage_configuration>
</yandex>

其中/ssd/clickhouse挂载ssd,/hdd/clickhouse挂载hdd,move_factor移动因子表示如果还剩20%的空间就进行ssd到hdd的数据移动。

多块盘的情况和上述配置类似,不做过多扩展。

建表及数据操作

当配置完DiskS3后可以通过系统表查看,如下,可见move_factor默认为0.1.

SELECT *
FROM system.storage_policies
WHERE policy_name = 's3'

Row 1:
──────
policy_name:        s3
volume_name:        main
volume_priority:    1
disks:              ['s3']
max_data_part_size: 0
move_factor:        0.1

1 rows in set. Elapsed: 0.001 sec.

创建MergeTree表

CREATE TABLE disks3_test (
    dt Date,
    id Int64,
    data String,
    INDEX min_max (id) TYPE minmax GRANULARITY 3
) ENGINE=MergeTree()
PARTITION BY dt
ORDER BY (dt, id)
SETTINGS
storage_policy='s3',
old_parts_lifetime=0,
index_granularity=512;

插入数据

INSERT INTO disks3_test VALUES (NOW(),1,'A'),(NOW(),2,'B'),(NOW(),3,'C'),(NOW(),4,'D'),(NOW(),5,'E'),(NOW(),6,'F');

查询数据

SELECT *
FROM disks3_test

┌─────────dt─┬─id─┬─data─┐
│ 2020-08-141 │ A    │
│ 2020-08-142 │ B    │
│ 2020-08-143 │ C    │
│ 2020-08-144 │ D    │
│ 2020-08-145 │ E    │
│ 2020-08-146 │ F    │
└────────────┴────┴──────┘

6 rows in set. Elapsed: 0.147 sec.
表数据文件

DiskS3的数据文件不在默认的data数据目录了,而是在/var/lib/clickhouse/disks/s3/data/目录。比如disks3_test,目录为/var/lib/clickhouse/disks/s3/data/default/disks3_test,具体目录结构为:

[root@ck disks3_test]# tree
.
├── 20200814_1_1_0
│   ├── checksums.txt
│   ├── columns.txt
│   ├── count.txt
│   ├── data.bin
│   ├── data.mrk2
│   ├── dt.bin
│   ├── dt.mrk2
│   ├── id.bin
│   ├── id.mrk2
│   ├── minmax_dt.idx
│   ├── partition.dat
│   ├── primary.idx
│   ├── skp_idx_min_max.idx
│   └── skp_idx_min_max.mrk2
├── detached
└── format_version.txt

看一下dt.bindt.mrk2

[root@ck 20200814_1_1_0]# cat dt.bin 
1
1	38
38	ck/ubkprtqwgjlyyobbwbaizgxdrtrysxxa
0
[root@ck 20200814_1_1_0]# cat dt.mrk2 
1
1	48
48	ck/caiylwqkiipxvbphxuosgcwpppilxixp
0

发现这些文件并不是二进制文件,都是数字和字符串,其中的字符串就是对应在S3上的文件,如ubkprtqwgjlyyobbwbaizgxdrtrysxxa,可以通过s3cmd验证一下:

[root@ck 20200814_1_1_0]# s3cmd ls s3://ck/ubkprtqwgjlyyobbwbaizgxdrtrysxxa
2020-08-14 10:19           38  s3://ck/ubkprtqwgjlyyobbwbaizgxdrtrysxxa

可以发现s3上确实已存在该文件,通过s3cmd ls也可以发现.bin.mrk2中的数字就是s3文件的大小,即38B。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只努力的微服务

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值