Skip to main content

前期配置

配置文件

sudo vim /etc/clickhouse-server/config.xml

多磁盘配置

https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree

冷热分离存储

https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree

https://clickhouse.com/docs/en/guides/developer/ttl

在MergeTree下方有详细的说明,我这边只是说下生成中相对实用一点的东西。

处理大量数据时的常见做法是随着数据的老化而移动这些数据。TO DISK以下是使用命令的和TO VOLUME子句在 ClickHouse 中实现热/温/冷架构的步骤TTL。(顺便说一句,它不一定是一个冷热的事情 - 您可以使用 TTL 来移动数据以满足您的任何用例。)

  1. 选项是指 ClickHouse 配置文件中定义TO DISK的TO VOLUME磁盘或卷的名称。创建一个名为my_system.xml(或任何文件名)的新文件来定义您的磁盘,然后定义使用您的磁盘的卷。放置 XML 文件/etc/clickhouse-server/config.d/storage.xml以将配置应用到您的系统:
<clickhouse>
<storage_configuration>
<disks>
<default>
</default>
<hot_disk>
<path>./hot/</path>
</hot_disk>
<warm_disk>
<path>./warm/</path>
</warm_disk>
<cold_disk>
<path>./cold/</path>
</cold_disk>
</disks>
<policies>
<default>
<volumes>
<default>
<disk>default</disk>
</default>
<hot_volume>
<disk>hot_disk</disk>
</hot_volume>
<warm_volume>
<disk>warm_disk</disk>
</warm_volume>
<cold_volume>
<disk>cold_disk</disk>
</cold_volume>
</volumes>
</default>
</policies>
</storage_configuration>
</clickhouse>

实战配置

<yandex>
<storage_configuration>
<disks>
<default>
<keep_free_space_bytes>1024</keep_free_space_bytes>
</default>
<vdb>
<path>/data/vdb/</path>
</vdb>
<vdc>
<path>/data/vdc/</path>
</vdc>
</disks>
<policies>
<storage>
<volumes>
<hot_volume>
<disk>vdc</disk>
<max_data_part_size_bytes>29000000</max_data_part_size_bytes>
</hot_volume>
<cold_volume>
<disk>vdb</disk>
</cold_volume>
</volumes>
</storage>
</policies>
</storage_configuration>
</yandex>


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 = 'storage'

#官网配置
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 = 'moving_from_ssd_to_hdd'

max_data_part_size_bytes 可存储在任何卷磁盘上的部分的最大大小。如果合并部分的大小估计大于max_data_part_size_bytes则该部分将被写入下一卷。基本上,此功能允许将新/小部件保留在热(SSD)卷上,并在它们达到大尺寸时将它们移动到冷(HDD)卷。如果您的策略只有一个卷,请勿使用此设置。

  1. 上面的配置引用了三个磁盘,它们指向 ClickHouse 可以读取和写入的文件夹。卷可以包含一个或多个磁盘 - 我们为三个磁盘中的每一个定义了一个卷。我们来看看磁盘:
SELECT name, path, free_space, total_space
FROM system.disks
┌─name────────┬─path───────────┬───free_space─┬──total_space─┐
│ cold_disk │ ./data/cold/ │ 179143311360494384795648
│ default │ ./ │ 179143311360494384795648
│ hot_disk │ ./data/hot/ │ 179143311360494384795648
│ warm_disk │ ./data/warm/ │ 179143311360494384795648
└─────────────┴────────────────┴──────────────┴──────────────┘
  1. 并且......让我们验证一下数量:
SELECT
volume_name,
disks
FROM system.storage_policies
┌─volume_name─┬─disks─────────┐
│ default │ ['default']
│ hot_volume │ ['hot_disk']
│ warm_volume │ ['warm_disk']
│ cold_volume │ ['cold_disk']
└─────────────┴───────────────┘
  1. 现在我们将添加一条TTL在热卷、温卷和冷卷之间移动数据的规则:
ALTER TABLE my_table
MODIFY TTL
trade_date TO VOLUME 'hot_volume',
trade_date + INTERVAL 2 YEAR TO VOLUME 'warm_volume',
trade_date + INTERVAL 4 YEAR TO VOLUME 'cold_volume';
  1. 新TTL规则应该会实现,但您可以强制它确保:
ALTER TABLE my_table
MATERIALIZE TTL
  1. 使用表验证您的数据已移动到预期的磁盘system.parts:
Using the system.parts table, view which disks the parts are on for the crypto_prices table:

SELECT
name,
disk_name
FROM system.parts
WHERE (table = 'my_table') AND (active = 1)

响应将如下所示:

┌─name────────┬─disk_name─┐
│ all_1_3_1_5 │ warm_disk │
│ all_2_2_0 │ hot_disk │
└─────────────┴───────────┘

触发TTL的条件

过期行的删除或聚合不是立即进行的 - 它仅在表合并期间发生。如果您有一个未主动合并的表(无论出于何种原因),则有两种设置可以触发 TTL 事件:

  • merge_with_ttl_timeout:使用删除 TTL 重复合并之前的最短延迟(以秒为单位)。默认值为 14400 秒(4 小时)。
  • merge_with_recompression_ttl_timeout:使用重新压缩 TTL 重复合并之前的最短延迟(以秒为单位)(在删除之前汇总数据的规则)。默认值:14400 秒(4 小时)。

因此,默认情况下,您的 TTL 规则将至少每 4 小时应用于您的表一次。如果您需要更频繁地应用 TTL 规则,只需修改上述设置即可。

这不是一个很好的解决方案(或者我们建议您经常使用的解决方案),但您也可以使用以下命令强制合并OPTIMIZE:

 OPTIMIZE TABLE example1 FINAL;

OPTIMIZE初始化表各部分的计划外合并,FINAL如果表已经是单个部分,则强制重新优化。

用户配置

https://clickhouse.com/docs/en/operations/settings/settings-users

sudo vi /etc/clickhouse-server/users.xml

工具连接

jdbc:clickhouse://ip地址:8123/default?socket_timeout=3000000

users配置文件的部分包含user.xml用户设置。

<users>
<!-- If user name was not specified, 'default' user is used. -->
<user_name>
<password></password>
<!-- Or -->
<password_sha256_hex></password_sha256_hex>

<access_management>0|1</access_management>

<networks incl="networks" replace="replace">
</networks>

<profile>profile_name</profile>

<quota>default</quota>
<default_database>default</default_database>
<databases>
<database_name>
<table_name>
<filter>expression</filter>
</table_name>
</database_name>
</databases>

<grants>
<query>GRANT SELECT ON system.*</query>
</grants>
</user_name>
<!-- Other users settings -->
</users>
  • 密码可以以明文或 SHA256(十六进制格式)指定。要以明文形式分配密码(不推荐),请将其放置在password元素中。例如,qwerty. 密码可以留空。要使用 SHA256 哈希值分配密码,请将其放置在password_sha256_hex元素中。例如,<password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex>. 如何从 shell 生成密码的示例:
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'

结果的第一行是密码。第二行是相应的 SHA256 哈希值。

  • 为了与 MySQL 客户端兼容,可以使用双 SHA1 哈希值指定密码。将其放置在password_double_sha1_hex元素中。

例如,<password_double_sha1_hex>08b4a0f1de6ad37da17359e592c8d74788a83eb0</password_double_sha1_hex>.

如何从 shell 生成密码的示例:

PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'

结果的第一行是密码。第二行是对应的双 SHA1 哈希值。

  • access_management: 此设置启用或禁用用户使用 SQL 驱动的访问控制和帐户管理。

可能的值:

0 — 禁用。 1 — 启用。 默认值:0。

此设置允许向选定的用户授予任何权限。列表中的每个元素都应该GRANT在没有指定任何受让人的情况下进行查询。

例子:

<user1>
<grants>
<query>GRANT SHOW ON *.*</query>
<query>GRANT CREATE ON *.* WITH GRANT OPTION</query>
<query>GRANT SELECT ON system.*</query>
</grants>
</user1>

激活指定配置

https://clickhouse.com/docs/en/operations/settings/settings-profiles