Compare

Bloodraven and the other Kubernetes MySQL operators

Ten other operators, compared on what you would check before trusting one with a production database: licence and cost, how failover decides and fences, what happens across sites, backups you can prove restore, and how much failure testing stands behind the claims.

Checked on 4 November 2026 against each project's repository, release notes, documentation, CI configuration and issue tracker. Where a cell rests on an open issue report rather than the maintainers' own documentation, it links the report. Projects change; if a cell is wrong or out of date, open an issue and we will fix it.

The short version

Pick the replication model first. Group Replication, Galera and loss-less semi-sync lose no committed data when a node fails, but they need three members and slow down over long links. Asynchronous replication works over a WAN with two sites, at the cost of possible data loss on an unplanned failover.

No operator, Bloodraven included, fails over automatically between separate Kubernetes clusters. Every cross-cluster path in this table is a manual promotion. Bloodraven automates failover between sites of one Kubernetes cluster that spans zones or regions; recovering in a different cluster is a restore from S3.

Where Bloodraven is ahead: automatic failover with only two sites, layered fencing that includes evicting application pods from the old site, DNS steering, an interlock before discarding divergent transactions, automated restore testing, and the most failure testing of any project here.

Where Bloodraven is behind: it is new, with one primary maintainer and a v1alpha1 API. It runs MySQL 9.7 only, takes logical backups only, has no proxy, and cannot promote while the operator itself is down. Companies over $1M revenue pay for production use. Two failure scenarios are open known failures; see Known limitations.

Which one fits

  • No data loss inside one cluster, mature and fully open sourcePercona PXC
  • Upstream Group Replication with support from OracleOracle MySQL Operator, with an Enterprise subscription
  • Plain semi-sync replication, no proxy, small codebaseMOCO
  • Sharding, or more write volume than one primary can takeVitess
  • MariaDBmariadb-operator
  • One platform for several database enginesKubeBlocks or KubeDB
  • Two sites, async, automatic site failover with DNS, and you can accept bounded data loss on a sudden failureBloodraven

Feature by feature

Strong or presentPartial, preview, paid or caveatedMissing, weak or reported brokenNeutral

Columns
Capability BloodravenShipStream · v1.6.0Oracle MySQL OperatorInnoDBCluster · 26.10.0-2.3.1Percona PXCXtraDB Cluster · v1.20.0Percona PSPercona Server · v1.3.0MOCOCybozu · v0.38.0Vitess OperatorPlanetScale · v2.17.1mariadb-operatorCommunity · 26.10.2KubeBlocks MySQLApeCloud · v1.0.2KubeDB MySQLAppsCode · v2026.10.12Charmed MySQL K8sCanonical · rev457Tungsten OperatorContinuent · commercial
Licensing and cost
Operator licenceBSL 1.1, source-available. Each version becomes Apache-2.0 two years after releaseUPL-1.0Apache-2.0Apache-2.0Apache-2.0Apache-2.0MITAGPL-3.0 since 2023; addons Apache-2.0AppsCode Community License (source-available, non-compete); source privateApache-2.0Proprietary
Free in production?For individuals, non-profits, non-commercial use and companies under $1M revenue. All non-production use is freeCommunity edition yes; key features need EnterpriseYes, every featureYes, every featureYesYes; turnkey multi-cluster is commercialYes; MaxScale 25.x and the Enterprise operator are commercialYes, under AGPL; an Enterprise edition existsNo. The free community licence ended in 2024; trials are 30 daysYesNo
Features behind a paid tierNone. No licence server, no phone-homePhysical and incremental backup (MEB), PITR, ClusterSet, Vault/KMIP/OCI keyrings, audit logNoneNoneNoneTurnkey cross-cluster deployment (PlanetScale)FIPS, drain-triggered switchover, MaxScale 25.xGUIProduction use; GUINoneEverything
Published price$990 one-time per failover group or $4,900 per organization; optional update renewals. PricingMySQL Enterprise Edition, about $5,350 per server per yearSupport subscription, not publishedSupport subscription, not publishedNo commercial support offeredPlanetScale, not publishedMariaDB Enterprise, not publishedEnterprise, not publishedPer GB of database memory, 100 GB minimumUbuntu Pro support from $500 per node per yearUp to $8,400 per node per year, plus support
Project health
First releaseApril 202620222019GA November 202520202020 (Vitess itself 2011, CNCF graduated)20222022; the project still labels itself alpha20182021GA May 2025
Releases in the last 12 months27About 8, quarterly348371 GA, 70 alpha and betaFrequentAbout 4Not published
GitHub stars / contributorsNew project; one primary maintainer947 / 16625 / about 88234 / about 34385 / about 47374 / about 71 (Vitess: 21k stars)1,033 / about 963,162 / about 108Source is privateNew monorepo / 31Closed source
API versionv1alpha1, no conversion webhook yetv2v1v1; async mode in tech previewv1beta2v2Stablev1 with addon churnv1Juju charmNot published
Database and platform
Database versionsMySQL Community 9.7 LTS onlyMySQL 8.4, 9.7, 26.x (Community or Enterprise)PXC 8.4, 8.0, 5.7Percona Server 9.7, 8.4, 8.0MySQL 8.0.28 to 8.4MySQL or Percona 8.0, 8.4MariaDB 10.6 and later onlyMySQL 5.7, 8.0, 8.4MySQL 5.7 to 9.78.0 stable; 8.4 in candidateMySQL, Percona, MariaDB
Platforms in CIkind (Kubernetes 1.35) in public CI; managed clouds not testedminikube, k3d, kind, OKE, OpenShift in internal CIGKE, EKS, AKS, OpenShift, DOKS, MinikubeGKE, EKS, DOKS, OpenShift, Rancher, Minikubekind, Kubernetes 1.34 to 1.36kindkindEKS, AKSNot publishedCanonical KubernetesNot published
arm64Multi-arch images; not tested in end-to-end CIMulti-arch imagesYesNot documentedYesVitess imagesYesYesNot documentedYes, testedYes
Topology
Replication modelAsynchronous GTID replication, every replica directly from the primaryGroup Replication (InnoDB Cluster), single primaryGalera, virtually synchronousGroup Replication (GA); async with Orchestrator (tech preview)Loss-less semi-sync that never falls back to asyncAsync or semi-sync per shard, with shardingAsync, semi-sync or GaleraSemi-sync (default), Group Replication or OrchestratorGroup Replication, InnoDB Cluster, semi-syncGroup Replication with ClusterSetAsync, through the Tungsten replicator
Members needed for HA2 sites333 (Group Replication), 2 (async)32 or more per shard2 (async), 3 (Galera)2 (semi-sync)333
Read replicasRead-only sites that are never promoted and are fenced if they turn writable; DR-only sitesAsync read replicasEvery node is readableYesYesYesYesYesYesYesYes
ShardingNoNoNoNoNoYes, the core featureNoNoNoNoNo
Replicate from an outside MySQLNo; import with a MySQL Shell dumpNo; seed by clone or dumpYesThrough ClusterSetYesThrough import workflowsYesNot documentedYesThrough ClusterSetYes, including other databases
High availability and failover
What decides a failoverThe operator, polling every 2 sGroup Replication consensus; the operator repairs membershipGalera quorum and proxy health checksGroup Replication; async: OrchestratorThe operatorVTOrcThe operator, or MaxScaleA sidecar holding a ConfigMap lockA coordinator sidecarGroup Replication and Juju hooksTungsten Manager, by quorum
Documented failover timeAbout 6 s to detect plus up to 30 s relay-log drain. Failure-mode matrixNot documented. Open reports describe a 2-minute failover and a 22-minute write outage (#69)About 5 s for Galera, then 10 to 30 s for HAProxyGroup Replication: seconds. Async: waits to recover the old primary's binlogs, up to a 1 h default timeoutNot documentedSeconds; no figure publishedNot documented. An open report describes no failover at all on node power loss (#1960)"Generally under 30 s" (vendor)About 10 s, rarely 45 sNot documentedNot published
Data loss on unplanned failoverPossible, bounded by replica lag. The lost transactions are recorded in status. Durability and RPONone inside one cluster; possible on a forced cross-cluster failoverNone inside one cluster; possible across sitesNone with Group Replication. Async: none if the old pod is still reachable, otherwise wait or force with lossNone by design; writes block insteadNone for acknowledged writes with semi-sync durabilityPossible with asyncPossible once semi-sync times outNone with Group ReplicationNone inside one clusterPossible (async)
Planned switchover without data lossOne annotation or kubectl bloodraven promote; waits for the target to catch up and rolls back on timeoutMySQL Shell command; ClusterSet by custom resourceNo commandYeskubectl moco switchoverPlannedReparentShardYes; an open report describes the primary stuck read-only (#1852)YesYesJuju actionYes
Split-brain protectionsuper_read_only, read-only boot, a sidecar that fences an isolated primary on its own, and node taints that evict application pods from the old siteQuorum and self-abort on expulsion; across clusters the old primary must be fenced by handQuorum: a minority refuses queriesQuorum with Group Replication; async relies on read_only and refuses a forced promotion while the old primary is writableStops replication on every replica so the old primary cannot get acknowledgementsSemi-sync acknowledgements; no STONITHread_only on demotion onlyOpen report: pods start writable (#3103)Quorum with Group ReplicationQuorum; docs acknowledge split-brain after a partitionQuorum
Divergent (errant) transactionsDetected and reported with an event and metric; the site stays fenced, ranks last as a candidate, and needs the divergent GTID confirmed before a recloneGroup Replication rejects the member; ClusterSet needs manual stepsNot applicable (Galera)Not documentedDetected and excluded; recloning is manualExcluded from promotion; no automatic recloneOptional reseed on one error code; open report of forked GTID history (#2013)Not documentedRepaired by pseudo-transaction or cloneHandled by Group ReplicationNot documented
Anti-flap cooldownYes, 5 min by default, survives an operator restartNot documentedNot applicableThrough OrchestratorNot documentedThrough VTOrcNot documentedNot documentedNot documentedNot documentedNot documented
While the operator is downNo promotion; sidecars keep it safe, but writes stop if the primary also dies. Operator availabilityFailover continues; restarted members stay offlineFailover continuesFailover continuesNo failoverFailover continuesNo failover unless MaxScale is usedSidecar-drivenNot documentedFailover continues; recovery waitsFailover continues
Multi-site, disaster recovery and routing
Automatic failover across zones or regions of one Kubernetes clusterYes, the design goal: two or more sites, async so it tolerates WAN latency, with site roles and priorities. Multi-siteIf the group spans 3 zones; latency-sensitiveIf the cluster spans 3 zones; latency-sensitiveIf the group spans 3 zonesAcross zones; writes block on a lagging linkYes, aware of cellsYesNot documentedAcross zonesAcross zonesWithin one region only
Across separate Kubernetes clustersManual: restore from S3 with PITR in the other cluster. Multi-cluster DRClusterSet (Enterprise); manual failover; needs cross-cluster pod networkingAsync replication; manual promotionClusterSet; manual, or a forced failover flagged unsafe (#1658)Replicate from an outside source; manual promotionDo-it-yourself federation, or commercialManual switchover; an open report describes both clusters left writable (#1965)Not documentedRemote replica; manual promotionClusterSet; manual; a forced promotion can split-brainNo
DNS or global traffic steeringWrites DNSEndpoint records for external-dns, only after the promotion is confirmedNoNoNoNoNot needed; VTGate routesNo; the load balancer is repointed by handNoNoNoNo
Client routingNo proxy: primary, replica and per-site Services, plus DNSMySQL RouterHAProxy or ProxySQLHAProxy or MySQL RouterServices onlyVTGateOptional MaxScale (licence caveats)Services; optional ProxySQLServices; Router for InnoDB ClusterMySQL RouterTungsten Connector
Cache or session failoverOptional Dragonfly that follows the active site——————Separate Redis addonSeparate Redis operator——
Backup and restore
Backup methodLogical only, with MySQL ShellMySQL Shell dump; physical only with EnterpriseXtraBackup, physicalXtraBackup, physicalMySQL Shell dump, logicalBuilt-in, XtraBackup or MySQL Shellmariadb-backup, VolumeSnapshot or dumpXtraBackup, VolumeSnapshot or mydumperXtraBackup, logical or VolumeSnapshotXtraBackupVendor tool
Storage targetsS3 and S3-compatible, PVCPVC, OCI, S3, AzureS3, GCS, Azure, PVCS3, GCS, AzureS3, GCS, AzureS3, GCS, Azure, Ceph, volumeS3, Azure, PVC, NFSS3, GCS, OSS, MinIO, PVCS3, GCS, Azure and moreS3 onlyS3, folder
Point-in-time recoveryYes, into a new group; refuses to replay across sites after a failover (#206)Enterprise onlyYesTech previewYes, into a new clusterYesReplication topology only, with open bug reportsYesYesDisabled on 8.4Not documented
Automated restore testingYes: scheduled restores into a throwaway MySQL with PITR replay and a sanity query. Backup verificationNoNoNoNoEach scheduled backup restores the previous one firstNoNoNoNoNo
Backup encryptionClient-side AES-256-GCM for dumps, binlogs and manifestsDepends on storageStorage-sideYesNo (#845)Storage-sideSSE-CYesYesStorage-side onlyNot documented
Incremental backupNo; archived binlogs cover the gapEnterprise onlyNoTech previewNoYesNoYesThrough binlog archivingNoNot documented
Restore optionsNew group, in place for the whole instance, or one schema in placeNew cluster onlyNew or same clusterNew or same clusterNew cluster; single schemaNew tabletsNew or in place; single databaseNew cluster onlySame or different databaseIn placeIn place, with manual steps
Day-2 operations
Rolling MySQL upgradeStandby first, then a no-loss handoff; writes pause for up to about 30 sYesYes, with automatic minor upgradesYesYesYesYesYesYesYesYes
Configuration changes on a live clusterReconciledOpen reports: ignored (#63, #56)YesYes, without restart where possibleYesYesYesYesYesYesYes
Command-line toolkubectl bloodraven for status, promote, reclone, backup and verify. kubectl pluginMySQL Shell onlyNone; GUI through OpenEverestNonekubectl mocovtctldclient, VTAdminNonekbclikubectl dbaJujukubectl tungsten
Databases and users as resourcesMysqlDatabase: database, owner, users, grants, limitsNoUsers in the cluster resourceUsers in the cluster resourceNoKeyspacesDatabase, User and Grant resourcesYesYesThrough relationsNot documented
Coordination with app deploysDeployment API: migration lock and failover holds, revoked on emergency. Deployment APINoNoNoNoOnline DDLNoNoNoNoSchema-change tooling
Security
TLScert-manager; encrypted transport requiredFrom Secrets you supplycert-manager, automatic rotationcert-manager, rotation without restartcert-manager for the agent; operator-to-MySQL traffic is not encryptedNo mTLS (#718)Built-in CA or cert-managerYescert-managerThrough TLS charmscert-manager
Encryption at restKeyring file with escrow and safe rotation; not compliance-grade TDE. Encryption at restKeyring file; Vault, OCI and KMIP with EnterpriseVault keyringVault keyringNoNot managedNot documentedNot documentedNot documentedNot supportedNot documented
Signed imagescosign; daily vulnerability scansNot documentedNot documentedNot documentedNot documentedNot documentedNot documentedNot documentedNot documentedNot documentedNot documented
Observability and documentation
MetricsAbout 57 operator metrics with a ServiceMonitorBring your own exporter, with an open report it breaks on recent versions (#61); no operator metricsPMMPMMOperator and backup metricsEvery componentExporters and operator metricsExporterExporterPrometheus, Loki, TempoNot documented
Dashboards and alerts shipped5 Grafana dashboards; alert rules as an example file. Alert runbook mapNoneThrough PMMThrough PMMNoneNoneNoneDashboard and alert rulesDashboards, no alertsDashboards and tested alert rulesVendor dashboard
Failure-mode documentationFailure-mode matrix with timings, runbooks, RPO matrix, partition guide, published known failuresNo failover chapterDetailed, with timingsGoodPrecise state documentationUpstream Vitess docsModerateModerateModerateModerateVendor manual
Failure testing
Real-cluster test scenarios62 chaos scenarios. Chaos suite51 suites70 suites65 suites16 suites8 for the operator; Vitess itself has about 80 failover tests outside KubernetesAbout 117 specsTest code is privateTest code is private126 testsTest code is private
…that inject a failureAbout 51: kills, sustained outages, network partitions, frozen processes, wiped volumes, RBAC, DNS and storage outages, rogue writes, lagAbout 13: process kills and pod deletesAbout 9About 941About 8: pod and volume deletes15 fault types, from public CI logsNot verifiableAbout 10Not verifiable
Network-partition testsSeveral partition shapes, including partitioning only the operatorNoOne podYesNoUpstream onlyNoYesNot verifiableYesNot verifiable
Deterministic simulationSeeded fault schedules run against the real control loop on every CI runNoNoNoNoNoNoNoNoNoNo
Where the tests runPublic GitHub Actions on kind: a smoke set gates every release, 28 scenarios nightly, the full set on demandInternal CI, results not publicGKE on every PR; failure tests at release on six platformsGKE on every PR, failure tests included; six platforms at releasePublic CI across Kubernetes and MySQL versionskindPublic CI on kindManually triggered on EKS and AKSPrivateNightlyPrivate

How the failure tests were counted

Counts come from each repository's test tree and CI configuration, not from marketing pages. "Injects a failure" means the test kills, freezes, partitions, deletes or denies something and then checks the outcome; a test that only exercises a planned switchover or an upgrade does not count.

  • Bloodraven: 62 registered scenarios. Four need the encryption setup and run in their own CI jobs; two are open known failures, kept quarantined. Every PR runs 190 component tests, 57 envtest tests and a 400-seed deterministic simulation sweep.
  • Oracle: 51 end-to-end files, of which about 13 tests crash a process or delete a pod. No partition or node-loss tests. CI is internal.
  • Percona PXC: 70 end-to-end tests; 3 chaos-mesh suites plus 6 with kill or delete steps. Chaos suites run at release time.
  • Percona PS: 65 kuttl suites, including Group Replication self-healing and async failover with a killed primary; these run on every PR.
  • MOCO: 16 suites with 74 specs; 4 kill or delete during writes.
  • Vitess: the operator has 8 end-to-end scripts. Vitess itself has 49 reparent and 33 VTOrc end-to-end tests that run as local processes.
  • mariadb-operator: about 117 specs on kind; about 8 delete a pod or volume. Multi-cluster specs cover the success path.
  • Charmed MySQL: 126 integration tests; about 10 inject faults with chaos-mesh, drains, freezes and kills.
  • KubeBlocks, KubeDB and Tungsten keep their test code private. KubeBlocks publishes CI logs showing 15 fault types.

Not in the table

Bitpoke (Presslabs) mysql-operator has had no release since May 2023 and depends on Orchestrator, whose upstream is archived. RadonDB has been inactive since early 2025. Oracle's NDB Operator runs NDB Cluster rather than InnoDB replication. OpenEverest is a management platform over the Percona operators, so its MySQL behaviour is Percona PXC's. TiDB, OceanBase and PolarDB-X are MySQL-compatible distributed databases rather than MySQL.