本文为您介绍 ClickHouse 集群的相关高阶特性。
已创建火山引擎 E-MapReduce(EMR)包含 ClickHouse 的集群类型。详见快速开始。
您可以在 ClickHouse 服务参数配置页面,查看或修改配置。该步骤将在 ClickHouse 集群中,创建名为 test 的用户,其中 users 配置在 server-users 配置文件中。
登录 EMR 控制台。
左侧导航栏单击集群列表 > 集群详情 > 服务列表 > ClickHouse 服务 > 服务参数,进入 ClickHouse 服务参数页面,单击添加自定义参数按钮。
在添加自定义参数窗口中,配置文件参数下拉选择 server-users 配置文件,并添加以下参数:
## test 为用户名 users.test.profile ## test 用户默认使用的 profile 名称,这里使用 default profile users.test.quota ## test 用户默认使用的 quota 配置,这里使用 default quota users.test.password ## test 用户的密码,这里使用123456当做临时密码 users.test.networks.ip ## 网络配置, ip设置 ::/0, 其他为空, 表示任意IP都能接入 users.test.networks.host_regexp ##允许访问的主机名正则表达式,默认为空。 users.test.networks.host ##允许访问的主机名,默认为空。
最后配置参数结果如下:
参数配置完成后,单击右上角服务操作 > 重启按钮,重启 ClickHouse 节点,并通过远程登录方式,登录 Core 节点查看 /etc/emr/clickhouse/users.xml 配置,确认是否已经有 test 存在。登录方式详见快速开始。
执行以下命令查看配置文件:
cat /etc/emr/clickhouse/users.xml
确认用户存在后,执行如下命令,启动 ClickHouse 客户端,使用新用户和密码直接登录:
clickhouse-client --user test --password 123456
ClickHouse 存储的数据通常来说比较实时,历史的数据使用频率会越来越低,甚至某些情况下,不会对于老数据进行访问,因此对 ClickHouse 表数据进行生命周期的管理,能够有效的降低集群存储的成本。
ClickHouse 目前同时支持 Table 和 Column 级别的 TTL 设置,同时 ClickHouse 也支持多种类型的数据操作。
下面以 Table 的 TTL 为例介绍 ClickHouse 的生命周期功能:
CREATE TABLE example_table ( d DateTime, a Int ) ENGINE = MergeTree PARTITION BY toYYYYMM(d) ORDER BY d TTL d + INTERVAL 1 MONTH DELETE, d + INTERVAL 1 WEEK TO VOLUME 'aaa', d + INTERVAL 2 WEEK TO DISK 'bbb';
上述的例子中,定义了一张 MergeTree 的表,它的数据会按照时间进行迁移:
超过 1月 的数据,会被直接删除掉,默认行为。
说明
推荐您使用 DELTE 模式,其他模式需要人工进行管理磁盘容量。
超过 1周 的数据,会被移动到 VOLUME 'aaa';
超过 2周 的数据,会被移动到 DISK 'bbb'。
更多信息,查看官方文档
对于某些 ClickHouse 的数据表,依然还会有低频的查询历史数据的场景,此时不能直接使用 TTL 删除数据,那么此时可以用冷热分层的设置来减少存储成本。在火山云上,我们推荐使用 TOS 作为冷存存储。
注意
冷热分层目前仅支持 EMR-3.1.0 及以上集群。
左侧导航栏单击集群列表 > 集群详情 > 服务列表 > ClickHouse 服务 > 服务参数,进入 ClickHouse 服务参数页面。
在服务参数界面,单击选择"server-metrika"配置文件。
在"storage_configuration"参数名称中修改 CoreGroup 的配置,添加以下两段配置:
我们需要建一个 TOS 的 disk:
<storage_configuration> ... <disks> <tos> <type>s3</type> <endpoint></endpoint> <access_key_id>your_access_key_id</access_key_id> <secret_access_key>your_secret_access_key</secret_access_key> <region></region> <connect_timeout_ms>10000</connect_timeout_ms> <request_timeout_ms>5000</request_timeout_ms> <retry_attempts>10</retry_attempts> <single_read_retries>4</single_read_retries> <min_bytes_for_seek>1000</min_bytes_for_seek> <metadata_path>/var/lib/clickhouse/disks/s3/</metadata_path> <cache_enabled>true</cache_enabled> <cache_path>/var/lib/clickhouse/disks/s3/cache/</cache_path> <skip_access_check>false</skip_access_check> </tos> </disks> ... </storage_configuration>
说明
Endpoint 使用火山的 TOS 的话,配置项需要符合以下的要求:
必须使用 http 协议。
必须使用 [bucket-name] + [TOS S3 类型的 Endpoint] + [key] 的形式
必须以"/"结尾
样例: http://emr-hzw.tos-s3-cn-beijing.ivolces.com/ClickHouse/
TOS Endpoint 参考 官方文档。
region:以实际区域填写,例如 cn-beijing。
创建一个 Storage policy:
<storage_configuration> <policies> <tos_cold> <volumes> <main> <disk>default</disk> </main> <external> <disk>tos</disk> </external> </volumes> <move_factor>0.2</move_factor> </tos_cold> </policies> </storage_configuration>
下面是 XML 的模板,其中:endpoint、access_key_id、secret_access_key、region、move_factor 这5个参数为关键信息,需根据配置不同而修改:
<disks> <disk1> <path>/data01/clickhouse/</path> <keep_free_space_bytes>10485760</keep_free_space_bytes> </disk1> <tos> <type>s3</type> <endpoint>http://emr.tos-s3-cn-beijing.ivolces.com/Clickhouse-emr/</endpoint> <access_key_id>AK</access_key_id> <secret_access_key>SK</secret_access_key> <region>cn-beijing</region> <connect_timeout_ms>10000</connect_timeout_ms> <request_timeout_ms>5000</request_timeout_ms> <retry_attempts>10</retry_attempts> <single_read_retries>4</single_read_retries> <min_bytes_for_seek>1000</min_bytes_for_seek> <metadata_path>/var/lib/clickhouse/disks/s3/</metadata_path> <cache_enabled>true</cache_enabled> <cache_path>/var/lib/clickhouse/disks/s3/cache/</cache_path> <skip_access_check>false</skip_access_check> </tos> </disks> <policies> <default> <volumes> <single> <disk>disk1</disk> </single> </volumes> </default> <tos_cold> <volumes> <main> <disk>disk1</disk> </main> <external> <disk>tos</disk> </external> </volumes> <move_factor>0.1</move_factor> </tos_cold> </policies>
CREATE TABLE table_with_non_default_policy ( EventDate Date, OrderID UInt64, BannerID UInt64, SearchPhrase String ) ENGINE = MergeTree ORDER BY (OrderID, BannerID) PARTITION BY toYYYYMM(EventDate) SETTINGS storage_policy = 'tos_cold'
insert into table_with_non_default_policy select '2022-09-09', rand(), rand(), 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' from numbers(100000000);
更多信息,参考官方文档