clickhouse同一条数据重复插入为什么会去重?

1,281 阅读2分钟

问题发现

在测试集群新建了一个ReplicatedMergeTree,插入多条相同的数据,发现每个分片只有一条

clickhouse zk的目录结构

└── tables
      ├── 1
      │   ├── log_test
      │   │   ├── metadata #log_test表的元数据信息
      │   │   ├── temp #临时节点,存储过程中的临时数据
      │   │   └── mutations #表的变更信息,ClickHouse为区别标准SQL特定的一个名词
      │   ├── log  #写block时记录的log
      │   │   ├── log-0000000003
      │   │   ├── log-0000000001
      │   │   └── log-0000000002
      │   ├── leader_election #副本选举leader时使用
      │   │   ├── leader_election-0000000001
      │   │   └── leader_election-0000000003
      │   ├── colums #列信息
      │   ├── blocks #和log是对应的,用于block去重
      │   │   ├── 201908_12150410223201606212_2366670524718677664
      │   │   ├── 201908_15367370223201604745_5325320524718463637
      │   │   └── 201907_34543779872932958925_1436457470273464774
      │   ├── nonincrement_block_numbers
      │   ├── replicas #存储各个副本的相关信息
      │   │   └── 10.0.0.71 
      │   │         ├── is_lost #标记副本是否过时
      │   │         ├── metadata  #log_test表的元数据信息
      │   │         ├── is_active #标记副本是否存活
      │   │         ├── mutation_pointer
      │   │         ├── colums #列信息
      │   │         ├── max_processed_insert_time
      │   │         ├── host  #主机名或域名
      │   │         ├── parts  #存储数据所有的parts
      │   │         │   └── 201908_0_0_0
      │   │         │          ├── checksums
      │   │         │          └── colums
      │   │         ├── flags #用于数据恢复
      │   │         ├── log_pointer #log指针
      │   │         ├── min_unprocessed_insert_time
      │   │         └── queue #临时处理队列
      │   ├── quorum  #与是否配置insert_quorum有关
      │   │   ├── last_part
      │   │   └── failed_parts
      │   └── block_number #存储所有的分区值,会根据merge实时更新
      │          └── 201908
      └─ 2


根目录:/clickhouse/tables

下一级时是分片信息目录,其中的12是根据配置中的shard生成的

<macros>
    <shard>1</shard>
</macros>

从zk的目录中可以看到,每个分片一个目录,目录中有blocks目录,其中的blockid用于去重,blockid=patition_hash[0]_hash[1]

总结

ReplicatedMergeTree在每个分片上会按照blockid去重,可以通过insert_deduplicate来控制。对于MergeTree来讲,由于不使用zk,使用non_replicated_deduplication_window 参数,表示保存多少个block的hash值,默认不开启。

参考

blog.csdn.net/weixin_3999…
cloud.tencent.com/developer/a…