Skip to content

Era 64319: MySQL HA support#236

Merged
shivaprasadmb merged 5 commits into
mainfrom
ERA-64319
May 27, 2026
Merged

Era 64319: MySQL HA support#236
shivaprasadmb merged 5 commits into
mainfrom
ERA-64319

Conversation

@shivaprasadmb

@shivaprasadmb shivaprasadmb commented May 13, 2026

Copy link
Copy Markdown
Contributor

What this PR does / why we need it:
Support for MySQL HA instance.

Special notes for your reviewer:

  • The MySQL HA support blends with Postgres HA under common interface.
  • Postgres HA makes use of HAProxy nodes while MySQL HA makes use of MySQL Router nodes. The API call for these DBserver clusters return different json structure and the code changes are done to support both of them.
  • For MySQL HA instance with router enabled, the K8s service resource spins read-write object with router VM IPs on port 6646 and read-only object for same router VM IPs on port 6647.
  • For MySQL HA instance with router disabled (less likely), the K8s service resource spinfs read-write object with master VM IP on port 3306 and read-only object with reaplica VM IPs on port 3306.

Release note:

- support for MySQL Ha instance with router enabled/disabled mode.

How Has This Been Tested?:
The Unit tests and binary build completes successfully.
Screenshot 2026-05-18 at 6 16 40 PM

Below are the examples with different scenarios for MySQL HA provisioning:

  1. Provision MySQL HA with router disabled
apiVersion: ndb.nutanix.com/v1alpha1
kind: Database
metadata:
  name: k8s-mysqlha
  namespace: default
spec:
  ndbRef: ndb
  databaseInstance:
    name: "K8s_MYSQL_HA"
    description: "[NDB-Operator] MySQL HA instance across 2 PE clusters"
    type: mysql
    credentialSecret: mysql-db-secret
    size: 200
    # Use clusterName (NDB display name) or clusterId (NDB UUID).
    clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
    databaseNames:
      - mysql_ha_initial_db
    timeMachine:
      name: "K8s_MYSQL_HA_TM"
      description: "[NDB-Operator] TM for MySQL HA"
      # Note: time machine creation for MySQL HA requires NDB 2.11+.
      # NDB silently discards TM info on older versions.
      sla: "DEFAULT_OOB_BRONZE_SLA"
      dailySnapshotTime: "10:00:00"
      snapshotsPerDay: 1
      logCatchUpFrequency: 30
      weeklySnapshotDay: "TUESDAY"
      monthlySnapshotDay: 21
    profiles:
      software:
        name: "MYSQL_HA_PROFILE"
      compute:
        name: "DEFAULT_HA_COMPUTE"
      network:
        name: "MYSQLHA_VLAN"
      dbParam:
        name: "DEFAULT_MYSQL_HA_PARAMS"
    haConfig:
      clusterName: "K8s_MYSQL_HA_cluster"
      mysql:
        innoDBClusterName: "k8s-mysqlha-innodb"
        deployMySQLRouter: false 
      nodes:
        - vmName: "K8s_MYSQL_HA-1"
          nodeType: "database"
          role: "Master"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA-2"
          nodeType: "database"
          role: "Replica"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA-3"
          nodeType: "database"
          role: "Replica"
          clusterName: "auto_cluster_nested_69a0126592fce9158a4441da"
    additionalArguments:
      listener_port: "3306"
      allocate_mysql_hugepage: "true"
      ensure_vm_host_distribution: "false"
Screenshot 2026-05-14 at 7 46 43 PM Screenshot 2026-05-14 at 7 46 22 PM
  1. Provision MySQL HA with router enabled
apiVersion: ndb.nutanix.com/v1alpha1
kind: Database
metadata:
  name: k8s-mysqlha-router
  namespace: default
spec:
  ndbRef: ndb
  databaseInstance:
    name: "K8s_MYSQL_HA_router"
    description: "[NDB-Operator] MySQL HA instance  router enabledacross 2 PE clusters"
    type: mysql
    credentialSecret: mysql-db-secret
    size: 200
    clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
    databaseNames:
      - mysql_ha_initial_db
    timeMachine:
      name: "K8s_MYSQL_HA_TM"
      description: "[NDB-Operator] TM for MySQL HA"
      sla: "DEFAULT_OOB_BRONZE_SLA" # optional currently.
      dailySnapshotTime: "10:00:00"
      snapshotsPerDay: 1
      logCatchUpFrequency: 30
      weeklySnapshotDay: "TUESDAY"
      monthlySnapshotDay: 21
    profiles:
      software:
        name: "MYSQL_HA_PROFILE"
      compute:
        name: "DEFAULT_HA_COMPUTE"
      network:
        name: "MYSQLHA_VLAN"
      dbParam:
        name: "DEFAULT_MYSQL_HA_PARAMS"
    haConfig:
      clusterName: "K8s_MYSQL_HA_cluster"
      mysql:
        innoDBClusterName: "k8s-mysqlha-innodb"
        deployMySQLRouter: true  
      nodes:
        - vmName: "K8s_MYSQL_HA-r-1"
          nodeType: "database"
          role: "Master"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA-r-2"
          nodeType: "database"
          role: "Replica"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA-r-3"
          nodeType: "database"
          role: "Replica"
          clusterName: "auto_cluster_nested_69a0126592fce9158a4441da"
        - vmName: "K8s_MYSQL_HA_router1"
          nodeType: "mysqlrouter"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA_router2"
          nodeType: "mysqlrouter"
          clusterName: "auto_cluster_nested_69a0126592fce9158a4441da"
    additionalArguments:
      listener_port: "3306"
      allocate_mysql_hugepage: "true"
      ensure_vm_host_distribution: "false"
Screenshot 2026-05-14 at 7 49 13 PM Screenshot 2026-05-14 at 7 15 27 PM
  1. Provision MySQL HA with router disabled and defaults configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-ha-defaults
  namespace: default
data:
  timezone: "UTC"
  mysql.profiles.software.name: "MYSQL_HA_PROFILE"
  mysql.profiles.compute.name: "DEFAULT_HA_COMPUTE"
  mysql.profiles.network.name: "MYSQLHA_VLAN"
  mysql.profiles.dbParam.name: "DEFAULT_MYSQL_HA_PARAMS"

  mysql.timeMachine.sla: "DEFAULT_OOB_BRONZE_SLA"
  mysql.timeMachine.dailySnapshotTime: "10:00:00"
  mysql.timeMachine.snapshotsPerDay: "1"
  mysql.timeMachine.logCatchUpFrequency: "30"
  mysql.timeMachine.weeklySnapshotDay: "TUESDAY"
  mysql.timeMachine.monthlySnapshotDay: "21"
apiVersion: ndb.nutanix.com/v1alpha1
kind: Database
metadata:
  name: k8s-mysqlha-cm
  namespace: default
spec:
  ndbRef: ndb
  defaultsConfigMapRef: mysql-ha-defaults
  databaseInstance:
    name: "K8s_MYSQL_HA_cm"
    description: "[NDB-Operator] MySQL HA instance (router disabled, defaults from ConfigMap)"
    type: mysql
    credentialSecret: mysql-db-secret
    size: 200
    clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
    databaseNames:
      - mysql_ha_initial_db
    timeMachine:
      name: "K8s_MYSQL_HA_cm_TM"
      description: "[NDB-Operator] TM for MySQL HA defaults CM"
    haConfig:
      clusterName: "K8s_MYSQL_HA_cm_cluster"
      mysql:
        innoDBClusterName: "k8s-mysqlha-cm-innodb"
        deployMySQLRouter: false
      nodes:
        - vmName: "K8s_MYSQL_HA_cm-1"
          nodeType: "database"
          role: "Master"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA_cm-2"
          nodeType: "database"
          role: "Replica"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA_cm-3"
          nodeType: "database"
          role: "Replica"
          clusterName: "auto_cluster_nested_69a0126592fce9158a4441da"
    additionalArguments:
      listener_port: "3306"
      allocate_mysql_hugepage: "true"
      ensure_vm_host_distribution: "false"
  1. Provision MySQL HA with router enabled and defaults configmap
apiVersion: ndb.nutanix.com/v1alpha1
kind: Database
metadata:
  name: k8s-mysqlha-router-cm
  namespace: default
spec:
  ndbRef: ndb
  defaultsConfigMapRef: mysql-ha-defaults
  databaseInstance:
    name: "K8s_MYSQL_HA_router_cm"
    description: "[NDB-Operator] MySQL HA instance (router enabled, defaults from ConfigMap)"
    type: mysql
    credentialSecret: mysql-db-secret
    size: 200
    clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
    databaseNames:
      - mysql_ha_initial_db
    timeMachine:
      name: "K8s_MYSQL_HA_router_cm_TM"
      description: "[NDB-Operator] TM for MySQL HA router"
    haConfig:
      clusterName: "K8s_MYSQL_HA_router_cm_cluster"
      mysql:
        innoDBClusterName: "k8s-mysqlha-router-cm-innodb"
        deployMySQLRouter: true
      nodes:
        - vmName: "K8s_MYSQL_HA_r_cm-1"
          nodeType: "database"
          role: "Master"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA_r_cm-2"
          nodeType: "database"
          role: "Replica"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA_r_cm-3"
          nodeType: "database"
          role: "Replica"
          clusterName: "auto_cluster_nested_69a0126592fce9158a4441da"
        - vmName: "K8s_MYSQL_HA_router_cm1"
          nodeType: "mysqlrouter"
          clusterName: "auto_cluster_nested_699fdfa37298f635e3071a95"
        - vmName: "K8s_MYSQL_HA_router_cm2"
          nodeType: "mysqlrouter"
          clusterName: "auto_cluster_nested_69a0126592fce9158a4441da"
    additionalArguments:
      listener_port: "3306"
      allocate_mysql_hugepage: "true"
      ensure_vm_host_distribution: "false"
Screenshot 2026-05-14 at 10 52 38 PM Screenshot 2026-05-14 at 10 59 23 PM

Comment thread controllers/database_reconciler_helpers.go
Comment thread api/v1alpha1/ha_validators.go
Comment thread ndb_api/db_helpers.go Outdated
Comment thread controllers/ha_connectivity.go
@shivaprasadmb shivaprasadmb self-assigned this May 21, 2026

@manavrajvanshi manavrajvanshi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor comments, please fix before merging.

Comment thread api/v1alpha1/webhook_helpers.go Outdated
Comment thread controllers/database_reconciler_helpers.go Outdated
@shivaprasadmb shivaprasadmb force-pushed the ERA-64319 branch 4 times, most recently from 0292343 to 0e69ba7 Compare May 26, 2026 16:37
@shivaprasadmb shivaprasadmb merged commit 2b72b7c into main May 27, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants