ClickHouse案例:查询结果不一致 您所在的位置:网站首页 sql两次数据不一致怎么处理出来 ClickHouse案例:查询结果不一致

ClickHouse案例:查询结果不一致

2024-07-02 02:34| 来源: 网络整理| 查看: 265

问题背景

某用户反馈其使用的ClickHouse集群同样的查询返回了不同的结果,是否是ClickHouse数据不能够保证一致性,还是集群有问题。

对于数据库来说,查询数据的准确性至关重要,我查询确定的数据你给我返回不一致的结果,那这结果还有何可用性而言,因此这个问题对用户的重要性不言而喻。

在收到用户反馈的这个问题后,第一时间和用户确认了用户具体的使用情况。

在集群中的各个节点创建本地表,表引擎为Kafka同时创建了对应的视图(消费Kafka里的数据);创建分布式表,表引擎Distributed,汇总视图;多次执行同一条查询返回了不一致的结果。

查询数据是通过分布式表来进行的,要想弄清楚为何每次查询返回的数据不一致,首先就需要弄清楚分布式表的原理。

分布式表

具有分布式引擎的表本身不存储任何数据,但可以在多个节点上进行分布式查询。读取会自动并行化进行,无需参数配置或手动干预。 查询时随机选择某个shard的replica进行读取。如果表有索引优先使用索引。

分布式引擎参数:服务器配置文件中的集群名,远程数据库名,远程表名,数据分片键(可选)。

代码语言:txt复制Distributed(logs, default, hits[, sharding_key])

查询时将从集群中每个服务器上的default.hits表中读取数据。

本文示例的集群配置如下:

代码语言:txt复制 false 10.0.3.27 9000 10.0.3.41 9000 true 10.0.3.46 9000 10.0.3.26 9000 10.0.3.12 2181 10.0.3.3 2181 10.0.3.23 2181

集群名:default_cluster,包括两个分片,每个分片两个副本。

分片:各个分片(服务器)包含不同的数据(为了读取所有数据,必须访问所有分片)。

副本:多个相同冗余的服务器(读取数据时可以访问任何一个副本上的数据)。

当指定了副本时,读取的操作将为每个分片选择一个可用副本。也可以配置用于负载均衡的算法(访问副本的首选项(load_balancing = random/nearest_hostname/first_or_random/round_robin)–具体参阅官方文档load_balancing设定。

问题复现

集群:

代码语言:txt复制┌─cluster─────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address─┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐ │ default_cluster │ 1 │ 1 │ 1 │ 10.0.3.27 │ 10.0.3.27 │ 9000 │ 1 │ default │ │ 0 │ 0 │ │ default_cluster │ 1 │ 1 │ 2 │ 10.0.3.41 │ 10.0.3.41 │ 9000 │ 0 │ default │ │ 0 │ 0 │ │ default_cluster │ 2 │ 1 │ 1 │ 10.0.3.46 │ 10.0.3.46 │ 9000 │ 0 │ default │ │ 0 │ 0 │ │ default_cluster │ 2 │ 1 │ 2 │ 10.0.3.26 │ 10.0.3.26 │ 9000 │ 0 │ default │ │ 0 │ 0 │ └─────────────────┴───────────┴──────────────┴─────────────┴───────────┴──────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

如上所示:集群中有两个分片,每个分片两个2副本

shard_num 1: 10.0.3.27 10.0.3.41

shard_num 1: 10.0.3.46 10.0.3.26

创建本地非复制表、创建分布式表、向分布式表中插入数据、查询分布式表

代码语言:txt复制CREATE TABLE test.ddl_test ON cluster default_cluster( `Year` UInt16, `Quarter` UInt8, `Month` UInt8, `DayofMonth` UInt8, `DayOfWeek` UInt8, ... ) ENGINE = MergeTree PARTITION BY Year ORDER BY (Carrier, FlightDate) SETTINGS index_granularity = 8192;代码语言:txt复制CREATE TABLE test.ddl_all ON cluster default_cluster AS test.ddl_test ENGINE = Distributed(default_cluster, test, ddl_test, rand())代码语言:txt复制10.0.3.27 :) INSERT INTO ddl_all SELECT * FROM ontime; INSERT INTO ddl_all SELECT * FROM ontime ↘ Progress: 185.13 million rows, 134.51 GB (413.80 thousand rows/s., 300.65 MB/s.) ██████████ 99%Ok. 0 rows in set. Elapsed: 447.398 sec. Processed 185.13 million rows, 134.51 GB (413.80 thousand rows/s., 300.65 MB/s.)代码语言:txt复制# clickhouse-client -h 10.0.3.27


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有