Replicated engines provide high availability and data replication across multiple ClickHouse nodes. MooseStack supports all standard replicated MergeTree variants:
ReplicatedMergeTree - Replicated version of MergeTreeReplicatedReplacingMergeTree - Replicated with deduplicationReplicatedAggregatingMergeTree - Replicated with aggregationReplicatedSummingMergeTree - Replicated with summationReplicatedCollapsingMergeTree - Replicated with state collapsingReplicatedVersionedCollapsingMergeTree - Replicated with versioned collapsingfrom moose_lib import OlapTable, OlapConfigfrom moose_lib.blocks import ( ReplicatedMergeTreeEngine, ReplicatedReplacingMergeTreeEngine, ReplicatedAggregatingMergeTreeEngine, ReplicatedSummingMergeTreeEngine) class Record(BaseModel): id: Key[str] updated_at: datetime deleted: int = 0 # Basic replicated table with explicit pathsreplicated_table = OlapTable[Record]("records", OlapConfig( order_by_fields=["id"], engine=ReplicatedMergeTreeEngine( keeper_path="/clickhouse/tables/{database}/{shard}/records", replica_name="{replica}" ))) # Replicated with deduplicationreplicated_dedup = OlapTable[Record]("dedup_records", OlapConfig( order_by_fields=["id"], engine=ReplicatedReplacingMergeTreeEngine( keeper_path="/clickhouse/tables/{database}/{shard}/dedup_records", replica_name="{replica}", ver="updated_at", is_deleted="deleted" ))) # For ClickHouse Cloud or Boreal (no parameters needed)cloud_replicated = OlapTable[Record]("cloud_records", OlapConfig( order_by_fields=["id"], engine=ReplicatedMergeTreeEngine()))Replicated engines support three configuration approaches. Choose the one that fits your deployment:
Omit all replication parameters. Moose uses smart defaults that work in both ClickHouse Cloud and self-managed environments:
table = OlapTable[Record]("my_table", OlapConfig( engine=ReplicatedMergeTreeEngine(), # No parameters order_by_fields=["id"]))Moose auto-injects: /clickhouse/tables/{database}/{shard}/{table_name} and {replica} in local development. ClickHouse Cloud uses its own patterns automatically.
For multi-node deployments, specify a cluster name to use ON CLUSTER DDL operations:
table = OlapTable[Record]("my_table", OlapConfig( engine=ReplicatedMergeTreeEngine(), order_by_fields=["id"], cluster="default" # References cluster from moose.config.toml))Configuration in moose.config.toml:
[[clickhouse_config.clusters]]name = "default"Use when:
ON CLUSTER DDL for distributed operationsFor custom replication topology, specify both keeper_path and replica_name:
table = OlapTable[Record]("my_table", OlapConfig( engine=ReplicatedMergeTreeEngine( keeper_path="/clickhouse/tables/{database}/{shard}/my_table", replica_name="{replica}" ), order_by_fields=["id"]))Use when:
Cannot mix approaches: Specifying both cluster and explicit keeper_path/replica_name will cause an error. Choose one approach.
Cluster is a deployment directive: Changing cluster won't recreate your table -— it only affects future DDL operations.
For more details, see the ClickHouse documentation on data replication.