HaMergeTree 是 ByteHouse 自研的引擎,是 ClickHouse 社区的 MergeTree 引擎的高可用版,支持主备数据同步。ByteHouse 默认使用HaMergeTree引擎。
相比起社区的 ReplicatedMergeTree,HaMergeTree 在实现多副本的同时,减少了 ZooKeeper 的依赖,单集群可支持的总数表比社区版更多(1W以上)。
每个分片 的 HaMergeTree 数据会相互同步,保持数据一致,因此查询同一分片任一一副本的 HaMergeTree 得到结果都是一致的。当其中任一节点发生故障时,只要该分片下仍有存活的节点,数据仍然保持可查。节点故障后进行替换,新节点上的数据也会被仍存活的节点的 HaMergeTree 表同步。
若当前集群是单副本模式,也可以创建 HaMergeTree 表,但根据定义,此时分片内只有一个副本,因此不存在数据同步,这张 HaMergeTree 表的表现行为和普通的 MergeTree 表一致。
需要注意的是,不同 Shard 中 HaMergeTree 的数据是不同的。此时需要 Distributed 表汇集不同节点的数据,统一返回。关于 Distributed 表的详情请见见 Distributed。
以下示仅描述了如何建一张 HaMergeTree 表,若你直接使用 SQL 建表,作为最佳实践,你仍需新建一张 Distributed 表,详情请见 Distributed。
CREATE TABLE [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], ... ) ENGINE = HaMergeTree(shard, replica) -- 默认为 '/clickhouse/bytehouse/库名.表名/{shard}','{replica}' PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) [PRIMARY KEY expr] [SAMPLE BY expr] [TTL expr] [SETTINGS name=value, ...]
此部分与 社区 MergeTree 引擎 的 Settings 一致。若采用控制面建表已使用默认值,无需进一步配置。
注意
使用 HaMergeTree 时,请将 remote 配置文件中的 internal_replication 设置为 True,否则会查询到2份数据。