云服务器内容精选

  • 场景说明 假定用户开发一个网站系统,test_tbl用于实时用户访问网站的记录,记录数据如下表: 表1 原始数据 timestamp type error_code error_msg op_id op_time 2024-06-04 10:36:00 1 404 Resource Not Found 998756 2024-06-04 11:36:00 2024-06-04 10:35:00 1 404 Resource Not Found 998756 2024-06-04 11:35:00 2024-06-03 10:33:00 1 404 Resource Not Found 998756 2024-06-03 11:33:00 2024-03-27 09:10:00 1 200 ok 998756 2024-03-27 10:10:00 2024-03-25 11:08:00 1 404 Resource Not Found 998756 2024-03-25 12:08:00
  • Distributed表引擎 Distributed表引擎本身不存储任何数据,而是作为数据分片的透明代理,能够自动路由数据到集群中的各个节点,分布式表需要和其他本地数据表一起协同工作。分布式表会将接收到的读写任务分发到各个本地表,而实际上数据的存储在各个节点的本地表中。 图2 Distributed Distributed表引擎创建模板: ENGINE = Distributed(cluster_name, database_name, table_name, [sharding_key]) 表6 Distributed表参数说明 参数 说明 cluster_name 集群名称,在对分布式表执行读写的过程中,使用集群的配置信息查找对应的ClickHouse实例节点。 database_name 数据库名称。 table_name 数据库下对应的本地表名称,用于将分布式表映射到本地表上。 sharding_key 分片键(可选参数),分布式表会按照这个规则,将数据分发到各个本地表中。 使用示例。 先创建一个表名为demo的ReplicatedMergeTree本地表。 CREATE TABLE default.demo ON CLUSTER default_cluster( `EventDate` DateTime, `id` UInt64)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/demo', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY id; 基于本地表demo创建表名为demo_all的Distributed表。 CREATE TABLE default.demo_all ON CLUSTER default_cluster( `EventDate` DateTime, `id` UInt64)ENGINE = Distributed(default_cluster, default, demo, rand()); 分布式表创建规则。 创建Distributed表时需加上on cluster cluster_name,这样建表语句在某一个ClickHouse实例上执行一次即可分发到集群中所有实例上执行。 分布式表通常以本地表加“_all”命名。它与本地表形成一对多的映射关系,之后可以通过分布式表代理操作多张本地表。 分布式表的表结构尽量和本地表的结构一致。如果不一致,在建表时不会报错,但在查询或者插入时可能会抛出异常。
  • VersionedCollapsingMergeTree 为了解决CollapsingMergeTree表引擎乱序写入导致无法正常折叠(删除)问题,云数据库ClickHouse提供了VersionedCollapsingMergeTree表引擎,在建表语句中新增一列Version,用于在乱序情况下记录状态行与取消行的对应关系。后台Compaction时会将主键相同、Version相同、Sign相反的行折叠(删除)。 建表语句。 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = VersionedCollapsingMergeTree(sign, version) [PARTITION BY expr] [ORDER BY expr] [SAMPLE BY expr] [SETTINGS name=value, ...]
  • AggregatingMergeTree AggregatingMergeTree表引擎也是预先聚合引擎的一种,用于提升聚合计算的性能。 建表语句。 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = AggregatingMergeTree() [PARTITION BY expr] [ORDER BY expr] [SAMPLE BY expr] [TTL expr] [SETTINGS name=value, ...]
  • Replicated*MergeTree引擎 ClickHouse中的所有MergeTree家族引擎前面加上Replicated就成了支持副本的合并树引擎。 图1 合并树引擎图 Replicated表引擎的创建模板: ENGINE = Replicated*MergeTree('ZooKeeper存储路径','副本名称', ...) 表5 参数表 参数 说明 ZooKeeper存储路径 ZooKeeper中该表相关数据的存储路径,建议规范化,如:/clickhouse/tables/{shard}/数据库名/表名。 副本名称 一般用{replica}即可。
  • SummingMergeTree SummingMergeTree表引擎用于对主键列进行预先聚合,将所有相同主键的行合并为一行,从而大幅度降低存储空间占用,提升聚合计算性能。 建表语句。 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = SummingMergeTree([columns]) [PARTITION BY expr] [ORDER BY expr] [SAMPLE BY expr] [SETTINGS name=value, ...] 使用示例。 创建一个SummingMergeTree表testTable。 CREATE TABLE testTable(id UInt32,value UInt32)ENGINE = SummingMergeTree() ORDER BY id; testTable表中插入数据。 INSERT INTO testTable Values(5,9),(5,3),(4,6),(1,2),(2,5),(1,4),(3,8); INSERT INTO testTable Values(88,5),(5,5),(3,7),(3,5),(1,6),(2,6),(4,7),(4,6),(43,5),(5,9),(3,6); 在未合并parts查询所有数据。 SELECT * FROM testTable; 查询结果。 ┌─id─┬─value─┐ │ 1 │ 6 │ │ 2 │ 5 │ │ 3 │ 8 │ │ 4 │ 6 │ │ 5 │ 12 │ └────┴───────┘ ┌─id─┬─value─┐ │ 1 │ 6 │ │ 2 │ 6 │ │ 3 │ 18 │ │ 4 │ 13 │ │ 5 │ 14 │ │ 43 │ 5 │ │ 88 │ 5 │ └────┴───────┘ ClickHouse还没有汇总所有行,需要通过ID进行汇总聚合,需要用到sum和GROUP BY子句。 SELECT id, sum(value) FROM testTable GROUP BY id; 查询结果。 ┌─id─┬─sum(value)─┐ │ 4 │ 19 │ │ 3 │ 26 │ │ 88 │ 5 │ │ 2 │ 11 │ │ 5 │ 26 │ │ 1 │ 12 │ │ 43 │ 5 │ └────┴────────────┘ 手工执行合并操作。 OPTIMIZE TABLE testTable; 查询表数据。 SELECT * FROM testTable; 查询结果。 ┌─id─┬─value─┐ │ 1 │ 12 │ │ 2 │ 11 │ │ 3 │ 26 │ │ 4 │ 19 │ │ 5 │ 26 │ │ 43 │ 5 │ │ 88 │ 5 │ └────┴───────┘ SummingMergeTree根据ORDER BY排序键作为聚合数据的条件Key。即如果排序key是相同的,则会合并成一条数据,并对指定的合并字段进行聚合。 后台执行合并操作时才会进行数据的预先聚合,而合并操作的执行时机无法预测,所以可能存在部分数据已经被预先聚合、部分数据尚未被聚合的情况。因此,在执行聚合计算时,SQL中仍需要使用GROUP BY子句。
  • ReplacingMergeTree 为了解决MergeTree表引擎相同主键无法去重的问题,云数据库ClickHouse提供了ReplacingMergeTree表引擎,用于删除主键值相同的重复项。 建表语句。 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = ReplacingMergeTree([ver]) [PARTITION BY expr] [ORDER BY expr] [SAMPLE BY expr] [SETTINGS name=value, ...]
  • CollapsingMergeTree CollapsingMergeTree表引擎用于消除ReplacingMergeTree表引擎的功能限制。该表引擎要求在建表语句中指定一个标记列Sign,按照Sign的值将行分为两类:Sign=1的行称为状态行,用于新增状态。Sign=-1的行称为取消行,用于删除状态。 建表语句。 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = CollapsingMergeTree(sign) [PARTITION BY expr] [ORDER BY expr] [SAMPLE BY expr] [SETTINGS name=value, ...]
  • MergeTree 建表语法。 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], ... INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1, INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2 ) ENGINE = MergeTree() ORDER BY expr [PARTITION BY expr] [PRIMARY KEY expr] [SAMPLE BY expr] [TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...] [SETTINGS name=value, ...] 使用示例。 CREATE TABLE default.test (name1 DateTime,name2 String,name3 String,name4 String,name5 Date) ENGINE = MergeTree() PARTITION BY toYYYYMM(name5) ORDER BY (name1, name2) SETTINGS index_granularity = 8192; 示例参数说明: 表2 参数说明 参数 说明 ENGINE = MergeTree() MergeTree表引擎。 PARTITION BY toYYYYMM(name5) 分区,示例数据将以月份为分区,每个月份一个文件夹。 ORDER BY 排序字段,支持多字段的索引排序,第一个相同的时候按照第二个排序依次类推。 index_granularity = 8192 排序索引的颗粒度,每8192条数据记录一个排序索引值。 如果被查询的数据存在于分区或排序字段中,能极大降低数据查找时间。
  • 概述 表引擎即表的类型,在云数据库ClickHouse中决定了如何存储和读取数据、是否支持索引、是否支持主备复制等。云数据库ClickHouse支持的表引擎,请参见下表。 MergeTree引擎为单副本,无法保证高可用和数据可靠性,建议只在测试环境中使用。Replicated*MergeTree引擎用于生产环境。 表1 表引擎 系列 描述 表引擎 特点 MergeTree MergeTree系列引擎适用于高负载任务,支持大数据量的快速写入并进行后续的数据处理,通用程度高且功能强大。 该系列引擎的共同特点是支持数据副本、分区、数据采样等特性。 MergeTree 基于分区键(partitioning key)的数据分区分块存储。 数据索引排序(基于primary key和order by)。 支持数据复制(带Replicated前缀的表引擎)。 支持数据抽样。 在写入数据时,该系列引擎表会按照分区键将数据分成不同的文件夹,文件夹内每列数据为不同的独立文件,以及创建数据的序列化索引排序记录文件。该结构使得数据读取时能够减少数据检索时的数据量,极大的提高查询效率。 RelacingMergeTree 用于解决MergeTree表引擎相同主键无法去重的问题,可以删除主键值相同的重复项。 CollapsingMergeTree CollapsingMergeTree它通过定义一个sign标记位字段记录数据行的状态。如果sign标记为1,则表示这是一行有效的数据。如果sign标记为-1,则表示这行数据需要被删除。 VersionedCollapsingMergeTree 在建表语句中新增Version列,用于解决CollapsingMergeTree表引擎乱序写入导致无法正常折叠(删除)的问题。 SummigMergeTree 用于对主键列进行预先聚合,将所有相同主键的行合并为一行,从而大幅度降低存储空间占用,提升聚合计算性能。 AggregatingMergeTree AggregatingMergeTree是预先聚合引擎的一种,用于提升聚合计算的性能。AggregatingMergeTree引擎能够在合并分区时,按照预先定义的条件聚合数据,同时根据预先定义的聚合函数计算数据并通过二进制的格式存入表内。 GraphiteMergeTree 用于存储Graphite数据并进行汇总,可以减少存储空间,提高Graphite数据的查询效率。 Replicated*MergeTree ClickHouse中的所有MergeTree家族引擎前面加上Replicated就成了支持副本的合并树引擎。 Replicated*MergeTree系列 Replicated系列引擎借助ZooKeeper实现数据的同步,创建Replicated复制表时通过注册到ZooKeeper上的信息实现同一个分片的所有副本数据进行同步。 Distributed - Distributed 本身不存储数据,可以在多个服务器上进行分布式查询。
  • 查看权限 登录 表格存储服务 管理控制台。 单击管理控制台左上角的,选择区域。 单击左侧集群管理,显示当前集群列表,选择需要操作的集群,进入用户管理页面。 单击操作列“查看权限”,弹出用户权限页面。 表2 查看权限 参数 说明 用户名 新建的用户名。 全局权限 查询、插入、更改、创建、删除。 各级权限 数据库和表:创建的数据库和表。 高危权限:创建表、删除表。 普通权限:查询、插入、更改。 支持查看账户对数据库的操作权限。
  • ClickHouse监控指标 表1 ClickHouse 指标名称 显示名 含义 指标最小单位 监控周期 cpu_usage CPU使用率 每个节点的CPU使用率。 % 60 memory_usage 内存使用量 每个节点的内存使用量。 Byte 60 memory_usage_ratio 内存使用率 每个节点的内存使用率。 % 60 disk_usage 磁盘使用量 每个节点的磁盘使用量。 Byte 60 disk_usage_ratio 磁盘使用率 每个节点的磁盘使用率。 % 60 network_throughput_inbound_rate 网络吞吐流入速率 每个节点每秒的网络流入数据量。 Byte/s 60 network_throughput_outgoing_rate 网络吞吐流出速率 每个节点每秒的网络流出数据量。 Byte/s 60 clickhouse_process_survival ClickHouse进程存活 clickhouse进程心跳检查。 - 60 number_of_mutations Mutation个数 每个节点正在运行的修改任务数。 Count 60 number_of_run_merges 运行Merge个数 正在运行的合并任务个数。 Count 60 number_of_merges_thread Merge中线程个数 正在合并中的线程数量。 Count 60 number_of_zookeeper_requests ZK请求数 当前时间节点请求ZK的请求数。 Count 60 number_of_zk_session ZK的session个数 当前时间节点连接ZK的session个数。 Count 60 number_of_zookeeper_watches ZK watch个数 当前时间节点连接ZK watch个数。 Count 60 number_of_zookeeper_nodes Zookeeper中节点数 Zookeeper中创建临时的节点数。 Count 60 number_of_parts part数量 part数量。 Count 60 clickhouse_zookeeper_disconnection zookeeper连接状态 zookeeper连接状态。 - 60 number_of_threads_holding_read_locks 持有读锁的线程数 持有读锁的线程数。 Count 60 number_of_threads_waiting_to_be_read 等待读的线程数 等待读的线程数。 Count 60 number_of_threads_waiting_to_be_written 等待写的线程数 等待写的线程数。 Count 60 number_of_threads_holding_write_locks 持有写锁的线程数 持有写锁的线程数。 Count 60 number_of_active_tasks_background_processing_pool 后台处理池中活跃任务数 后台处理池中活跃任务数。 Count 60 maximum_number_of_active_blocks 最大活跃分块数 clickhouse实例最大的活跃分块个数。 Count 60 number_of_consistency_checkdata_blocks 一致性校验数据分块数 clickhouse实例一致性校验数据分块个数。 Count 60 extracting_the_number_of_data_chunks_from_the_replica 正在从副本中提取数据分块数 clickhouse实例正在从副本中提取的数据分块个数。 Count 60 number_of_data_chunks_being_sent_to_the_replica 正在发送到副本的数据分块数 clickhouse实例正在发送到副本的数据分块个数。 Count 60 number_of_readonly_replicas 只读副本个数 此指标反映了clickhouse实例中只读副本数。 Count 60 number_of_inserted_into_all_tables 插入行数 clickhouse实例中所有表插入行数。 Count 60 number_of_open_read_files 读文件打开数 clickhouse实例上的读文件打开数。 Count 60 number_of_open_write_files 写文件打开数 clickhouse实例上的写文件打开数。 Count 60 total_file_opens 文件打开总数 clickhouse实例上的文件打开数。 Count 60 number_of_read_file_descriptors 文件描述符读个数 文件描述符读个数。 Count 60 number_of_written_file_descriptors 文件描述符写个数 文件描述符写个数。 Count 60 instance_process_running_duration 实例进程运行时长 clickhouse实例进程运行时长。 s 60 number_of_threads_running_in_global_thread_pool 全局线程池中运行任务的线程数 clickhouse实例上的全局线程池中运行任务的线程数。 Count 60 number_of_threads_in_global_thread_pool 全局线程池中线程数 clickhouse实例上的全局线程池中线程数。 Count 60 number_of_threads_in_local_thread_pool 本地线程池中的线程数 clickhouse实例上的本地线程池中的线程数。 Count 60 number_of_threads_waiting_locked Context中等待加锁的线程数 clickhouse实例上的context中等待加锁的线程数。 Count 60 number_of_threads_running_in_local_thread_pool 本地线程池中运行任务的线程数 clickhouse实例上的本地线程池中运行任务的线程数。 Count 60 number_of_tcp_connections TCP连接数 TCP协议连接个数。 Count 60 number_of_http_connections HTTP连接数 HTTP协议连接个数。 Count 60 number_of_databases 数据库数量 每个节点数据库数量。 Count 60 number_of_tables 表数量 每个节点本地表数量。 Count 60 write_size_per_second 每秒写入大小 每个节点单位时间写入的数据量。 Byte 60 number_of_running_queries 运行Query个数 每个节点正在运行的查询个数。 Count 60 number_of_query_threads Query线程数 每个节点正在运行的查询线程数。 Count 60 number_of_distributed_ddls 分布式DDL个数 分布式DDL语句的个数。 Count 60 number_of_distributed_table_files 分布式表文件个数 向分布式表写数据时待插入数据的文件个数。 Count 60 number_of_concurrency ClickHouse各节点并发度 当前ClickHouse各节点的并发度。 Count 60 zookeeper_quota_percentage ZooKeeper数量配额百分比 ClickHouse服务在ZooKeeper上目录的数量配额使用百分比。 % 60 zookeeper_process_is_alive zookeeper进程存活 zookeeper心跳检查,1表示正常,0表示异常。 - 60 number_of_global_sessions 全局session个数 当前全局的session个数。 Count 60 number_of_rejected_connections 拒绝连接个数 zookeeper拒绝连接的个数。 Count 60 number_of_request_submission_queues 请求提交队列个数 请求提交队列个数。 Count 60 waiting_time_of_the_preprocessing_queue 预处理队列等待时间 预处理队列等待时间。 s 60 number_of_zk_watches ZK_watch个数 当前时间ZK_watch个数。 Count 60 zk_heapmemory_usage ZooKeeper使用的堆内存大小 ZooKeeper使用的堆内存大小。 Byte 60 zk_directmemory_usage ZooKeeper使用的直接内存 ZooKeeper使用的直接内存。 Byte 60 zk_heapmemory_usage_ratio ZooKeeper堆内存使用率 ZooKeeper堆内存使用百分比统计。 % 60 zk_directmemory_usage_ratio ZooKeeper直接内存使用率 ZooKeeper直接内存使用百分比统计。 % 60 cluster_number_of_sent_packets zookeeper发包个数 zookeeper节点发送的packet个数。 Count 60 cluster_number_of_received_packets zookeeper收包个数 zookeeper节点接收的packet个数。 Count 60 cluster_preprocessing_time 预处理时间 单位时间内预处理时间。 s 60 rows_written_per_second 每秒写入行数 每个节点单位时间写入的行数。 Count 60 number_of_failed_queries 失败Query个数 失败的query语句个数。 Count 60 number_of_failed_insert_queries 失败Insert Query个数 失败的插入语句个数。 Count 60 number_of_failed_select_query_messages 失败Select Query个数 失败的select语句个数。 Count 60 number_of_delayed_inserts delayed inserts个数 每个节点延迟插入个数。 Count 60 number_of_rows 字段数量 每个节点mergetree引擎字段数量。 Count 60 disk_throughput_read_rate 磁盘吞吐读速率 磁盘读取吞吐速率。 Byte 60 disk_throughput_write_rate 磁盘吞吐写速率 磁盘写入吞吐速率。 Byte 60 cmdForUsedStorageRate 已用存储空间比率 统计测量对象所在集群的已用存储空间大小占总配额的比率。 % 60
  • 注意事项 每个数据表只能绑定一个任务。一个集群仅支持一个执行中的任务。 本地表的数据库必须为atomic(默认)或ordinary,且表类型为Mergetree家族系列引擎的表(包括非复制表和复制表,不支持物化视图表)。 本地表副本关系和cluster一致,有分布式表作为分片之间的关系。 数据迁移过程中原表默认为只读状态。 数据迁移的时候数据首先会保存在临时表中,执行的时候用迁移的数据表替换原表,该过程中可能读取到错误的数据,切换时间为秒级。 数据迁移过程中可能由于集群问题导致此过程暂停,根据报错集群修复继续执行任务。 数据迁移的时候,源节点和重分布节点必须存在相同表,这样才可以进行数据迁移。 单节点不支持数据迁移。
  • 数据迁移新建任务 登录 表格存储 服务管理控制台。 单击管理控制台左上角的,选择区域。 单击集群管理,选择集群进入集群详情页面。 单击数据迁移进入数据迁移管理页面。 表1 数据迁移参数说明 参数 说明 任务ID/名称 新建迁移任务ID/名称。 逻辑集群 选取的逻辑集群名称。 源节点 数据存放的节点。 重分布节点 数据分布的节点。 状态/进度 数据分布的状态/进度。 状态:初始化、运行中、已完成。 创建时间 创建数据任务的时间。 执行开始时间 启动数据任务的时间。 更新时间 修改数据任务的时间。 操作 启动:启动数据任务。 修改:修改任务信息。 取消:取消迁移任务。 详情:任务详情页面。 删除:删除任务。 单击左上角“新建任务”。 用户自定义任务名称(以字母开头)。 选择逻辑集群。 选择迁移百分比。 选择源节点。 选择重分布节点。 选择迁移的数据表。 选择后单击确定,完成新建任务。 单击操作列“启动”,任务启动。
  • 前提条件 当集群状态处于“服务中”,且没有任何任务操作(如:水平扩容、磁盘扩容等)时,可以执行变更操作。 规格变更只支持从小规格变更为大规格,如果要大规格更改为小规格,建议新建小规格集群,采用数据迁移进行切换。 一次只支持变更一种类型的节点规格(计算节点、ZooKeeper节点),且变更完成后只生效所选类型的节点规格。 规格变更过程中,整个集群不可用,变更结束前不能再次变更。 规格变更过程中系统不可用。