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 collapsingimport { OlapTable, ClickHouseEngines } from "@514labs/moose-lib"; // Basic replicated table with explicit pathsconst replicatedTable = new OlapTable<Record>("records", { engine: ClickHouseEngines.ReplicatedMergeTree, keeperPath: "/clickhouse/tables/{database}/{shard}/records", replicaName: "{replica}", orderByFields: ["id"]}); // Replicated with deduplicationconst replicatedDedup = new OlapTable<Record>("dedup_records", { engine: ClickHouseEngines.ReplicatedReplacingMergeTree, keeperPath: "/clickhouse/tables/{database}/{shard}/dedup_records", replicaName: "{replica}", ver: "updated_at", isDeleted: "deleted", orderByFields: ["id"]}); // For ClickHouse Cloud or Boreal (no parameters needed)const cloudReplicated = new OlapTable<Record>("cloud_records", { engine: ClickHouseEngines.ReplicatedMergeTree, orderByFields: ["id"]});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:
const table = new OlapTable<Record>("my_table", { engine: ClickHouseEngines.ReplicatedMergeTree, orderByFields: ["id"] // No keeper_path, replica_name, or cluster needed});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:
const table = new OlapTable<Record>("my_table", { engine: ClickHouseEngines.ReplicatedMergeTree, orderByFields: ["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:
const table = new OlapTable<Record>("my_table", { engine: ClickHouseEngines.ReplicatedMergeTree, keeperPath: "/clickhouse/tables/{database}/{shard}/my_table", replicaName: "{replica}", orderByFields: ["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.