MinervaDB · Cloud Native Database Support · 24×7 SRE for PostgreSQL, MySQL, MariaDB, MongoDB, Redis, Cassandra, ClickHouse and Kafka on Kubernetes

Cloud Native Database Support: Stateful Databases on Kubernetes, Engineered for Failover and Recovery

Kubernetes changes how a database is scheduled, stored, promoted and secured. MinervaDB Cloud Native Database Support is the engineering team that makes those changes safe: we design the operator, storage and zone layout, prove failover and point-in-time recovery with timed drills, and answer Severity-1 incidents in 15 minutes around the clock, on self-managed clusters and on EKS, GKE, AKS and OpenShift.

8database engines supported on Kubernetes
15 minSeverity-1 response, 24×7×365
900+enterprises served by MinervaDB
46cities with delivery presence
200+years of combined leadership experience

Reference architecture

The reference platform behind our Cloud Native Database Support

A cloud native database is a declarative system: desired state lives in Git, a controller reconciles it continuously, storage attaches through an API, and every network path is a policy decision. This is the topology our Cloud Native Database Support engineers design, review and operate most often, shown for PostgreSQL; the same shape applies to the other engines with their own operators.

Cloud Native Database Support reference architecture: GitOps desired state, Kubernetes control plane, database operator, three-zone primary and replicas on CSI volumes, rw and ro Services with a pooler, and a continuous archive to object storage in a separate account

Figure 1. Reference architecture for cloud native database support: GitOps, control plane, operator, three zones with separate data and WAL volumes, pooled rw and ro Services, and an archive outside the cluster's blast radius.

Replicas never share a failure domain

In cloud native database support reviews this is the first check: required anti-affinity on topology.kubernetes.io/zone, not preferred and not by node alone. Three instances in one zone is one instance with extra storage cost.

The write endpoint belongs to the operator

With cloud native database support, applications connect to the rw Service or the pooler, never to a pod address, so a promotion is invisible to clients that reconnect correctly.

The archive lives somewhere else

Under cloud native database support, a backup on the same storage class, in the same account, deletable by the same service account, is a copy rather than a backup. The archive gets its own account and object lock.

Cloud Native Database Support is engine-specific in its details. The table below lists the operators we run most often and what we check before we accept one into production. We support the operator you already run; when a client asks for a recommendation, the rubric in the next section decides, not popularity. For ClickHouse on Kubernetes, our sister company ChistaDATA provides the dedicated ClickHouse practice.

EngineOperators we supportWhat we verify before production
PostgreSQLCloudNativePG, Percona Operator for PostgreSQL, Crunchy PGO, Zalando postgres-operatorFence-before-promote, quorum synchronous replication, timestamp PITR, WAL archive age as a condition
MySQL, MariaDBPercona Operator for MySQL (PXC and group replication), MariaDB Operator, Vitess operatorSplit-brain protection, GTID continuity through failover, ProxySQL or MaxScale routing on promotion
MongoDBPercona Operator for MongoDB, MongoDB Controllers for KubernetesReplica-set member placement by zone, election priorities, oplog window against re-sync time
Redis, ValkeyOperator chosen per workload, or a managed servicePersistence mode, Sentinel or cluster-mode failover behaviour, memory limit versus maxmemory
CassandraK8ssandra (cass-operator)Rack-to-zone mapping, repair scheduling, bootstrap time for a replaced node
KafkaStrimziKRaft controller quorum placement, rack awareness, min.insync.replicas against acks

Operators

Operators and the reconciliation loop in Cloud Native Database Support

An operator is a controller that encodes database operations as software. It watches a custom resource, compares it with the live cluster and issues the smallest set of actions that closes the gap. Every cloud native database support decision is ultimately expressed through that loop, which is why we read operator release notes the way we read engine release notes.

Cloud Native Database Support operator reconciliation loop: desired state in the custom resource, observed state of the live cluster, the diff, the ordered operator actions, and why manual changes are reverted

Figure 2. One pass of the reconciliation loop, with an example spec and a degraded cluster. The ordering of actions is what separates a safe operator from a fast one.

Two consequences follow for cloud native database support. Manual intervention is temporary, because anything changed by hand is reverted unless the resource that describes it changes too. And an operator upgrade is a production change, because the reconciliation logic is what decides whether your primary is fenced correctly. We pin operator versions, rehearse operator upgrades in a staging cluster with the production storage class, and keep them on a separate calendar from engine upgrades. The Kubernetes operator pattern describes the mechanism.

Our operator rubric has five questions. Does it fence before it promotes? Does it restore to a timestamp rather than a segment boundary? Can it roll a minor version without a rebuild? Does it expose replication lag and archive age as status conditions? Is the project openly governed with a published support window? The manifest on the right is the baseline Cloud Native Database Support starts from on CloudNativePG, with quorum synchronous replication, separate WAL storage, required zone anti-affinity and Guaranteed memory.

# CloudNativePG Cluster (operator 1.30.x, Kubernetes 1.37). Example values: size from your own baseline.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: orders-pg
  namespace: db-orders
spec:
  instances: 3
  imageName: ghcr.io/cloudnative-pg/postgresql:17.6     # pin a digest in production
  primaryUpdateStrategy: unsupervised
  postgresql:
    synchronous:
      method: any                 # quorum: ANY 1 of the standbys must confirm
      number: 1
      dataDurability: required    # refuse writes rather than silently go async
    parameters:
      shared_buffers: "8GB"
      max_connections: "300"      # the pooler fans in; backends cost cgroup memory
  storage:
    storageClass: db-gp3-wffc
    size: 400Gi
  walStorage:
    storageClass: db-gp3-wffc
    size: 100Gi
  affinity:
    enablePodAntiAffinity: true
    topologyKey: topology.kubernetes.io/zone
    podAntiAffinityType: required
  resources:
    requests: {cpu: "4", memory: "32Gi"}
    limits:   {memory: "32Gi"}    # memory request = limit; no CPU limit (see throttling)
  superuserSecret:
    name: orders-pg-superuser     # created from your secret manager, never committed

Storage

StatefulSets, PVCs and the CSI path every commit travels

Every durability promise a database makes is a claim about what happened when it called fsync. On Kubernetes that call crosses six layers, and each one can change latency or throughput ceilings without the engine noticing. Cloud Native Database Support instruments all six before anyone touches a database parameter.

Cloud Native Database Support storage path: engine, container filesystem, PersistentVolumeClaim, CSI driver, cloud block device and node, with the tuning lever at each layer and StorageClass placement rules

Figure 3. The fsync path from engine to node, the lever at each layer, and the StorageClass rules cloud native database support enforces for database volumes.

A zonal block volume can attach only to a node in its own zone. If that zone is out of capacity after a node loss, the pod stays Pending rather than moving, so storage topology is part of the availability design. WaitForFirstConsumer makes the scheduler and the provisioner agree on a zone before any volume exists, and reclaimPolicy: Retain keeps a deleted PVC from deleting the data. Since Kubernetes 1.34, VolumeAttributesClass lets us change provisioned IOPS and throughput on a live volume by switching its class, where the CSI driver supports it.

SymptomLikely causeWhat Cloud Native Database Support changes
Commit latency spikes every few hoursBurst-credit exhaustion on a baseline-IOPS volumeProvisioned IOPS class sized for throughput, not capacity
Checkpoint stallsFlush against a throughput-capped deviceSpread checkpoints, raise throughput, separate WAL volume
Pod Pending after node lossZonal volume cannot attach in the surviving zoneZone-aware placement; fail over by replication
Slow restore from snapshotLazily hydrated blocks read on first accessPre-warm, or restore from the archive stream
Disk full despite retentionArchive failing, WAL retained for safetyAlert on archive age, not only on archive errors
# StorageClass and VolumeAttributesClass for database volumes (AWS EBS CSI shown; GA since Kubernetes 1.34)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: db-gp3-wffc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer   # scheduler and volume agree on the zone first
allowVolumeExpansion: true
reclaimPolicy: Retain                     # a deleted PVC must not delete the data
parameters:
  type: gp3
  csi.storage.k8s.io/fstype: xfs
  encrypted: "true"
  kmsKeyId: ${KMS_KEY_ARN}
---
apiVersion: storage.k8s.io/v1
kind: VolumeAttributesClass
metadata:
  name: db-gp3-12k
driverName: ebs.csi.aws.com
parameters:
  iops: "12000"
  throughput: "500"                        # MiB/s; change the PVC's class to re-tier online

High availability

Fence-first failover: the standard Cloud Native Database Support holds every operator to

A promotion that happens before the old writer is fenced produces two primaries and a reconciliation problem no backup can fully undo. Speed without exclusion is worthless, so cloud native database support audits fencing first and promotion time second. The sequence below is the behaviour we require, and the numbers we measure in every drill.

Cloud Native Database Support fence-first automated failover sequence: old primary, operator, best replica, rw Service and application pool swimlanes over an illustrative timeline, with detection, promotion and application recovery measured separately

Figure 4. Fence-first failover across five swimlanes. Timings are illustrative; each cluster's real values come from its own drills.

Cloud Native Database Support game days record three numbers that are routinely confused. Detection time is how long the platform takes to believe the primary is gone, and it is set by lease and probe settings. Promotion time runs from a completed fence to the first write accepted on the new primary. Application recovery time runs from the first client error to the first successful transaction, and includes endpoint propagation, pool eviction and retry backoff. The last number is the one your users feel, and the one a vendor datasheet never quotes.

Synchronous quorum replication decides what a failover can lose. With method: any and number: 1, a commit is acknowledged only after one standby confirms it, so the best candidate holds every acknowledged transaction. With dataDurability: required, the primary stops accepting writes rather than silently degrading to asynchronous when no standby is available. That is a deliberate availability-for-durability trade we agree with each client in writing. When an outage is already in progress, our 24/7 emergency DBA coverage takes the call.

Planned switchovers run through a script with a verification step before, a typed confirmation gate, and validation after. Rollback is the same script targeting the previous primary once it is streaming again.

#!/usr/bin/env bash
# Planned switchover with a confirmation gate. Requires the cnpg kubectl plugin matching the operator version.
set -euo pipefail
NS=db-orders; CL=orders-pg; TARGET=${1:?usage: switchover.sh <target-instance>}

# 1. Verify before: topology, lag and archive health, queried on the current primary
PRIMARY=$(kubectl get cluster "$CL" -n "$NS" -o jsonpath='{.status.currentPrimary}')
kubectl cnpg status "$CL" -n "$NS"
kubectl exec -n "$NS" "$PRIMARY" -c postgres -- psql -At -c \
  "SELECT application_name, sync_state, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes FROM pg_stat_replication;"

# 2. Confirmation gate: nothing changes without an explicit, typed answer
read -r -p "Promote ${TARGET} in ${NS}/${CL}? Type the cluster name to continue: " ANSWER
[[ "$ANSWER" == "$CL" ]] || { echo "aborted, no change made"; exit 1; }

# 3. Act
kubectl cnpg promote "$CL" "$TARGET" -n "$NS"

# 4. Validate after: new primary, rw Service endpoint, replicas streaming again
kubectl get cluster "$CL" -n "$NS" -o jsonpath='{.status.currentPrimary}{"\n"}'
kubectl get endpointslices -n "$NS" -l kubernetes.io/service-name="${CL}-rw" -o wide
kubectl cnpg status "$CL" -n "$NS"
# Rollback: run this script again with the previous primary as TARGET once it is streaming.

Connections

Service routing, pooling and the client half of every failover

Most tickets that arrive as "the database went down" are connection-layer tickets. The database recovered in seconds; the application took minutes because a pool held dead sockets and a retry policy backed off without a cap. Cloud Native Database Support treats the client path as part of the database.

A Service is not a proxy

Cloud Native Database Support starts here: on failover the rw Service endpoint moves. Existing TCP sessions are not migrated, they are broken, and every client must notice quickly and reconnect.

Pool in front of the database

PgBouncer, ProxySQL or MaxScale absorbs reconnect storms, caps backends and gives one place to pause traffic during a switchover. Cloud Native Database Support requires it above a few hundred client connections.

Connections cost cgroup memory

max_connections is a memory budget, not a capacity plan. Each backend is charged to the same container limit that can OOM-kill the primary.

Separate rw and ro pools

Applications that distinguish read and write endpoints lose only the write path during a promotion. Readers keep serving from healthy replicas.

Bounded retry with jitter

Short socket timeouts, a capped retry budget and a health check that runs a real query, not a TCP dial. Only idempotent statements are retried.

Mesh for mTLS, not retries

Where a service mesh exists we use it for mutual TLS and outlier detection. A mesh that retries a non-idempotent write is a data-integrity hazard.

CPU and memory

Requests, limits, QoS and CPU throttling in Cloud Native Database Support

The most common regression we see in cloud native database support work has nothing to do with the engine. It is CPU throttling from a limit that looked generous on a spreadsheet: a checkpoint that briefly needs six cores is held to the quota of two, and the symptom appears as random latency while average CPU looks idle.

Cloud Native Database Support CPU quota throttling model: 100 ms CFS periods, a two-core limit, a checkpoint burst needing six cores, throttled demand pushed into later periods, and the resource settings we recommend

Figure 5. An illustrative model of CFS quota throttling during a checkpoint burst, the metrics that prove it, and the settings cloud native database support applies to stateful pods.

SettingWhat it really doesOur guidance for databases
CPU requestScheduling weight and guaranteed share under contentionSize to observed p95, never below it
CPU limitHard quota per 100 ms period; excess is throttledUsually omit, or set far above the request, and alert on throttled periods
Memory request and limitEviction protection and a hard ceiling that kills, not slowsEqual values for Guaranteed QoS; engine cache plus connections plus 25 percent headroom
Huge pagesSmaller page tables for large shared memoryEnable for large buffer pools; reserve on the node first
PriorityClass and PDBEviction order and voluntary disruption budgetHigh priority; a PDB that never permits quorum loss

Page cache is charged to the container's cgroup, so a database that leans on the OS cache can be evicted for memory it would happily give back. Cloud Native Database Support sizes the engine cache explicitly and alerts on throttling counters rather than on average CPU. The mechanics are in the Kubernetes resource management guide; since Kubernetes 1.35, in-place pod resize lets us raise CPU without a restart, where the operator supports it.

# Share of CFS periods in which a database container was throttled (cAdvisor metrics)
sum by (namespace, pod, container) (
  rate(container_cpu_cfs_throttled_periods_total{namespace=~"db-.*", container="postgres"}[5m])
)
/
sum by (namespace, pod, container) (
  rate(container_cpu_cfs_periods_total{namespace=~"db-.*", container="postgres"}[5m])
)
> 0.05   # alert: more than 5% of periods throttled, sustained for 15 minutes

# Working set against the memory limit: the OOM-kill early warning
max by (pod) (container_memory_working_set_bytes{namespace=~"db-.*", container="postgres"})
/
max by (pod) (kube_pod_container_resource_limits{namespace=~"db-.*", container="postgres", resource="memory"})

Disaster recovery

Multi-zone, multi-region and point-in-time recovery

Zonal redundancy protects against a data-centre failure and costs little beyond careful placement. Regional redundancy changes your consistency model, latency budget and bill. Cloud Native Database Support helps teams choose deliberately, then proves the choice by restoring from the archive on a schedule.

Cloud Native Database Support multi-zone and multi-region topologies with RPO and RTO trade-offs, and the recovery path from base backup and WAL archive in immutable object storage to a verified point-in-time restore

Figure 6. Three topology patterns and the single recovery path that cloud native database support rehearses for all of them.

Whatever the pattern, a standby region needs its own control plane, credentials, image-registry mirror and archive copy. A standby that depends on the primary region's cluster API, secret store or CI system is a replica with extra latency, not a disaster-recovery site. Recovery objectives are written as numbers, rehearsed quarterly and tied to the retention window the archive can actually satisfy.

Restores go into a new cluster, never over the damaged one, and target a timestamp. The manifest restores from the Barman Cloud plugin's object store to the instant before a bad deployment; the SQL is the verification suite Cloud Native Database Support runs before anyone calls a restore successful.

# Point-in-time restore into a NEW cluster (never over the damaged one), Barman Cloud plugin
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: orders-pg-restore
  namespace: db-orders-restore
spec:
  instances: 1
  storage: {storageClass: db-gp3-wffc, size: 400Gi}
  bootstrap:
    recovery:
      source: origin
      recoveryTarget:
        targetTime: "2026-09-29 14:05:00+00"   # the instant before the bad deployment
  externalClusters:
    - name: origin
      plugin:
        name: barman-cloud.cloudnative-pg.io
        parameters:
          barmanObjectName: orders-archive      # ObjectStore resource in a separate account
          serverName: orders-pg
-- Post-restore verification: run on the restored cluster, compare with the recorded pre-incident baseline
SELECT
    now()                                   AS verified_at,
    pg_last_xact_replay_timestamp()         AS last_replayed_commit,
    (SELECT COUNT(*) FROM orders.order_header
      WHERE created_at < '2026-09-29 14:05:00+00')  AS orders_before_target,
    (SELECT MAX(order_id) FROM orders.order_header) AS max_order_id;

-- B-tree and heap consistency for the orders schema (amcheck; read-only, AccessShareLock)
CREATE EXTENSION IF NOT EXISTS amcheck;
SELECT c.relname, bt_index_check(index => c.oid, heapallindexed => true)
FROM pg_class AS c
JOIN pg_namespace AS n ON n.oid = c.relnamespace
JOIN pg_am AS am ON am.oid = c.relam
WHERE c.relkind = 'i' AND am.amname = 'btree' AND n.nspname = 'orders';

Security

Hardening RBAC, secrets, mTLS and network policy

Container platforms default to convenience, so security is an explicit workstream in every cloud native database support engagement. Each control below has appeared as a finding in audits we have run, and each hardened target maps to a Kubernetes primitive you can review in Git.

ControlCommon weak defaultHardened target
NetworkFlat pod networkDefault-deny NetworkPolicy, explicit allows per port
TransportTLS only at the edgemTLS end to end, rotated certificates
CredentialsLong-lived passwords in a SecretExternal secret manager, workload identity, scheduled rotation
Cluster RBACBroad ClusterRole for the operatorNamespaced roles; pods/exec audited and alerted
Pod postureWritable root, privilege escalationRestricted Pod Security Standard, seccomp
ImagesMutable tags from public registriesDigest-pinned, signed, private mirror
Data at restProvider default keyCustomer-managed keys, separate key custody

Auditability is a cloud native database support deliverable. Every privileged action, including an interactive shell into a database pod, produces a durable log entry outside the cluster, retained for the period your regulator expects.

# Default-deny for the database namespace, then one explicit allow: pooler -> database on 5432
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: db-orders
spec:
  podSelector: {}
  policyTypes: [Ingress, Egress]
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-pooler-to-postgres
  namespace: db-orders
spec:
  podSelector:
    matchLabels: {cnpg.io/cluster: orders-pg}
  policyTypes: [Ingress]
  ingress:
    - from:
        - podSelector:
            matchLabels: {cnpg.io/poolerName: orders-pg-pooler-rw}
      ports:
        - {protocol: TCP, port: 5432}
# Replication between instances, operator status checks, DNS and archive egress need their own allows:
# write them before applying default-deny, and test in staging first.

FinOps

The real cost model of databases on Kubernetes

Consolidation usually lowers cost, but not for the reason most business cases claim. The saving comes from bin-packing and from removing per-instance idle capacity and licensing, not from the orchestrator. Cloud Native Database Support publishes the arithmetic behind every recommendation so finance and engineering argue about the same numbers.

Levers that work

Right-size requests from observed p95, then bin-pack node pools. Commit or reserve capacity for the steady baseline only. Tier cold archive data. Keep chatty replicas zone-aware to cut cross-zone transfer. Control metric cardinality. Consolidate small clusters into namespaced tenants with quotas.

Levers that look good and hurt

Shrinking memory limits until the buffer pool thrashes. Spot or preemptible nodes for quorum members. Cutting to two replicas and losing the ability to lose one. Removing the pooler to save a pod, then sizing the primary for thousands of backends.

In cloud native database support cost reviews, cross-zone data transfer and the observability pipeline are the two line items that grow silently, so we report both separately. Where a managed service is cheaper or safer for a workload, we say so; our cloud database optimization and FinOps practice runs these reviews as a standalone engagement, with provider-specific design from our AWS, Google Cloud and Microsoft Azure teams.

Failure modes

Failures our Cloud Native Database Support engineers are called in to diagnose

These are the incident patterns that recur across Kubernetes estates, independent of engine, and the ones cloud native database support is most often escalated for. Each correction is something we can verify with a query, a metric or a drill.

Observed failureUnderlying mechanismCorrection
Two writers accepted transactionsPromotion before the old primary was fenced or its endpoint removedFence-first policy, endpoint gating, timeline or term enforcement
Cluster healthy, application timing outPool holding sockets to a promoted-away podBounded socket timeouts, eviction on error, real-query health checks
Random multi-second latencyCFS throttling during checkpoint or vacuumRemove or widen the CPU limit, alert on throttled periods
OOM kill with free node memoryCgroup limit reached by page cache and per-connection memoryExplicit cache sizing, Guaranteed QoS, connection cap at the pooler
Replica never catches up after node replacementArchive gap and short retention force a full re-cloneRetention sized to clone time; slots with a WAL size limit
Rolling upgrade stalled halfwayPDB blocked eviction while quorum was already degradedCorrect PDB arithmetic; health gate before each roll
Restore succeeded, data was wrongTarget set to a segment boundary, not a timestampTimestamp PITR and the mandatory verification suite
Storage cost doubled, traffic flatOrphaned PVCs and snapshots from failed reconcilesReclaim-policy review, lifecycle rules, orphan reports

Migration

From virtual machines to Kubernetes, with rollback kept cheap

Moving a database onto a container platform changes the operating model, so Cloud Native Database Support plans the migration as seven phases with the legacy primary kept warm as the rollback target until the last one is signed off. We run this path for PostgreSQL, MySQL, MariaDB and MongoDB estates.

Phase 0 · Assess

Inventory

Versions, extensions, SLOs, storage profile, connection topology, compliance scope.

Phase 1 · Design

Blueprint

Operator, storage class, zone layout, sizing, archive, security baseline, rollback criteria.

Phase 2 · Build

From Git

Non-production cluster, real data restored, load tested at production concurrency.

Phase 3 · Rehearse

Game day

Kill a node, fill a disk, throttle a volume, corrupt an archive; measure every RTO.

Phase 4 · Replicate

Side by side

Live replication from the legacy primary; both sides observed together for weeks.

Phase 5 · Cut over

Drain and promote

Pause writers at the pooler, verify zero lag, promote, repoint, keep legacy warm.

Phase 6 · Operate

Hand over

Runbooks, alert tuning, quarterly game days, operator upgrade calendar.

Rule

Rollback stays open

Until Phase 6 is signed off, the legacy primary remains a tested rollback target.

The first four weeks after cutover produce the most useful tuning data of the project, because the same workload has run on both architectures with comparable instrumentation. Cloud Native Database Support keeps that comparison running until the numbers settle. For PostgreSQL-specific operator work, see our PostgreSQL on Kubernetes practice; for streaming platforms, our Kafka consulting team.

FAQ

Questions teams ask before a Cloud Native Database Support engagement

Short answers to the questions platform and data teams raise most often about cloud native database support.

Is running a production database on Kubernetes safe?

Yes. Cloud Native Database Support makes it safe when the operator fences before it promotes, storage is zone-aware, resources avoid CPU throttling and recovery is rehearsed. The platform is rarely the risk; unverified assumptions about failover and restore are. We measure both before signing off a production cutover.

Do we need an operator, or is a StatefulSet enough?

A StatefulSet gives stable identity and storage but no promotion logic, archive management or safe rolling upgrades. Beyond a development cluster we use an operator, chosen against a written rubric.

Which operator do you recommend?

We are vendor-neutral and recommend per workload. The decision turns on fencing behaviour, timestamp point-in-time recovery, upgrade mechanics, how lag and archive age are surfaced, and project governance. We also support the operator you already run.

Should some databases stay on managed cloud services?

Often, yes. Small, low-change workloads without unusual extension needs are frequently cheaper and safer on a managed service. Cloud native database support means choosing the right runtime for each workload, not moving everything onto Kubernetes.

How do you prevent split brain on Kubernetes?

Fencing before promotion, endpoint gating at the Service and pooler, quorum synchronous replication, and a timeline or term marker that makes divergent history unreplayable. We test all four in drills, not only in design reviews.

Should database pods have CPU limits?

Usually not, or only far above the request. A CPU limit is a hard quota per 100 ms period, and checkpoint or vacuum bursts get throttled into latency spikes. We set requests from observed p95, keep memory request equal to limit, and alert on throttled periods.

Can you work alongside our platform team?

That is our most common cloud native database support engagement. We join your platform and SRE engineers as the database specialists, contribute to your Git repositories and runbooks, and stay on the escalation path for Severity-1 incidents.

Which engines and platforms do you cover?

PostgreSQL, MySQL, MariaDB, MongoDB, Redis and Valkey, Cassandra, ClickHouse and Kafka, on self-managed Kubernetes, EKS, GKE, AKS and OpenShift, in single-region, multi-region and hybrid topologies, plus the major managed cloud database services.

How quickly do you respond during an outage?

Under cloud native database support, Severity 1 is acknowledged within 15 minutes, 24×7×365, with an engineer working the incident until service is restored and a written root-cause analysis afterwards. If you are in an incident now, use our emergency DBA channel.

Put database engineers behind your Kubernetes platform

Start with a platform review: operator, storage, failover and recovery measured in one week, with findings ranked by risk. Cloud Native Database Support for active incidents is available through the same page, 24×7.