问题发现
在测试集群新建了一个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
下一级时是分片信息目录,其中的1和2是根据配置中的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值,默认不开启。