暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一切云存储都可以做为 ClickHouse 的存储层

alitrack 2021-04-02
3101

写在前面

ClickHouse 目前支持两种磁盘,DiskLocal 和 DiskS3, 即本地磁盘和 S3 对象存储。前两天分别探讨了ClickHouse 和 S3 结合的三种方式

今天介绍第四种方法,而且不仅仅支持 S3。

利用 Fuse 技术,可以让 Clickhouse 及其它应用轻松把数据存储在云端。本文初步测试了 3 款利用 Fuse 技术把云存储(包括 S3)虚拟为本地磁盘(Posix 文件系统)的软件。

测试环境

  • MinIO 运行在 macOS 主机上
  • ClickHouse 和三款被测软件均在 Ubuntu 上

s3fs[1]

S3fs 是基于 FUSE 的文件系统,允许 Linux 和 Mac Os X 挂载 S3 的存储桶在本地文件系统,S3fs 能够保持对象原来的格式。

详细使用可以参考, 利用 S3fs 在 Amazon EC2 Linux 实例上挂载 S3 存储桶[2]

因为测试结果不理想,步骤简化下,有兴趣的可以自行展开。

  1. 安装配置
$ sudo apt install s3fs

sudo mkdir /mnt/clickhouse
sudo chown -R clickhouse:clickhouse /mnt/clickhouse
echo minio:miniostorage> /etc/passwd-s3fs
chmod 600 /etc/passwd-s3fs
sudo chown clickhouse:clickhouse /etc/passwd-s3fs
sudo -u clickhouse s3fs s3fs /mnt/clickhouse  \
-o passwd_file=/etc/passwd-s3fs \
-o url=http://192.168.25.144:9000/ \
-o use_path_request_style


  1. 测试
CREATE TABLE sales_s3fs
(
    `Region` text,
    `Country` text,
    `Item Type` text NULL,
    `Sales Channel` text NULL,
    `Order Priority` text NULL,
    `Order Date` DateTime NULL,
    `Order ID` Int8 NULL,
    `Ship Date` DateTime NULL,
    `Units Sold` Int8 NULL,
    `Unit Price` FLOAT NULL,
    `Unit Cost` FLOAT NULL,
    `Total Revenue` FLOAT NULL,
    `Total Cost` FLOAT NULL,
    `Total Profit` FLOAT NULL
)
ENGINE = MergeTree
PARTITION BY Region
ORDER BY Country;

zcat sales_5m.csv.gz  \
|clickhouse-client -d default  \
--format_csv_delimiter="," \
--date_time_input_format=best_effort \
-q 'INSERT into sales_s3fs FORMAT CSVWithNames'

当引擎为 MergeTree 时,导入失败,为 Log 的时候,导入成功。

测试失败,放弃。

JuiceFS[3]

  • 支持更多的云服务
  • 元数据(Metadata) 保存在 redis
  • 数据存在云端
  1. 下载安装

juicefs 使用 redis 来存储元数据,因此需要安装 redis。


wget https://github.com/juicedata/juicefs/releases/download/v0.11.0/juicefs-0.11.0-linux-amd64.tar.gz
tar xf juicefs-0.11.0-linux-amd64.tar.gz
sudo apt install redis

  1. 格式化
./juicefs format     --storage minio    \
--bucket http://192.168.25.144:9000/jfs  \
--access-key minio --secret-key=miniostorage    \
localhost jfs

  1. 映射
sudo mkdir /mnt/jfs
sudo chown -R clickhouse:clickhouse /mnt/jfs
sudo -u clickhouse ./juicefs mount localhost /mnt/jfs

  1. 更新 config.xml 里 path 为 mnt/jfs
  2. 重启 ClickHouse Server
  3. 验证
SELECT
    name,
    path,
    type
FROM system.disks;

┌─name────┬─path───────────────┬─type──┐
│ default │ /mnt/jfs/          │ local │
└─────────┴────────────────────┴───────┘


SELECT
    policy_name,
    volume_name,
    volume_priority,
    disks
FROM system.storage_policies;

┌─policy_name─┬─volume_name─┬─volume_priority─┬─disks───────┐
│ default     │ default     │               1 │ ['default'] │
└─────────────┴─────────────┴─────────────────┴─────────────┘

  1. 测试
CREATE TABLE sales_jfs
(
    `Region` text,
    `Country` text,
    `Item Type` text NULL,
    `Sales Channel` text NULL,
    `Order Priority` text NULL,
    `Order Date` DateTime NULL,
    `Order ID` Int8 NULL,
    `Ship Date` DateTime NULL,
    `Units Sold` Int8 NULL,
    `Unit Price` FLOAT NULL,
    `Unit Cost` FLOAT NULL,
    `Total Revenue` FLOAT NULL,
    `Total Cost` FLOAT NULL,
    `Total Profit` FLOAT NULL
)
ENGINE = MergeTree
PARTITION BY Region
ORDER BY Country;

zcat sales_5m.csv.gz  \
|clickhouse-client -d default  \
--format_csv_delimiter="," \
--date_time_input_format=best_effort \
-q 'INSERT into sales_jfs FORMAT CSVWithNames'

SELECT
    Region,
    count(*) AS cnt
FROM sales_s3
GROUP BY Region;

┌─Region────────────────────────────┬─────cnt─┐
│ Europe                            │ 1296674 │
│ Asia                              │  729864 │
│ North America                     │  108131 │
│ Sub-Saharan Africa                │ 1297687 │
│ Australia and Oceania             │  405577 │
│ Central America and the Caribbean │  540528 │
│ Middle East and North Africa      │  621539 │
└───────────────────────────────────┴─────────┘

7 rows in set. Elapsed: 0.289 sec. Processed 5.00 million rows124.22 MB (17.30 million rows/s., 429.75 MB/s.)


Goofys[4]

支持多种云存储

  1. 准备工作
    1. 下载 goofys
    2. 安装 MinIO 或者使用 MinIO play,并创建 bucket
    3. 创建/mnt/goofy,并赋予 clickhouse 读写权限
    4. 设置 clickhouse 用户的默认 home 目录

clickhouse 目录默认没有自己的 home,但 goofys 默认从$HOME/.aws/credentials
读取账户信息。

sudo usermod -m -d /home/clickhouse clickhouse

并在/home/clickhouse/.aws/credentials
里写入如下信息,

  • play 部分是用于不想本地安装 MinIO 但仍想测试的,对应的 endpoint 是 play.min.io:9000
  • minio 是我在本地安装的 MinIO, 对应的 endpoint 是http://192.168.25.144:9000/
cat .aws/credentials
[play]
aws_access_key_id=Q3AM3UQ867SPQQA43P2F
aws_secret_access_key =zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
[minio]
aws_access_key_id=minio
aws_secret_access_key=miniostorage

  1. 运行 goofys
sudo -u clickhouse ./goofys \
--debug_fuse --profile minio \
--endpoint http://192.168.25.144:9000/ \
goofys /mnt/goofys

  • sudo -u clickhouse: 以 clickhouse 用户身份运行 goofys
  • profile : minio(就是上面配置的 credentials)
  • endpoint: http://192.168.25.144:9000/
  • bucket :goofys
  • mountpoint:/mnt/goofys
  • debug_fuse : 输出 fuse debug 信息
  1. 修改 clickhouse 的 config.xml

把默认的<path>/var/lib/clickhouse/</path>
改为<path>/mnt/goofys</path>

  1. 重启 clickhouse server
  1. 验证(略)
  2. 测试

与 JuiceFS 一样,成功,因为都是做本地盘使用,所以可以支持更多引擎

CREATE TABLE test(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)ENGINE = EmbeddedRocksDB PRIMARY KEY key

总结

结果如下,

  • s3fs(部分失败)
  • Juicefs(成功)
  • Goofys(成功)

目前只是做了初步尝试, 也为更多本地应用入云做个尝试。

参考资料


[1]

s3fs: https://github.com/s3fs-fuse/s3fs-fuse

[2]

利用 S3fs 在 Amazon EC2 Linux 实例上挂载 S3 存储桶: https://aws.amazon.com/cn/blogs/china/s3fs-amazon-ec2-linux/

[3]

JuiceFS: https://github.com/juicedata/juicefs

[4]

Goofys: https://github.com/kahing/goofys



欢迎关注公众号

有兴趣加群讨论数据挖掘和分析的朋友可以加我微信(witwall),暗号:入群

也欢迎投稿!


文章转载自alitrack,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论