Skip to main content

Configuration reference

This reference describes the Clustron Zaris store configuration file — the on-disk settings that define a cluster and its behavior — and the smaller client configuration an application uses to connect. Every setting has a default, so a minimal store file is just a cluster id, a node list, and a replication factor.

The store schema is published at https://schemas.clustron.io/zaris/v1/store.schema.json; referencing it with a $schema property enables autocomplete and validation in editors that support it.

Store configuration

The store file is Zaris-owned and uses Zaris's own naming. A minimal file looks like this:

{
"$schema": "https://schemas.clustron.io/zaris/v1/store.schema.json",
"clusterId": "orders",
"nodes": [
{ "id": "10.0.0.11-n0", "host": "10.0.0.11", "clusterPort": 7811, "clientPort": 7861 }
],
"replication": { "factor": 1 }
}

A complete example

Everything except clusterId, nodes, and replication.factor has a default, so you only set what you want to change. The file below shows every section in its place — a three-node cluster at replication factor 2 with the default values spelled out — so you can see where each setting goes. The per-section field tables that follow explain each value.

{
"$schema": "https://schemas.clustron.io/zaris/v1/store.schema.json",
"clusterId": "orders",
"version": "1",
"nodes": [
{ "id": "10.0.0.11-n0", "host": "10.0.0.11", "clusterPort": 7811, "clientPort": 7861, "preferredPrimary": true },
{ "id": "10.0.0.12-n0", "host": "10.0.0.12", "clusterPort": 7811, "clientPort": 7861 },
{ "id": "10.0.0.13-n0", "host": "10.0.0.13", "clusterPort": 7811, "clientPort": 7861 }
],
"topology": { "partitionCount": null },
"replication": { "factor": 2, "mode": "Async", "quorum": "All", "syncAckTimeoutSeconds": 5 },
"reads": { "allowReplicaReads": false },
"memory": { "maxSizeBytes": null },
"runtime": {
"partitionGroupEvictionWindowSeconds": 30,
"runtimeSyncPeerResponseTimeoutSeconds": 2,
"runtimeOwnershipSuspectEscalationTimeoutSeconds": 10
},
"membership": {
"readinessMinNodes": 1,
"readinessTimeoutSeconds": 30,
"stableMembershipDurationSeconds": 3,
"nodeGraceWindowSeconds": 30,
"membershipStabilityWindowSeconds": 8,
"discoveryPeerWaitSeconds": 1
},
"transport": { "useDuplex": true },
"retry": { "maxAttempts": 2, "delayMilliseconds": 500 },
"pushMetrics": { "pushTargetUrl": null, "rollingWindowSeconds": 120, "timeoutMilliseconds": 60000 },
"logClusterViewIntervalSeconds": 10,
"security": {
"enabled": false,
"issuer": "clustron://zaris",
"publicKeys": [],
"tls": {
"enabled": false,
"mode": "Off",
"minProtocol": "Tls12",
"peerVerification": "CaAndIdentity",
"issuerNodeId": "",
"ca": { "source": "Generate", "providedRootPath": "", "providedRootPasswordRef": "" },
"lifetimes": { "caValidityDays": 3650, "leafValidityDays": 90, "renewAtFraction": 0.66, "enrollmentTokenTtlMinutes": 15 },
"nodeCertificate": { "path": "", "passwordRef": "" },
"trustAnchors": []
}
},
"logging": {
"logLevel": { "Default": "Information", "Microsoft": "Warning", "Clustron.Zaris": "Information" },
"console": { "enabled": true },
"file": { "enabled": true, "path": "logs/zaris.log", "rollingInterval": "Day" }
},
"telemetry": {
"tracing": { "enabled": false, "sampleRatio": 1.0, "console": false },
"metrics": { "enabled": null },
"otlp": { "endpoint": "" }
}
}
note

null is shown for topology.partitionCount and memory.maxSizeBytes to mark where those optional fields go — leaving them out applies the same defaults (one partition per node; a 1 GiB memory ceiling). Advanced knobs read from environment or raw config paths (see Environment variables and Advanced runtime tuning) are not part of this file.

Top-level fields

FieldTypeDefaultDescription
clusterIdstring""The cluster's identity. Required.
versionstring"1"Config schema version.
nodesarray[]The authoritative node list (see below).
logClusterViewIntervalSecondsint10How often the cluster view is logged.

nodes[]

Each node is declared once and carries both of its ports, so the addressing table is complete and never repeated.

FieldTypeDefaultDescription
idstring""Node id, conventionally <host>-n<index>.
hoststring""The node's address.
clusterPortintPeer/gossip and inter-node transport port.
clientPortintClient/data protocol port.
preferredPrimaryboolfalsePlacement hint for initial primary selection.
machineIdstringhostPhysical machine, used to co-locate multiple nodes on one host in supervisor mode.
rolesarray["member"]Optional role overrides.
dataDirectorystringderivedOptional data-directory override.

topology

FieldTypeDefaultDescription
partitionCountint / nullnullNumber of partitions. null means system-determined (one partition per node).

replication

Governs how many copies of the data exist and how writes acknowledge. See Partitioning and replication and Consistency.

FieldTypeDefaultDescription
factorint1Number of copies of each partition. 1 = no replica; 2+ recommended for production.
modeenumAsyncAsync (primary returns immediately; replicas may lag) or Sync (primary waits for replicas per the quorum).
quorumenumAllSync acknowledgement policy: All, Majority, or BestEffort. Only meaningful when mode is Sync.
syncAckTimeoutSecondsint5How long a sync write waits for replica acknowledgement.

reads

FieldTypeDefaultDescription
allowReplicaReadsboolfalseWhen true, reads may be served by replicas (faster, potentially stale). When false, reads go to the primary.

memory

Controls the node memory ceiling. See Memory and eviction for the full model.

FieldTypeDefaultDescription
maxSizeByteslong / nullnullPer-process ceiling on actively owned data. null applies the 1 GiB default. There is no unbounded setting.

runtime

Runtime timings tied to partition and ownership behavior.

FieldTypeDefaultDescription
partitionGroupEvictionWindowSecondsint30Grace window after all members of a partition group go unavailable before the partition is evicted — its map regenerated from live members and its keyspace folded onto survivors (its in-memory data is lost). Any member returning within the window cancels the eviction. See Failure and recovery.
runtimeSyncPeerResponseTimeoutSecondsint2Timeout for a peer's runtime-sync response.
runtimeOwnershipSuspectEscalationTimeoutSecondsint10How long a suspected ownership issue waits before escalation.

membership

Membership and discovery timings, forwarded to the clustering layer.

FieldTypeDefaultDescription
readinessMinNodesint1Minimum nodes before the cluster is considered ready.
readinessTimeoutSecondsint30How long to wait for readiness.
stableMembershipDurationSecondsint3Membership must be stable this long to settle.
nodeGraceWindowSecondsint30Grace window before a missing node is acted on.
membershipStabilityWindowSecondsint8Window used to judge membership stability.
discoveryPeerWaitSecondsint1Wait for peers during discovery.

transport

FieldTypeDefaultDescription
useDuplexbooltrueUse duplex peer connections.

retry

Connection-retry options for the clustering layer.

FieldTypeDefaultDescription
maxAttemptsint2Connection retry attempts.
delayMillisecondsint500Delay between attempts.

pushMetrics

Legacy push-metrics options, distinct from telemetry. See also Monitoring.

FieldTypeDefaultDescription
pushTargetUrlstring / nullnullWhere to push metrics.
rollingWindowSecondsint120Rolling metrics window.
timeoutMillisecondsint60000Push timeout.

security

Cluster-wide token security, disabled by default. The concepts are covered in the security guide; the fields and defaults are below.

FieldTypeDefaultDescription
enabledboolfalseMaster switch for token authentication. See Authentication and tokens.
issuerstringclustron://zarisToken issuer to trust.
publicKeys[].keyIdstring""Stable id of a public signing key.
publicKeys[].spkiBase64string""The key's SubjectPublicKeyInfo (DER), base64, for offline token verification.

security.tls

Transport-layer security (TLS / mTLS), cluster-wide and disabled by default. For the concepts and step-by-step setup see TLS encryption and CA trust modes.

FieldTypeDefaultDescription
tls.enabledboolfalseMaster switch for transport TLS.
tls.modeenumOffOff, ServerAuth (client validates node certs), or MutualTls (both sides present certs).
tls.minProtocolenumTls12Minimum protocol: Tls12 or Tls13.
tls.peerVerificationenumCaAndIdentityCaOnly, CaAndIdentity, or FullHostname.
tls.issuerNodeIdstring""Node that acts as the CA issuer for enrollment.
tls.ca.sourceenumGenerateGenerate (Zaris creates the CA) or Provided (bring your own).
tls.ca.providedRootPathstring""Path to a provided CA (PKCS#12), when source is Provided.
tls.ca.providedRootPasswordRefstring""Reference to the provided CA's password.
tls.lifetimes.caValidityDaysint3650Validity of a generated CA.
tls.lifetimes.leafValidityDaysint90Validity of an issued node (leaf) certificate.
tls.lifetimes.renewAtFractiondouble0.66Fraction of a leaf's lifetime after which it auto-renews.
tls.lifetimes.enrollmentTokenTtlMinutesint15Lifetime of a node enrollment token.
tls.nodeCertificate.pathstring""Path to a pre-issued node certificate (mode-dependent).
tls.nodeCertificate.passwordRefstring""Reference to that certificate's password.
tls.trustAnchors[]array of {keyId, pem}[]Additional trust anchors to accept.

logging and telemetry

The store file's logging block configures log levels and the console/file sinks; the Telemetry section configures OpenTelemetry traces and metrics (OTLP). Both are documented in full, with every field and default, in Logging and tracing.

Advanced runtime tuning

These are power-user knobs read directly from the configuration paths below (not part of the store-file schema, so they only take effect when the path is present). Most deployments never set them; the defaults are tuned for typical clusters. Change them only with a specific reason.

Config pathTypeDefaultDescription
runtime:preferredPrimaryRestoreDwellSecondsint8How long a returning preferred primary waits before reclaiming active ownership. ≤ 0 promotes immediately.
runtime:runtimeAntiEntropySecondsint15Interval for the runtime anti-entropy sweep. ≤ 0 disables it.
runtime:maplessDigestFreshnessSecondsint12Freshness window for mapless-mint peer digests.
runtime:maplessColdStabilityWindowSecondsint8Cold-start stability window before a mapless mint.
runtime:maplessProvisionalBackstopSecondsint30Backstop before a provisional mapless decision.

Client configuration

An application connecting to a store is configured by one connection string. The string says which transport to use, where to reach the store, which store to open, and — for a secured cluster — how to authenticate and trust it. There is no client Mode or Seeds setting; the scheme and host list of the string express those.

Connection strings live in the standard ConnectionStrings section of appsettings.json, keyed by a name you choose, exactly as with SQL Server or any other database:

{
"ConnectionStrings": {
"orders": "zariss://10.0.0.11:7863,10.0.0.12:7863/orders?ca=/etc/zaris/ca.pem&token=env:ZARIS_TOKEN"
}
}

Connection string grammar

scheme://host[:port][,host[:port]...]/store[?option=value&option=value...]
ElementRequiredDescription
Schemeyeszaris for a plaintext connection, zariss to enable TLS. The trailing s is the only thing that turns TLS on.
HostsyesOne or more comma-separated host:port seeds. The client uses them to discover the rest of the cluster and to fail over between them. For an embedded store, use the reserved host inproc with no port.
StoreyesThe path segment is the store name, which must equal the cluster's id. Always required.
Optionsno&-separated key=value query parameters (see below).

The reserved host inproc selects an in-process (embedded) store — zaris://inproc/orders — that runs in memory inside your process. An in-process store cannot use TLS, so zariss://inproc/... is invalid.

Options

OptionExampleDescription
tokentoken=env:ZARIS_TOKENBearer token for a secured cluster. Three forms: env:VAR reads an environment variable, file:/path reads a file, or a literal token value inline. Prefer env: or file: over a literal so the secret stays out of configuration.
caca=/etc/zaris/ca.pemPath to the cluster CA (PEM) used to validate node certificates. Used with the zariss scheme.
tlsInsecuretlsInsecure=trueDev only — accept any node certificate without validation. Never use in production.
connectTimeoutMsconnectTimeoutMs=5000Connection timeout in milliseconds.
requestTimeoutMsrequestTimeoutMs=5000Per-request timeout in milliseconds.

Some client settings cannot be expressed as text in a connection string — a rotating-token callback, a client log-file path, or a fully-populated TLS options object. Supply those through the advanced registration overload's ZarisClientOptions callback (o.TokenProvider, o.LogFilePath, o.Tls); see Getting a client.

For securing a client end to end, see Connect to a secured store and the secured-client tutorial. For the equivalent in code, see Getting started: configuration.

Environment variables

Some settings are read from environment variables rather than the configuration file — chiefly client tuning, telemetry, and container-oriented node bootstrap. Set them on the relevant process (your application for the client variables; the node/host process for the rest). All have working defaults; change them only for a specific reason.

Client tuning

Read by the .NET client process. See Tuning the client.

VariableDefaultEffect
ZARIS_REQUEST_TIMEOUT60 (s)Per-request timeout; accepts seconds or infinite / none / 0.
ZARIS_CONNECT_TIMEOUT_MS3000Connection timeout in ms (min 100).
ZARIS_DISABLE_RETRIESunsettrue turns off the automatic retry loop.
ZARIS_MAX_INFLIGHT4096Max concurrent in-flight requests per connection.
ZARIS_CONNECTIONS1Connections opened per node.
ZARIS_TOKENunsetBearer token used by the environment token provider on a secured cluster.

Node and host

Read by the node/host process.

VariableDefaultEffect
ZARIS_DATA_ROOTplatform defaultRoot directory for a node's data directory (config and certificates).
CLUSTRON_NODE_IDderivedOverrides the node's identity.
ZARIS_MIN_THREADSCPU count × 4Minimum thread-pool threads.
ZARIS_MGMT_MODEsupervisorControl-plane mode of the management service (supervisor vs attach).
ZARIS_MGMT_PORT7801Management port override.
ZARIS_SERVER_MAX_WORKERSCPU count × 16 (clamped 64–1024)Hard override (1–4096) for the node's request-dispatch worker pool width. Reads are microsecond in-memory lookups, so the pool is set wide by default to keep cores busy; raise it only if a node has spare CPU and requests are queuing.
ZARIS_SERVER_MIN_WORKERSmax(4, CPU count × 4)Lower bound (1–4096) on the dispatch pool width.
ZARIS_OWNERSHIP_BACKBONE1 (on)The deterministic ownership backbone is on by default. Set ZARIS_OWNERSHIP_BACKBONE=0 to opt out (not recommended).
ZARIS_READY_FRESH_SECONDS20 (clamped 2–600)Freshness window (seconds) the manager's GET /health/ready uses to decide a node is "serving" — i.e. has pushed a metrics snapshot within this window. The Kubernetes chart points the console's readiness gate at /health/ready, so the web-console URL goes live only once a store is attached and a node is reporting inside this window.
ZARIS_ATTACH_STORE_NAME · _RF · _PARTITIONS · _TLS · _NODESunsetAttach-mode self-registration. When set, the manager adopts (registers) the store on boot so it appears in the console with no manual step. _NODES is a comma-separated host:clientPort:clusterPort list. The Helm chart supplies all of these from cluster.id, the replication factor, the partition count, and the node roster (manager.attach.enabled, default on) — you don't set them by hand for a chart deploy.
ZARIS_SECURITYunset (off)1/true turns control-plane enforcement ON at boot (console + management API require authentication). A persisted runtime toggle wins over this once set from the console/PowerShell.
ZARIS_ADMIN_USERNAME · ZARIS_ADMIN_PASSWORDunsetWith ZARIS_SECURITY on, the manager self-provisions the first admin (a real login identity with ClusterAdmin@root) on boot — the in-process equivalent of POST /security/provision. It runs before the manager becomes Ready, so the readiness-gated console URL is never published un-provisioned (closing the bootstrap race where anyone could claim admin). Idempotent. The Helm chart supplies these from a Secret when manager.security.enabled — see the Kubernetes deployment guide.

Telemetry

See Logging and tracing.

VariableDefaultEffect
CLUSTRON_TELEMETRYenabledAnonymous usage telemetry is sent unless this is set to false. Set CLUSTRON_TELEMETRY=false to opt out.
OTEL_EXPORTER_OTLP_ENDPOINTunsetOTLP endpoint; setting it also switches tracing on.
OTEL_EXPORTER_OTLP_PROTOCOLunsetOTLP protocol (for example grpc or http/protobuf).
ZARIS_METRICS_RETENTION_SECONDS600How long the management service keeps pushed metric snapshots — the window the web console's throughput/latency charts draw. Clamped to 60 s–24 h. Raise it to see a longer trend on the charts.
ZARIS_TRACEunset1 enables verbose node trace logging at startup.

CLUSTRON_TELEMETRY also governs install telemetry: the Windows installer reports one anonymous install event (product, version, OS, arch, install kind, and a random per-install id — no machine or user identifiers). The install event also includes a server-derived IP and coarse location (country / region / city) resolved from the request by the Clustron server; the installer itself never captures or sends IP or location. Set CLUSTRON_TELEMETRY=false before running the installer to skip it.

TLS enrollment (containers)

Used to enroll a node into a TLS-secured cluster in attach/container deployments. See CA trust modes.

VariableEffect
ZARIS_TLS_ENROLLEnables node certificate enrollment on startup.
ZARIS_TLS_ISSUER_URLURL of the CA issuer to enroll against.
ZARIS_TLS_ENROLL_TOKENEnrollment token (from New-ZrEnrollmentToken).
ZARIS_TLS_CA_THUMBPRINTExpected cluster-CA thumbprint to pin during enrollment.

Next steps