rondb-helm

Usage

Helm must be installed to use the charts. Please refer to Helm’s documentation to get started.

Once Helm has been set up correctly, add the repo as follows:

helm repo add rondb https://logicalclocks.github.io/rondb-helm/

If you had already added this repo earlier, run helm repo update to retrieve the latest versions of the packages. You can then run helm search repo rondb to see the charts.

To install the rondb chart:

helm install my-rondb rondb/rondb

To uninstall the chart:

helm delete my-rondb

Values options

This has been auto-generated from the values.schema.json file.

Chart version is 26.2.22. See commit history for previous schemata.

Field Path Type Description Default
backups object Whether, how and how often to run regular backups on the cluster  
backups.enabled [‘boolean’, ‘null’]    
backups.metadataConfigmapName [‘string’, ‘null’] The name of the configmap to be used to store the backups metadata information.  
backups.objectStorageProvider enum: [s3]   s3
backups.pathPrefix string Prefix of RonDB backup in the configured bucket rondb_backup
backups.s3 object    
backups.s3.bucketName [‘string’, ‘null’]    
backups.s3.endpoint [‘string’, ‘null’]    
backups.s3.keyCredentialsSecret object    
backups.s3.keyCredentialsSecret.key [‘string’, ‘null’] Key in the Secret  
backups.s3.keyCredentialsSecret.name [‘string’, ‘null’] Name of the Secret  
backups.s3.provider [‘string’, ‘null’]    
backups.s3.region [‘string’, ‘null’]    
backups.s3.secretCredentialsSecret object    
backups.s3.secretCredentialsSecret.key [‘string’, ‘null’] Key in the Secret  
backups.s3.secretCredentialsSecret.name [‘string’, ‘null’] Name of the Secret  
backups.s3.serverSideEncryption enum: [aws:kms, aws:kms:dsse, AES256, null]    
backups.schedule [‘string’, ‘null’] Cron schedule for backups  
backups.ttl [‘string’, ‘null’] time to live to control when to clean up backups. It is a number followed by either d (days) or h (hours) suffix.  
benchmarking object Whether, which and how to run a benchmarking job on the cluster  
benchmarking.dbt2 object Configuration of DBT2 benchmarking job  
benchmarking.dbt2.numWarehouses integer   4
benchmarking.dbt2.runMulti string Table with columns: NUM_MYSQL_SERVERS, NUM_WAREHOUSES, NUM_TERMINALS # NUM_MYSQL_SERVERS NUM_WAREHOUSES NUM_TERMINALS
      2 1 1
      2 2 1
      2 2 2
benchmarking.dbt2.runSingle string Table with columns: NUM_MYSQL_SERVERS, NUM_WAREHOUSES, NUM_TERMINALS # NUM_MYSQL_SERVERS NUM_WAREHOUSES NUM_TERMINALS
      1 1 1
      1 2 1
      1 4 1
      1 4 2
benchmarking.enabled boolean Whether to run a benchmarking job on the cluster False
benchmarking.sysbench object Configuration of Sysbench benchmarking job  
benchmarking.sysbench.minimizeBandwidth boolean Whether to use filters to minimize bandwidth usage. This can be useful in cloud environments where bandwidth is expensive. False
benchmarking.sysbench.rows integer   100000
benchmarking.sysbench.threadCountsToRun string Semi-colon-separated list of thread counts to run 1;2;4;8;12;16;24;32;64
benchmarking.type enum: [sysbench, dbt2_single, dbt2_multi, ycsb] Which benchmarking job to run. ‘Multi’ refers to multiple MySQLd servers to run against sysbench
benchmarking.ycsb object Configuration of YCSB benchmarking job  
benchmarking.ycsb.schemata string MySQL table schema to use for YCSB. NOTE: The ycsb database is pre-created. CREATE TABLE IF NOT EXISTS ycsb.usertable (YCSB_KEY VARCHAR(255) PRIMARY KEY, FIELD0 varbinary(4096));
clusterSize object Horizontal cluster size  
clusterSize.activeDataReplicas integer How many replicas each node group has. When descreasing this value, try going down by 1 at a time. Too many nodes leaving at once can cause issues with leader elections. 2
clusterSize.maxNumMySQLServers integer The maximum amount of MySQL servers we will auto-scale to. It is represented as number of slots in RonDB’s config.ini. Changing this will only take effect if the ConfigMap for config.ini is updated and the MGMd is restarted. 5
clusterSize.maxNumRdrs integer   2
clusterSize.minNumMySQLServers integer A minimum amount of MySQL servers 1
clusterSize.minNumRdrs integer   1
clusterSize.numNodeGroups integer Number of RonDB node groups. Immutable after install — RonDB has no online add/remove. Changing it requires uninstall and reinstall with restoreFromBackup.backupId. Set mode: upgrade for ArgoCD or other template-only renderers so the immutability check runs as an in-cluster Job. 1
createPriorityClass boolean Flag to disable the creation of PriorityClass in case it was created beforehand True
enableSecurityContext boolean   True
forceNodeGroupChange boolean Skip the pre-upgrade immutability gate on clusterSize.numNodeGroups. RonDB still cannot add or remove node groups online, so an upgrade that changes numNodeGroups under this flag will break the cluster. False
globalReplication object    
globalReplication.clusterNumber number Determines the offset for global server IDs 1
globalReplication.primary object    
globalReplication.primary.binlogFilename string   binlog
globalReplication.primary.enabled boolean Specifies if the primary replication is enabled. This will actually create the binary log servers. Can be activated after an initial start. False
globalReplication.primary.expireBinlogsDays number   1.5
globalReplication.primary.ignoreDatabases array   []
globalReplication.primary.includeDatabases array   []
globalReplication.primary.logReplicaUpdates boolean   False
globalReplication.primary.maxNumBinlogServers number Don’t change this value. Determines how many binlog servers we can scale out to. Used to determine the server IDs for global replication. Even if replication is disabled, potential binlog servers will be written into the config.ini. 2
globalReplication.primary.numBinlogServers number The current number of binlog servers, given global Replication is enabled. 2
globalReplication.secondary object    
globalReplication.secondary.enabled boolean   False
globalReplication.secondary.replicateFrom object RonDB clusters to replicate from. RonDB supports merge-replicating from multiple clusters, but we only support replicating from one cluster  
globalReplication.secondary.replicateFrom.binlogServerHosts array Hostnames of the binlog server to replicate from. The binlog servers have headless ClusterIPs and one LoadBalancer per binlog server. If we replicate across different K8s clusters, we can reference the External IPs of the binlog servers’ LoadBalancers here. []
globalReplication.secondary.replicateFrom.clusterNumber number A helper to understand from which serverIds to replicate from 2
globalReplication.secondary.replicateFrom.ignoreDatabases array   []
globalReplication.secondary.replicateFrom.ignoreTables array   []
globalReplication.secondary.replicateFrom.includeDatabases array   []
globalReplication.secondary.replicateFrom.includeTables array   []
globalReplication.secondary.replicateFrom.useTlsConnection boolean Enable this for an encrypted replication channel. Important if the binlog server requires TLS connections False
imagePullPolicy string The Kubernetes image pull policy IfNotPresent
imagePullSecrets array   []
images object Information for Docker images used in the cluster  
images.dataValidation object    
images.dataValidation.name string   python
images.dataValidation.registry string   docker.io
images.dataValidation.repository string    
images.dataValidation.tag string   3.12-slim
images.mysqldExporter object    
images.mysqldExporter.name string   mysqld_exporter
images.mysqldExporter.registry string   docker.hops.works
images.mysqldExporter.repository string   hopsworks
images.mysqldExporter.tag string   0.11.5
images.rondb object    
images.rondb.name string   rondb
images.rondb.registry string   docker.io
images.rondb.repository string   hopsworks
images.rondb.tag string The version of RonDB to use; This should always be equivalent to .Chart.AppVersion 26.02.12
images.toolbox object    
images.toolbox.name string   hwutils
images.toolbox.registry string   docker.io
images.toolbox.repository string   hopsworks
images.toolbox.tag string   1.7
images.upgrade2410revokegrants object    
images.upgrade2410revokegrants.name string   rondb
images.upgrade2410revokegrants.registry string   docker.io
images.upgrade2410revokegrants.repository string   hopsworks
images.upgrade2410revokegrants.tag string The version of RonDB to use when revoking bogus user privilege to upgrade from 22.10 to 24.10 22.10.13-0.7
isMultiNodeCluster boolean Whether the Kubernetes cluster has multiple nodes; this will affect affinities and add requirements to scheduling. True
meta object    
meta.binlogServers object    
meta.binlogServers.externalLoadBalancers object One LoadBalancer per binlog server; Creating an (alternative) Ingress per binlog server is difficult  
meta.binlogServers.externalLoadBalancers.annotations object Cloud provider load balancer specific annotations. {}
meta.binlogServers.externalLoadBalancers.class [‘string’, ‘null’]    
meta.binlogServers.externalLoadBalancers.enabled boolean   True
meta.binlogServers.externalLoadBalancers.namePrefix string   binlog-server
meta.binlogServers.externalLoadBalancers.port integer Port to expose the service on 3306
meta.binlogServers.headlessClusterIp object    
meta.binlogServers.headlessClusterIp.name string   headless-binlog-servers
meta.binlogServers.headlessClusterIp.port integer   3306
meta.binlogServers.statefulSet object    
meta.binlogServers.statefulSet.endToEndTls object    
meta.binlogServers.statefulSet.endToEndTls.enabled   Whether to use end-to-end encryption for MySQL binlog server Pods. This is recommended for high-security use cases. For MySQLds this is especially recommended since they use raw TCP connections and thereby by-pass TLS Ingress-rules. Otherwise, Ingress-TCP can also be configured directly via the Ingress controller (not in this Helmchart). False
meta.binlogServers.statefulSet.endToEndTls.filenames object    
meta.binlogServers.statefulSet.endToEndTls.filenames.ca [‘string’, ‘null’] Name of the CA file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets.  
meta.binlogServers.statefulSet.endToEndTls.filenames.cert string Name of the certificate file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.crt
meta.binlogServers.statefulSet.endToEndTls.filenames.key string Name of the key file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.key
meta.binlogServers.statefulSet.endToEndTls.secretName string Name of the TLS Secret binlog-end-to-end-tls
meta.binlogServers.statefulSet.endToEndTls.supplyOwnSecret   Whether the Helmchart user will create a TLS Secret outside of this Helmchart. Otherwise we rely on cert-manager to create one. False
meta.binlogServers.statefulSet.name string   mysqld-binlog-servers
meta.ddlMySQLd object    
meta.ddlMySQLd.addSysNiceCapability boolean   True
meta.ddlMySQLd.clusterIp object    
meta.ddlMySQLd.clusterIp.annotations object   {}
meta.ddlMySQLd.clusterIp.name string   ddl-mysqld
meta.ddlMySQLd.clusterIp.port integer   3306
meta.ddlMySQLd.enabled boolean Whether to deploy the DDL MySQLd StatefulSet and reserve its NDB node slot. False
meta.ddlMySQLd.headlessClusterIp object    
meta.ddlMySQLd.headlessClusterIp.name string   headless-ddl-mysqld
meta.ddlMySQLd.headlessClusterIp.port integer   3306
meta.ddlMySQLd.statefulSet object    
meta.ddlMySQLd.statefulSet.endToEndTls object    
meta.ddlMySQLd.statefulSet.endToEndTls.enabled boolean Whether to use end-to-end encryption for DDL MySQL server Pods. False
meta.ddlMySQLd.statefulSet.endToEndTls.filenames object    
meta.ddlMySQLd.statefulSet.endToEndTls.filenames.ca [‘string’, ‘null’] Name of the CA file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets.  
meta.ddlMySQLd.statefulSet.endToEndTls.filenames.cert string Name of the certificate file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.crt
meta.ddlMySQLd.statefulSet.endToEndTls.filenames.key string Name of the key file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.key
meta.ddlMySQLd.statefulSet.endToEndTls.secretName string Name of the TLS Secret ddl-mysqld-end-to-end-tls
meta.ddlMySQLd.statefulSet.endToEndTls.supplyOwnSecret boolean Whether the Helmchart user will create a TLS Secret outside of this Helmchart. Otherwise we rely on cert-manager to create one. False
meta.ddlMySQLd.statefulSet.name string   ddl-mysqld
meta.mgmd object    
meta.mgmd.headlessClusterIp object    
meta.mgmd.headlessClusterIp.annotations object   {}
meta.mgmd.headlessClusterIp.name string   headless-mgmds
meta.mgmd.headlessClusterIp.port integer   1186
meta.mgmd.statefulSetName string   mgmds
meta.mysqld object    
meta.mysqld.addSysNiceCapability boolean   True
meta.mysqld.clusterIp object    
meta.mysqld.clusterIp.annotations object   {}
meta.mysqld.clusterIp.name string   mysqld
meta.mysqld.clusterIp.port integer   3306
meta.mysqld.exporter object Configuration for mysqld exporter  
meta.mysqld.exporter.metricsPort integer   9104
meta.mysqld.externalLoadBalancer object Configuration for load balancer service to be used for external access  
meta.mysqld.externalLoadBalancer.annotations object Cloud provider load balancer specific annotations. {}
meta.mysqld.externalLoadBalancer.class [‘string’, ‘null’]    
meta.mysqld.externalLoadBalancer.enabled boolean   False
meta.mysqld.externalLoadBalancer.managed boolean LoadBalancer is managed by provider True
meta.mysqld.externalLoadBalancer.name string   mysqld-external
meta.mysqld.externalLoadBalancer.nodePort [‘integer’, ‘null’] Explicit nodePort for the service when the load balancer is unmanaged (managed: false), so a load balancer outside Kubernetes can target a fixed port. Null lets Kubernetes allocate one from the cluster’s node-port range.  
meta.mysqld.externalLoadBalancer.nodeSelector object selector for nodes the load balancer can use to route traffic {}
meta.mysqld.externalLoadBalancer.port integer Port to expose the service on 3306
meta.mysqld.headlessClusterIp object    
meta.mysqld.headlessClusterIp.name string   headless-mysqlds
meta.mysqld.headlessClusterIp.port integer   3306
meta.mysqld.statefulSet object    
meta.mysqld.statefulSet.endToEndTls object    
meta.mysqld.statefulSet.endToEndTls.enabled   Whether to use end-to-end encryption for MySQLd Pods. This is recommended for high-security use cases. For MySQLds this is especially recommended since they use raw TCP connections and thereby by-pass TLS Ingress-rules. Otherwise, Ingress-TCP can also be configured directly via the Ingress controller (not in this Helmchart). False
meta.mysqld.statefulSet.endToEndTls.filenames object    
meta.mysqld.statefulSet.endToEndTls.filenames.ca [‘string’, ‘null’] Name of the CA file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets.  
meta.mysqld.statefulSet.endToEndTls.filenames.cert string Name of the certificate file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.crt
meta.mysqld.statefulSet.endToEndTls.filenames.key string Name of the key file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.key
meta.mysqld.statefulSet.endToEndTls.secretName string Name of the TLS Secret mysqld-end-to-end-tls
meta.mysqld.statefulSet.endToEndTls.supplyOwnSecret   Whether the Helmchart user will create a TLS Secret outside of this Helmchart. Otherwise we rely on cert-manager to create one. False
meta.mysqld.statefulSet.name string   mysqlds
meta.ndbmtd object    
meta.ndbmtd.statefulSet object    
meta.ndbmtd.statefulSet.podAnnotations object   {}
meta.rdrs object    
meta.rdrs.clusterIp object    
meta.rdrs.clusterIp.annotations object   {‘consul.hashicorp.com/service-name’: ‘rdrs’, ‘prometheus.io/path’: ‘/metrics’, ‘prometheus.io/port’: ‘4406’, ‘prometheus.io/scheme’: ‘https’, ‘prometheus.io/scrape’: ‘true’}
meta.rdrs.clusterIp.name string   rdrs
meta.rdrs.externalLoadBalancer object Configuration for load balancer service to be used for external access  
meta.rdrs.externalLoadBalancer.annotations object Cloud provider load balancer specific annotations. {}
meta.rdrs.externalLoadBalancer.class [‘string’, ‘null’]    
meta.rdrs.externalLoadBalancer.enabled boolean   False
meta.rdrs.externalLoadBalancer.managed boolean LoadBalancer is managed by provider True
meta.rdrs.externalLoadBalancer.name string   rdrs-external
meta.rdrs.externalLoadBalancer.nodePort [‘integer’, ‘null’] Explicit nodePort for the service when the load balancer is unmanaged (managed: false), so a load balancer outside Kubernetes can target a fixed port. Null lets Kubernetes allocate one from the cluster’s node-port range.  
meta.rdrs.externalLoadBalancer.nodeSelector object selector for nodes the load balancer can use to route traffic {}
meta.rdrs.headlessClusterIpName string   rdrs-cluster-ip
meta.rdrs.ingress object Configuration of Ingress for RDRS  
meta.rdrs.ingress.class string   nginx
meta.rdrs.ingress.dnsNames array   []
meta.rdrs.ingress.enabled boolean   False
meta.rdrs.ingress.tls object    
meta.rdrs.ingress.tls.enabled boolean WARN: Nginx-ingress will always use encryption even if this is disabled. By enabling this, we simply have more control over the TLS Secret. The TLS Secrets are placed onto the Ingress controller instance. Ingress TLS is currently only supported with cert-manager (RonDB-standalone) True
meta.rdrs.ingress.tls.ipAddresses array   []
meta.rdrs.ingress.useDefaultBackend boolean Whether to use the RDRS as a default backend for the Ingress; this makes it reachable without specifying a subdomain; i.e. an IP can be used instead. True
meta.rdrs.statefulSet object    
meta.rdrs.statefulSet.endToEndTls object    
meta.rdrs.statefulSet.endToEndTls.enabled   Whether to use end-to-end encryption for RDRS Pods. This is recommended for high-security use cases. False
meta.rdrs.statefulSet.endToEndTls.filenames object    
meta.rdrs.statefulSet.endToEndTls.filenames.ca [‘string’, ‘null’] Name of the CA file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets.  
meta.rdrs.statefulSet.endToEndTls.filenames.cert string Name of the certificate file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.crt
meta.rdrs.statefulSet.endToEndTls.filenames.key string Name of the key file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.key
meta.rdrs.statefulSet.endToEndTls.secretName string Name of the TLS Secret rdrs-end-to-end-tls
meta.rdrs.statefulSet.endToEndTls.supplyOwnSecret   Whether the Helmchart user will create a TLS Secret outside of this Helmchart. Otherwise we rely on cert-manager to create one. False
meta.rdrs.statefulSet.name string   rdrs
meta.replicaAppliers object    
meta.replicaAppliers.headlessClusterIp object    
meta.replicaAppliers.headlessClusterIp.name string   headless-replica-appliers
meta.replicaAppliers.headlessClusterIp.port integer   3306
meta.replicaAppliers.statefulSet object    
meta.replicaAppliers.statefulSet.endToEndTls object    
meta.replicaAppliers.statefulSet.endToEndTls.enabled   Whether to use end-to-end encryption for MySQL replica applier Pods. This is recommended for high-security use cases. For MySQLds this is especially recommended since they use raw TCP connections and thereby by-pass TLS Ingress-rules. Otherwise, Ingress-TCP can also be configured directly via the Ingress controller (not in this Helmchart). False
meta.replicaAppliers.statefulSet.endToEndTls.filenames object    
meta.replicaAppliers.statefulSet.endToEndTls.filenames.ca [‘string’, ‘null’] Name of the CA file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets.  
meta.replicaAppliers.statefulSet.endToEndTls.filenames.cert string Name of the certificate file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.crt
meta.replicaAppliers.statefulSet.endToEndTls.filenames.key string Name of the key file in the Secret. ONLY overwrite this if you’re not using standard TLS Secrets. tls.key
meta.replicaAppliers.statefulSet.endToEndTls.secretName string Name of the TLS Secret replica-applier-end-to-end-tls
meta.replicaAppliers.statefulSet.endToEndTls.supplyOwnSecret   Whether the Helmchart user will create a TLS Secret outside of this Helmchart. Otherwise we rely on cert-manager to create one. False
meta.replicaAppliers.statefulSet.name string   mysqld-replica-appliers
mgmdPreUpgradeRolloutTimeout string Timeout for kubectl rollout status inside the MGMd pre-upgrade hook (per attempt). Default 5m. Note: Helm’s default helm upgrade --timeout is also 5m and bounds the whole upgrade including this hook — operators running with that default may see Helm’s outer timeout fire first with a generic ‘timed out waiting for the condition’ message instead of this hook’s specific diagnostic. Set Helm’s --timeout higher (e.g. 15m) on slow networks or large image pulls. 5m
mode enum: [install, upgrade, auto, null] Mode of operation for the Helmchart. ‘install’ will always treat the deployment as a new installation, ‘upgrade’ will always treat it as an upgrade. ‘auto’ will treat it as an install if no previous release is found, otherwise as an upgrade. This flag is unset by default. When specified, it takes precedence over the value defined in .Values.global._hopsworks.mode  
mysql object How to initialize MySQL  
mysql.clusterUser string The MySQL user for K8s probes, benchmarks and for the standard my.cnf file. helm
mysql.config object MySQL configuration options  
mysql.config.maxConnectErrors string Maximum number of connection errors before the MySQL server blocks the host. 9223372036854775807
mysql.config.maxConnections integer Maximum number of connections to the MySQL server. 512
mysql.config.maxPreparedStmtCount integer Maximum number of prepared statements. 65530
mysql.credentialsSecretName string Secret name for MySQL users’ passwords mysql-passwords
mysql.exporter object MySQL exporter configuration  
mysql.exporter.enabled boolean   False
mysql.exporter.maxOpenConnections integer Maximum number of open connections to the database per scrape. 1 (default) serializes all collectors onto a single connection; higher values let independent collectors run concurrently but may incur higher load on the database. Should not exceed maxUserConnections. 1
mysql.exporter.maxUserConnections integer   3
mysql.exporter.username string   exporter
mysql.force2410UserGrantMigration boolean Whether to force the execution of the 24.10 user privilege migration job that revokes the SET_USER_ID privilege from users that should not have it. This is useful when the automatic detection fails. False
mysql.sqlInitContent object SQL to run only once at cluster startup. Try to make these scripts idempotent, in case they are re-run by accident. Do so by e.g. using IF NOT EXISTS in the SQL commands. {}
mysql.supplyOwnSecret boolean If set to false, the Helmchart will auto-generate MySQL passwords. When running Global Replication as a secondary cluster, this should be set to true. Otherwise, the replication of ALTER root password will fail the cluster. False
mysql.users array A list of MySQL users and their privileges. []
ndbmtdSequencedRollout object Sequenced (one node group at a time) data node rollouts during upgrades. When enabled, the node-group StatefulSets render updateStrategy.rollingUpdate.partition equal to their replica count, so ‘helm upgrade’ lands new pod templates without restarting anything; a rollout CronJob then unfreezes one node group at a time, waiting for each to converge (all pods on the new revision and ready) before the next. This bounds upgrade exposure to a single node group and stops a bad rollout at the first group. Only takes effect with more than one node group (clusterSize.numNodeGroups > 1): with a single group there is nothing to sequence across and the chart behaves exactly as if disabled. Not applied during in-place restores or on externally managed clusters. Argo CD users with selfHeal enabled must add ignoreDifferences for .spec.updateStrategy.rollingUpdate.partition on node-group-* StatefulSets.  
ndbmtdSequencedRollout.enabled boolean Enable the partition freeze and the rollout CronJob (they always render together). With this on, a successful ‘helm upgrade’ means the new specs are recorded and the rollout is in progress; completion is observable on the StatefulSets (updateRevision == currentRevision on every node group) rather than in the release status. Disabling the flag removes the partition field, so any still-pending update then rolls all node groups concurrently (the pre-feature behavior) - disable during a quiet period or after confirming no update is pending. False
ndbmtdSequencedRollout.perGroupStallTimeoutMinutes integer Minutes an unfrozen node group may stay unconverged before the rollout CronJob reports a stall (logged on every run) and pauses; no further groups are unfrozen while the stalled group keeps trying. Note the next ‘helm upgrade’ (e.g. a fixed image) re-freezes every group, the stalled one included (Helm restores the rendered partition over the live value); the CronJob then delivers the fix by unfreezing the broken group again on the next run, in preference to healthy ones, and the StatefulSet controller replaces its dead pod. This is an alerting threshold - nothing is killed when it fires. 0 derives it from activeDataReplicas x timeoutsMinutes.ndbmtdStartupProbe plus 30 minutes slack. 0
ndbmtdSequencedRollout.reconcileIntervalMinutes integer How often the rollout CronJob runs, in minutes. Each run re-freezes converged node groups and unfreezes at most one pending group, so this adds at most one interval of latency per node-group boundary - noise against recovery times measured in hours. 3
ndbmtdSequencedRollout.suspendWhenIdle boolean When a run finds every node group converged and frozen, the rollout CronJob suspends itself so nothing at all runs while idle. Any ‘helm upgrade’ or ‘helm rollback’ turns it back on: the chart renders suspend: false and Helm resets live fields to their rendered values. Only takes effect when ‘mode’ is unset or ‘auto’ (plain Helm or Flux); when ‘mode’ is set - the Argo CD convention - the CronJob stays always-on, because Argo’s sync would either keep re-enabling it (saving nothing) or, with ignoreDifferences on the CronJob’s .spec.suspend, never re-enable it. WARNING: while suspended, a node-group spec change applied outside Helm (plain kubectl) stays frozen until the next helm operation or a manual wake: kubectl patch cronjob rondb-ndbmtd-sequenced-rollout –type merge -p ‘{“spec”:{“suspend”:false}}’. Pair with a revision-age alert (kube_statefulset_status_update_revision != kube_statefulset_status_current_revision with an age threshold) as the safety net. Set false to keep the CronJob always running. True
ndbmtdSettleWait object Pre-start settle wait for data nodes, protecting rolling restarts. During a roll, Kubernetes deletes a node group’s second pod only after observing the first replacement Ready; that observation spread (measured 2.6-10.4s and set by the kubelet/API-server publication cycle, which the chart cannot tune) can overlap the window in which an earlier replacement has connected to the cluster but not yet reached the phase-110 restart barrier, killing it with error 2308 (‘Another node failed during system restart’). Before starting the kernel on a non-initial start, the entrypoint polls the MGMd once a second and proceeds only once no data node has departed the cluster for quietSeconds (nodes reconnecting do not reset the timer: only a departing peer endangers a climbing node, and during a round every replacement’s reconnect would otherwise extend the wait to its cap), so the node begins its climb only after the deletion wave has passed. The wait is bounded by maxWaitSeconds and never blocks a start: an unreachable or hanging MGMd degrades to a fixed fallbackSeconds sleep. Skipped entirely on initial starts.  
ndbmtdSettleWait.fallbackSeconds integer Fixed sleep used instead of the adaptive wait when the MGMd never answers: 3 consecutive failed probes (unreachable, hanging, or empty output) with no successful probe in this wait. A transient MGMd outage after a successful probe does not trigger the fallback - the wait keeps retrying under maxWaitSeconds, with failed probes resetting the quiet timer. 15
ndbmtdSettleWait.maxWaitSeconds integer Cap on the whole settle wait, including the final quietSeconds of quiet. 0 disables the settle wait entirely. 30
ndbmtdSettleWait.probeTimeoutSeconds integer Timeout for each ndb_mgm membership probe. 5
ndbmtdSettleWait.quietSeconds integer Seconds without any data-node departure before the node starts (arrivals are ignored). Must exceed the largest gap between consecutive pod deletions within a rollout round, or the wait provides no protection. The default of 8 is calibrated to ONE measured cluster (max 7.4s gap over 66 rolls at 10 node groups on MicroK8s); the gap is set by the control plane’s readiness-observation latency, not by RonDB, so it MUST be re-derived on a different control plane, larger cluster, or slower hardware - measure the deletion-timestamp gaps within one rollout round and set this above the maximum. 8
networkPolicy object    
networkPolicy.mgmds object    
networkPolicy.mgmds.enabled boolean Whether to limit ingress for MGMd pods True
networkPolicy.mgmds.ingressSelectors array   []
networkPolicy.ndbmtds object    
networkPolicy.ndbmtds.enabled boolean Whether to limit ingress for data node pods. If there is an empty API slot in the config.ini, any host can connect to them. True
networkPolicy.ndbmtds.ingressSelectors array   []
nodeSelector object This ensures that Kubernetes schedules pods only onto nodes that match all the specified labels.  
nodeSelector.backup object   {}
nodeSelector.mgmd object   {}
nodeSelector.mysqld object   {}
nodeSelector.ndbmtd object   {}
nodeSelector.rdrs object   {}
podDisruptionBudget object PodDisruptionBudget configuration per service. Ensures pod availability during voluntary disruptions like node drains and EKS node group upgrades. For single-replica deployments (effective replicas == 1), the PDB is not created even if minAvailable is 1, to avoid blocking node drains. For multi-replica deployments (effective replicas > 1), template rendering will fail if minAvailable is greater than or equal to the effective replica count, because such a PDB would prevent voluntary disruptions. The effective replica count used in these checks is the configured minimum replica count for each service (for example, clusterSize.minNumMySQLServers / clusterSize.minNumRdrs), not any dynamically autoscaled replica count at runtime.  
podDisruptionBudget.mysqld object    
podDisruptionBudget.mysqld.enabled boolean   True
podDisruptionBudget.mysqld.minAvailable integer   1
podDisruptionBudget.ndbmtd object    
podDisruptionBudget.ndbmtd.enabled boolean   True
podDisruptionBudget.ndbmtd.minAvailable integer   1
podDisruptionBudget.rdrs object    
podDisruptionBudget.rdrs.enabled boolean   True
podDisruptionBudget.rdrs.minAvailable integer   1
priorityClass string   rondb-high-priority
rdrs object    
rdrs.externalMetadataCluster object RDRSs will always be in the cluster of the data, not the metadata  
rdrs.externalMetadataCluster.mgmds array   []
rdrs.externalMetadataCluster.slotsPerNode integer   1
rdrs.featureStore object Feature store settings of every RDRS pod, rendered as the FeatureStore section of rest_api.json only when a key is set, so RDRS images that predate a key keep starting. When installed through the Hopsworks chart, the path is rondb.rondb.rdrs.featureStore.  
rdrs.featureStore.metadataCachePreloadThreads [‘integer’, ‘null’] Threads that preload the feature view metadata cache from RonDB in parallel at startup (FeatureStore.FeatureStoreMetadataCache.PreloadThreads); the startup probe passes only once preloading is done. At least 1. RDRS default 3.  
rdrs.hpa object Horizontal Pod Autoscaler for RDRS  
rdrs.hpa.additionalMetrics array Additional metrics to use for the HPA. This is useful for custom metrics that are not supported by default. []
rdrs.internal object Request handling, scan diagnostics and memory settings of every RDRS pod, rendered as the Internal section of rest_api.json. Each key is rendered only when set, and the section only when at least one key is set, so RDRS images that predate a key keep starting (they reject unknown keys). DisableTransparentHugePages, MaxHttpReqSize, MaxBuffers, BufferPoolSharePercent, BufferShrinkAfterS, MaxBlobTextValueBytes, MaxOperationsPerBatchRequest and MaxOperationsPerNdbExecute need RDRS 26.02.12 or newer. When a key is null, RDRS uses its own default; for maxBuffers that default (0) derives the cap from the pod’s memory limit. The request and response buffer sizes are not settings: RDRS computes them from the RonDB row limits (ReqBufferSize and RespBufferSize were removed from RDRS in RONDB-1144). When installed through the Hopsworks chart, the path is rondb.rondb.rdrs.internal.  
rdrs.internal.bufferPoolSharePercent [‘integer’, ‘null’] Share of the pod’s memory limit the buffer pools, together with the JSON responses written from them, may use when maxBuffers is derived. RDRS default 50; the rest is left for the JSON parse buffers, the NDB API and the process itself, so keep the memory limit at 2 GiB or more.  
rdrs.internal.bufferShrinkAfterS [‘integer’, ‘null’] Seconds of idle time after which buffers above preAllocatedBuffers are unmapped and returned to the OS. 0 disables the shrink. Chart default 900 (15 minutes), so a pool that serves bursts some minutes apart keeps its buffers; this is the one Internal key the chart renders by default. null leaves the RDRS default, 300 (five minutes); RDRS images before 26.02.12 reject the key, so set it to null with them. 900
rdrs.internal.disableTransparentHugePages [‘boolean’, ‘null’] Internal.DisableTransparentHugePages. RDRS 26.02.12 and newer opts its process out of transparent huge pages at startup (prctl PR_SET_THP_DISABLE); false allows THP again. On nodes with transparent_hugepage/enabled=always, khugepaged collapses the sparse memory of an idle RDRS into resident 2 MiB pages until the pod reaches its memory limit and is restarted by its probes, with no traffic and nothing logged. Leave it null unless THP is wanted. Images before 26.02.12 do not opt out and reject the key: leave it null with them and set transparent_hugepage/enabled=madvise on the nodes. RDRS default true.  
rdrs.internal.maxBlobTextValueBytes [‘integer’, ‘null’] Largest BLOB or TEXT value, in stored bytes, that a read returns (Internal.MaxBlobTextValueBytes). A read of a larger value fails with 413 naming the column; in a batch only that operation fails. 0 means no limit. RDRS default 2097152 (2 MiB).  
rdrs.internal.maxBuffers [‘integer’, ‘null’] Cap on the buffers of each kind the pool may hold; a request that needs more is answered 503 “buffer pool exhausted”. 0 or null: derived from the pod’s memory limit and bufferPoolSharePercent. When non-zero, it must be at least 2 and at least preAllocatedBuffers (RDRS default 128); the chart fails the render otherwise, as rdrs2 would refuse to start.  
rdrs.internal.maxHttpReqSize [‘integer’, ‘null’] Maximum HTTP body size of a REST request in bytes (Internal.MaxHttpReqSize; RDRS images before 26.02.12 call it maxReqSize); larger bodies are rejected before RDRS parses them. Every worker thread keeps a parse buffer of this size, so rest.numThreads times this value is part of the pod’s memory budget. At least 256. RDRS default 1048576 (1 MiB).  
rdrs.internal.maxOperationsPerBatchRequest [‘integer’, ‘null’] Largest number of operations one batch request may carry (for a batch feature store request: entries); larger batches are answered 413 before any buffer is taken. Large batches of wide rows can take most of a 2 GiB pod’s buffer pool; raise the RDRS memory limit for such workloads. RDRS default 4096.  
rdrs.internal.maxOperationsPerNdbExecute [‘integer’, ‘null’] Operations of a batch request RDRS sends to NDB in one execute round; not a cap on the batch request (see maxOperationsPerBatchRequest). Between 50 and 512. RDRS default 128. Replaces BatchMaxSize, which RDRS 26.02.12 and newer no longer reads.  
rdrs.internal.operationIdMaxSize [‘integer’, ‘null’] Maximum length of an operation ID string in a batch request (Internal.OperationIDMaxSize). At most 4096. RDRS default 256.  
rdrs.internal.preAllocatedBuffers [‘integer’, ‘null’] Request and response buffers of each kind mapped at startup and never released by the idle shrink. RDRS default 128.  
rdrs.internal.scanRespBufferSize [‘integer’, ‘null’] Initial reservation for the JSON of a scan response, in bytes; the buffer grows when a response exceeds it. At least 1024. RDRS default 262144 (256 KiB).  
rdrs.internal.scanTimingEnabled [‘boolean’, ‘null’] Collect scan timing metrics: a per-scan timing breakdown and a circular buffer of slow scans for diagnostics. RDRS default false.  
rdrs.internal.slowScanBufferSize [‘integer’, ‘null’] Number of slow scan entries kept in the circular buffer (needs scanTimingEnabled). RDRS default 1000.  
rdrs.internal.slowScanThresholdUs [‘integer’, ‘null’] Scans taking longer than this many microseconds are recorded in the slow scan buffer (needs scanTimingEnabled). RDRS default 10000 (10 ms).  
rdrs.log object Logging of every RDRS pod, rendered as the Log section of rest_api.json. The pod logs to stdout, so the log file keys (FilePath, MaxSizeMb, MaxBackups, MaxAge) are not exposed. When installed through the Hopsworks chart, the path is rondb.rondb.rdrs.log.  
rdrs.log.level enum: [panic, fatal, error, warn, warning, info, debug, trace, null] Log level (Log.Level), rendered only when set; null leaves RDRS at its own default, warn. Current rdrs2 releases parse the key but do not act on it (logging goes through the NDB event logger at a fixed level).  
rdrs.maxKeepaliveRequests integer Maximum number of requests served on one keep-alive connection to the RDRS main port; after it the connection is closed gracefully (Connection: close). 0 (the default) disables the limit. A Kubernetes Service balances per TCP connection, so long-lived connections keep the skew that builds up after a rolling restart; bounding their lifetime lets clients re-balance. Each reconnect costs a TCP+TLS handshake: use a high value (1000 recommended, not below 500) and only where post-restart skew is observed. Does not apply to the probe port. Requires an RDRS image with REST.MaxKeepaliveRequests support (releases 26.02.11 and newer on the 26.02 line); at 0 the key is not emitted, so older images keep working. 0
rdrs.probePort object Dedicated RDRS probe listener. It serves only the ping and health endpoints, from its own thread, so Kubernetes probes keep being answered while every worker thread is blocked on data-node operations (a stalled data node otherwise fails the liveness probe of all RDRS pods at once). The probe port performs NO authentication, regardless of the PingRequiresAuth/HealthRequiresAuth settings. It is not published as a port of any Service or Ingress, but like any pod port it is reachable via pod IPs and the headless Service’s DNS records; where isolation is required, enforce it with a NetworkPolicy. Requires an RDRS image with REST.ProbePort support (releases 26.02.11 and newer on the 26.02 line): older images reject the unknown config keys at startup, so set enabled to false for pinned older images. Trade-off: the probe port answers as long as the process lives, so an RDRS whose worker threads are permanently wedged is not restarted by liveness.  
rdrs.probePort.enabled boolean Serve ping/health on the dedicated probe port and point the startup, liveness and readiness probes at it (ping answers 503 until the main port accepts connections, so startup semantics are unchanged). false emits no probe configuration keys and points all probes back at the main port: the escape hatch for pinned RDRS images that predate REST.ProbePort. True
rdrs.probePort.port integer TCP port of the dedicated probe listener. Must differ from the main REST port (4406). 4407
rdrs.probes object Timings of the RDRS container probes; the HTTP path, port and scheme are set by the chart. When installed through the Hopsworks chart, the path is rondb.rondb.rdrs.probes. A probe gives up after roughly (failureThreshold - 1) * periodSeconds + timeoutSeconds of consecutive failures.  
rdrs.probes.liveness object Checks /ping and restarts RDRS when it keeps failing. With rdrs.probePort.enabled (the default) /ping is answered from the dedicated probe thread, which keeps responding through data-node failures, so the defaults are ample. With probePort.enabled=false /ping shares the worker threads: while a failed data node has not yet been declared dead, requests touching it block and /ping cannot answer. Detection takes ~25 seconds per data node, so in that mode size (failureThreshold - 1) * periodSeconds + timeoutSeconds above ~25 seconds per data node that can go silent at once, plus ~40 seconds. The defaults give ~115 seconds; restarting the data nodes of 8 node groups in parallel needs failureThreshold 30 (~295 seconds).  
rdrs.probes.liveness.failureThreshold integer   12
rdrs.probes.liveness.initialDelaySeconds integer   5
rdrs.probes.liveness.periodSeconds integer   10
rdrs.probes.liveness.timeoutSeconds integer   5
rdrs.probes.readiness object Checks /health. A pod that keeps failing is removed from the Service after ~13 to 18 seconds with the defaults; connections it already holds stay open. More than one failure is required so that a single slow check under load does not take the pod out of the Service.  
rdrs.probes.readiness.failureThreshold integer   3
rdrs.probes.readiness.initialDelaySeconds integer   5
rdrs.probes.readiness.periodSeconds integer   5
rdrs.probes.readiness.timeoutSeconds integer   3
rdrs.probes.startup object Checks /ping until RDRS first answers; liveness and readiness only start after it passes. RDRS opens its port once it has preloaded its caches from RonDB, about 25 seconds with a few hundred feature views. Raise failureThreshold if that preload takes longer than the ~57 seconds allowed.  
rdrs.probes.startup.failureThreshold integer   11
rdrs.probes.startup.initialDelaySeconds integer   5
rdrs.probes.startup.periodSeconds integer   5
rdrs.probes.startup.timeoutSeconds integer   2
rdrs.rateLimit object USER rate limiting of the NDB traffic of every RDRS pod (RONDB-978), rendered as the RateLimit section of rest_api.json only when a key is set, so RDRS images that predate it keep starting. The identity is always the Hopsworks API key of the request: RateLimit.Identity has no other legal value and is not exposed. When installed through the Hopsworks chart, the path is rondb.rondb.rdrs.rateLimit.  
rdrs.rateLimit.enable [‘boolean’, ‘null’] Tag the NDB transactions of REST requests with the request’s API key so the data nodes enforce USER rate limits. The data nodes must run with ActivateRateLimits, and an identity without a provisioned USER entity runs unmetered. RDRS default false.  
rdrs.rateLimit.fullApiKey [‘boolean’, ‘null’] Use the full API key as the rate limit identity (RateLimit.FullAPIKey) instead of its prefix. RDRS default false.  
rdrs.rest object HTTP server settings of every RDRS pod, rendered into the REST section of rest_api.json next to the chart-managed listener keys (ServerIP, ServerPort, ProbeEnable, ProbePort). Each key is rendered only when set, so RDRS images that predate a key keep starting (they reject unknown keys). rdrs.maxKeepaliveRequests and rdrs.uploadPath are the same kind of key and stay where they are. When installed through the Hopsworks chart, the path is rondb.rondb.rdrs.rest.  
rdrs.rest.idleConnectionTimeoutS [‘integer’, ‘null’] Seconds a keep-alive connection on the main port may sit idle before RDRS closes it; 0 keeps the built-in 60 second timeout. Complements rdrs.maxKeepaliveRequests for clients that hold connections open but send rarely. Does not apply to the probe port. Requires an RDRS image with REST.IdleConnectionTimeoutS support (releases 26.02.11 and newer on the 26.02 line). RDRS default 0.  
rdrs.rest.numThreads [‘integer’, ‘null’] Worker threads of the RDRS HTTP server (REST.NumThreads). Each thread holds a JSON parse buffer of internal.maxHttpReqSize bytes (1 MiB by default), so the thread count is part of the pod’s memory budget. Between 2 and 991. RDRS default 64.  
rdrs.rest.useCompression [‘boolean’, ‘null’] Send responses gzip-compressed. RDRS default true.  
rdrs.rest.useSingleTransaction [‘boolean’, ‘null’] Run all operations of a batch request in one NDB transaction. RDRS default true.  
rdrs.rondb object Connection and retry settings of every RDRS pod towards RonDB. The chart renders each set key into BOTH the RonDB (data) and the RonDBMetadataCluster (metadata) sections of rest_api.json, which have the same keys; the management server addresses, connection pool sizes and node IDs of both sections come from rondbConfig and rdrs.externalMetadataCluster. Each key is rendered only when set. When installed through the Hopsworks chart, the path is rondb.rondb.rdrs.rondb.  
rdrs.rondb.connectionRetries [‘integer’, ‘null’] Attempts to connect to the cluster before RDRS gives up. RDRS default 5.  
rdrs.rondb.connectionRetryDelayInSec [‘integer’, ‘null’] Seconds to wait after a failed connection attempt before trying again. RDRS default 5.  
rdrs.rondb.opRetryInitialDelayInMS [‘integer’, ‘null’] Delay in milliseconds before the first retry of an operation. RDRS default 500.  
rdrs.rondb.opRetryJitterInMS [‘integer’, ‘null’] Random jitter in milliseconds added to each retry delay. RDRS default 100.  
rdrs.rondb.opRetryOnTransientErrorsCount [‘integer’, ‘null’] Times an operation that failed with a transient NDB error is retried. RDRS default 3.  
rdrs.security object    
rdrs.security.apiKey object    
rdrs.security.apiKey.cacheRefreshIntervalMS integer How often the API key cache refreshes project associations from the database (in milliseconds). Lower values reduce staleness when project memberships change but increase database load. 180000
rdrs.security.apiKey.preloadThreads [‘integer’, ‘null’] Threads that preload the API key cache from RonDB in parallel at startup (Security.APIKey.PreloadThreads); the startup probe passes only once preloading is done. At least 1. RDRS default 3. Rendered only when set, so RDRS images that predate the key keep starting.  
rdrs.ttlPurge object TTL purge worker settings of every RDRS pod, rendered as the TTLPurge section of rest_api.json. The section is rendered only when at least one field is set, because RDRS older than RonDB 26.02.9 rejects the TTLPurge key and does not start. Changes reach running pods only when they restart; a cluster-wide window in the mysql.ttl_purge_ctrl table takes precedence over activeWindow and needs no restart. When installed through the Hopsworks chart, the path is rondb.rondb.rdrs.ttlPurge. Unknown fields fail the render, so a misspelled field cannot silently leave purging running around the clock.  
rdrs.ttlPurge.activeWindow [‘string’, ‘null’] Daily UTC window during which the TTL purge worker deletes expired rows, formatted “HH:MM-HH:MM” (e.g. “03:00-05:00”); it wraps past midnight when start > end (e.g. “23:00-02:00”). Start and end must differ. When null or empty, purging runs around the clock. A valid window in mysql.ttl_purge_ctrl (ctrl_id 2/3) takes precedence.  
rdrs.ttlPurge.enable [‘boolean’, ‘null’] Whether the RDRS pods run the TTL purge worker, which deletes expired rows of TTL tables. When null, RDRS decides (enabled). Can still be changed per pod at runtime through PUT /0.1.0/ttl-purge/config, until the pod restarts.  
rdrs.uploadPath string Writable directory where RDRS buffers HTTP request bodies larger than 64KiB. The container’s working directory is not writable (RDRS runs as uid 1000): without this, every startup logs 256 ‘Permission denied’ errors and oversized bodies are silently read as empty. Requires an RDRS image with REST.UploadPath support (releases 26.02.11 and newer on the 26.02 line); set to the empty string for pinned older images, which reject the unknown key. /tmp/rdrs-uploads
resources object Vertical cluster size  
resources.limits object Kubernetes resource limits  
resources.limits.cpus object CPU resources per RonDB service type  
resources.limits.cpus.benchs number   2
resources.limits.cpus.mgmds number   0.2
resources.limits.cpus.mysqldExporters number   0.2
resources.limits.cpus.mysqlds number   2
resources.limits.cpus.ndbmtds number   2
resources.limits.cpus.rdrs number   2
resources.limits.cpus.restore number   1
resources.limits.memory object Memory resources per RonDB service type  
resources.limits.memory.benchsMiB integer   500
resources.limits.memory.mysqldExportersMiB integer   100
resources.limits.memory.mysqldMiB integer This can usually be kept at the default independent of the load 1400
resources.limits.memory.ndbmtdsMiB integer It is recommended to keep this above 5GiB, otherwise some memory parts will be configured manually. 5000
resources.limits.memory.rdrsMiB integer   2048
resources.requests object Kubernetes resource requests; Note that data nodes will only apply limits, not requests  
resources.requests.cpus object CPU resources per RonDB service type  
resources.requests.cpus.benchs number   1
resources.requests.cpus.mgmds number   0.2
resources.requests.cpus.mysqldExporters number   0.02
resources.requests.cpus.mysqlds number   1
resources.requests.cpus.rdrs number   1
resources.requests.memory object Memory resources per RonDB service type  
resources.requests.memory.benchsMiB integer   100
resources.requests.memory.mysqldExportersMiB integer   50
resources.requests.memory.mysqldMiB integer This can usually be kept at the default independent of the load 650
resources.requests.memory.rdrsMiB integer   2048
resources.requests.storage object Volume specifications  
resources.requests.storage.binlogGiB integer Keep in mind that this size needs to survive the retention period of the binlog files 4
resources.requests.storage.classes object Storage classes  
resources.requests.storage.classes.binlogFiles [‘string’, ‘null’] Storage class name for MySQLd binlog volumes in global replication  
resources.requests.storage.classes.default [‘string’, ‘null’] Default storage class name for all volumes  
resources.requests.storage.classes.diskColumns [‘string’, ‘null’] Storage class name for the data node disk columns volume  
resources.requests.storage.classes.mgmd [‘string’, ‘null’] Storage class name for Management server  
resources.requests.storage.diskColumnGiB integer This depends on how much data the user is expecting to place on disk 2
resources.requests.storage.logGiB integer   2
resources.requests.storage.mgmdGiB integer The size of the statefulSet persistent volume for the RonDB management node. It will be used in new installations or in case of lookup function failing during upgrade in argo deployments. 1
resources.requests.storage.ndbmtdGiB integer The size of the statefulSet persistent volume for the RonDB data nodes. It will be used in new installations or in case of lookup function failing during upgrade in argo deployments. 30
resources.requests.storage.redoLogGiB integer 64GiB is recommended for optimal performance 4
resources.requests.storage.relayLogGiB integer   2
resources.requests.storage.undoLogsGiB integer 64GiB is recommended for good performance 4
restoreFromBackup object Whether to restore a backup on the cluster  
restoreFromBackup.backupId [‘string’, ‘null’] The native backup ID for the backup to restore  
restoreFromBackup.excludeDatabases array Which databases to exclude from the native backup []
restoreFromBackup.excludeTables array Which tables to exclude from the native backup. Use the format: database.table []
restoreFromBackup.forceDataClear [‘boolean’, ‘null’] Confirm that existing data will be destroyed during in-place restore.  
restoreFromBackup.inPlace [‘boolean’, ‘null’] Enable in-place restore on existing cluster. Requires forceDataClear=true.  
restoreFromBackup.objectStorageProvider enum: [s3]   s3
restoreFromBackup.pathPrefix string Prefix of RonDB backup in the configured bucket rondb_backup
restoreFromBackup.s3 object    
restoreFromBackup.s3.bucketName [‘string’, ‘null’]    
restoreFromBackup.s3.endpoint [‘string’, ‘null’]    
restoreFromBackup.s3.keyCredentialsSecret object    
restoreFromBackup.s3.keyCredentialsSecret.key [‘string’, ‘null’] Key in the Secret  
restoreFromBackup.s3.keyCredentialsSecret.name [‘string’, ‘null’] Name of the Secret  
restoreFromBackup.s3.provider [‘string’, ‘null’]    
restoreFromBackup.s3.region [‘string’, ‘null’]    
restoreFromBackup.s3.secretCredentialsSecret object    
restoreFromBackup.s3.secretCredentialsSecret.key [‘string’, ‘null’] Key in the Secret  
restoreFromBackup.s3.secretCredentialsSecret.name [‘string’, ‘null’] Name of the Secret  
restoreFromBackup.s3.serverSideEncryption enum: [aws:kms, aws:kms:dsse, AES256, null]    
rondbConfig object Configurations for RonDB’s config.ini. Memory configurations are in binary SI units (i.e. 1G = 1GiB = 1024MiB).  
rondbConfig.ActivateRateLimits integer Activate rate limits handling 0
rondbConfig.BackupLogBufferSize string Buffer that records writes occurring during an online backup; the backup aborts if it fills. Default 16M; increase (e.g. 256M) for write-heavy clusters. See https://docs.rondb.com/rondb_backup/. 16M
rondbConfig.DataMemory [‘string’, ‘null’] Memory available for storing in-memory database records on each data node, in bytes (with optional binary SI suffix, e.g. ‘4G’). When unset, RonDB’s AutomaticMemoryConfig sizes this from the container’s memory; only set explicitly to override automatic sizing. Only applied if explicitly set.  
rondbConfig.DiskPageBufferMemory [‘string’, ‘null’] DiskPageBufferMemory are used by disk columns. This is the page cache that contains disk pages when they are in memory. By default it is not defined.  
rondbConfig.EmptyApiSlots integer We need at least 1 for the MySQLd setup job. Otherwise this is for services that are not handled here, e.g. HopsFS 8
rondbConfig.FullRestartLogs [‘boolean’, ‘null’] Enable full restart logs (RonDB-specific). RonDB’s release-build default is false.  
rondbConfig.HeartbeatIntervalDbApi integer Each data node sends heartbeat signals to each MySQL server (SQL node) to ensure that it remains in contact. If a MySQL server fails to send a heartbeat in time it is declared “dead,” in which case all ongoing transactions are completed and all resources released. The SQL node cannot reconnect until all activities initiated by the previous MySQL instance have been completed. The three-heartbeat criteria for this determination are the same as described for HeartbeatIntervalDbDb. 5000
rondbConfig.HeartbeatIntervalDbDb integer One of the primary methods of discovering failed nodes is by the use of heartbeats. This parameter states how often heartbeat signals are sent and how often to expect to receive them. Heartbeats cannot be disabled. After missing four heartbeat intervals in a row, the node is declared dead. Thus, the maximum time for discovering a failure through the heartbeat mechanism is five times the heartbeat interval. 5000
rondbConfig.InitialTablespaceSizeGiB integer InitialTableSpace size in GiB. By default, it is set to -1, which enforces the initial tablespace to use the entire diskColumnGiB space. If set to 0, the same behaviour applies and the diskColumnGiB is used. -1
rondbConfig.LongMessageBuffer [‘string’, ‘null’] Internal buffer used for passing long messages within and between nodes, in bytes (with optional binary SI suffix). NDB’s built-in default is 64M. Only applied if explicitly set.  
rondbConfig.MaxDMLOperationsPerTransaction integer   32768
rondbConfig.MaxDiskWriteSpeed [‘string’, ‘null’] Maximum disk write speed (bytes/sec, total across all ldm threads) used by local checkpoints during normal operation, i.e. when no node is restarting. The adaptive algorithm may write more slowly than this ceiling based on CPU usage and REDO log IO lag, but will not exceed it. Only applied if explicitly set; otherwise RonDB’s built-in default is used. See https://docs.rondb.com/rondb_advanced_fs_config/.  
rondbConfig.MaxNoOfAttributes [‘integer’, ‘null’]    
rondbConfig.MaxNoOfConcurrentOperations integer   65536
rondbConfig.MaxNoOfSchemaObjects [‘integer’, ‘null’] Maximum total number of schema objects (tables, ordered indexes, unique hash indexes, etc.) that a data node may allocate. Increase this when the application needs more than the default cap of 20,320 table objects. Only applied if explicitly set; otherwise RonDB’s built-in default is used. See https://docs.rondb.com/automatic_memory_config/.  
rondbConfig.MaxNoOfTables [‘integer’, ‘null’]    
rondbConfig.MaxNoOfTriggers [‘integer’, ‘null’]    
rondbConfig.MaxRRGroupSize [‘integer’, ‘null’] Max size of a Round Robin (RR) group. RonDB default is 8; allowed range is 8 to 32.  
rondbConfig.MySQLdSlotsPerNode integer   4
rondbConfig.OsCpuOverhead [‘string’, ‘null’] Additional OS memory overhead for the RonDB datanode containers. This is multiplied by the number of CPUs. Also only set this if the container has less than 5GiB of memory.  
rondbConfig.OsStaticOverhead [‘string’, ‘null’] Memory overhead for the RonDB datanode containers. Only set this if the container has less than 5GiB of memory.  
rondbConfig.PartitionsPerNode [‘integer’, ‘null’] Number of partitions per data node used when creating new tables. When null, RonDB chooses based on AutomaticThreadConfig / NumCPUs (typically the number of LDM threads). Only affects tables created after the change; existing tables are not repartitioned.  
rondbConfig.RdrsMetadataSlotsPerNode integer We use additional cluster connections for metadata 1
rondbConfig.RdrsSlotsPerNode integer The number of cluster connections we support via the RDRS 1
rondbConfig.RedoBuffer [‘string’, ‘null’]    
rondbConfig.ReplicationMemory [‘string’, ‘null’]    
rondbConfig.ReservedConcurrentOperations [‘integer’, ‘null’]    
rondbConfig.SchemaMemory [‘string’, ‘null’]    
rondbConfig.SharedGlobalMemory [‘string’, ‘null’]    
rondbConfig.TimeBetweenGlobalCheckpoints [‘integer’, ‘null’] Time in milliseconds between group commits of transactions to disk. RonDB’s built-in default is 2000 ms. Only applied if explicitly set.  
rondbConfig.TotalMemoryConfig [‘string’, ‘null’] The total memory configured by RonDB datanode. By default it is not defined and memory is calculated automatically.  
rondbConfig.TransactionDeadlockDetectionTimeout integer Time transaction can spend executing within data node 1500
rondbConfig.TransactionInactiveTimeout integer Milliseconds that application waits before executing another part of transaction 15000
rondbConfig.TransactionMemory [‘string’, ‘null’]    
rondbConfig.UseOnlyIPv4 [‘boolean’, ‘null’] When true, restricts all RonDB cluster connections to IPv4 sockets only. Applied under both [NDBD DEFAULT] and [MYSQLD DEFAULT] so it covers data nodes, MySQLds (including binlog/replica appliers/DDL), RDRS, and other API clients. Introduced in RonDB 21.04.5 for Dolphin SuperSockets compatibility.  
rondbConfig.UseTcInRRGroup [‘boolean’, ‘null’] When true, each recv thread distributes connections only to TC threads within the same Round Robin (RR) group; when false, it distributes them across all TC threads. RonDB default is true.  
serviceAccountAnnotations object   {}
skipMgmdPreUpgradeRollout boolean If true, skip the pre-upgrade hook that rolls MGMd to the target image and config before the rest of the chart upgrades. The hook exists to keep at least one ArbitrationRank=1 node reachable while the API tier (mysqld, rdrs) is also rolling, preventing data-node arbitration loss (NDB Error 2305) on chart-wide upgrades. Set this to true only as an escape hatch if the hook itself is misbehaving on your cluster. False
staticCpuManagerPolicy boolean Whether the Kubernetes cluster has been configured with a static CPU manager policy. This is an optimization for RonDB data nodes. These have a scheduler which executes jobs within hundreds of microseconds (very quick). If the data nodes are pinned to CPUs, they can run CPU spnning to avoid context switching inbetween jobs. False
terminationGracePeriodSeconds [‘object’, ‘integer’] Pod terminationGracePeriodSeconds per RonDB service type. The chart’s daemons stop on SIGTERM, so this is a ceiling, not a wait: a pod is removed as soon as its processes have exited. The legacy integer form (charts up to 26.2.19) still validates (minimum 10) and keeps its meaning: it overrides the data nodes only, every other component keeps 30. Helm drops null keys before schema validation: a null whole key falls back to the defaults, a null component key is rejected (all six keys are required; partial values files still work because Helm merges in the chart defaults).  
terminationGracePeriodSeconds.binlogServers integer Binlog server MySQLds; see mysqlds. 30
terminationGracePeriodSeconds.mgmds integer MGMd stops within seconds; this matches the Kubernetes default. 30
terminationGracePeriodSeconds.mysqlds integer Used by MySQLds and DDL MySQLds; mysqld stops within seconds under no load, but allow time for open transactions to close. 30
terminationGracePeriodSeconds.ndbmtds integer Data nodes run a managed stop on SIGTERM: deactivate through the MGMd, then node shutdown with handover. Large nodes additionally need roughly 2 minutes per TB of data node memory for the kernel to tear the process down, so raise this for nodes above 1TB. Stops of several data nodes serialize at the MGMd. When deleting the entire cluster the MGMd may already be gone; data nodes then retry the deactivate for up to 60s before stopping directly. 300
terminationGracePeriodSeconds.rdrs integer RDRS stops within a few seconds; this matches the Kubernetes default. 30
terminationGracePeriodSeconds.replicaAppliers integer Replica applier pods: the controller container stops its run_applier.sh worker on SIGTERM, the pod’s mysqld receives SIGTERM directly. 30
timeoutsMinutes object Using minutes for easier template addition  
timeoutsMinutes.mysqldStartupProbe integer Maximum time a MySQLd pod (mysqld, ddl mysqld, binlog server, replica applier) is given to start up before Kubernetes restarts its container. 20
timeoutsMinutes.ndbmtdStartupProbe integer Maximum time a ndbmtd pod is given to start up before Kubernetes restarts its container. Node restarts with a lot of data to restore can take long. Must clear the worst-case data reload of the largest supported cluster - a node killed mid-recovery restarts from scratch and loops forever. 240
timeoutsMinutes.restoreNativeBackup integer This does not include downloading the native backups. IMPORTANT; Restoring native backups is NOT done in parallel yet; TODO: Make this dependent on amount of data 120
timeoutsMinutes.singleSetupMySQLds integer This includes the time to start a single MySQLd pod, restoring MySQL metadata and running user-defined MySQL init scripts. 5
tls object General settings how to use encrypted TLS connections with RonDB APIs (MySQL & RDRS).  
tls.caSecretName [‘string’, ‘null’] User-provided TLS Secret. This can be used by the cert-manager as a base to sign further certificates. If not supplied, cert-manager will use a self-signed CA certificate.  
tolerations object These tolerations allow Kubernetes to schedule pods on nodes with matching taints, ensuring proper placement based on cluster policies.  
tolerations.backup array   []
tolerations.mgmd array   []
tolerations.mysqld array   []
tolerations.ndbmtd array   []
tolerations.rdrs array   []