这是 Oracle 官方推出的 Operator,底层基于成熟的 MySQL InnoDB Cluster 架构

  • 架构特点: 基于 MySQL Group Replication(组复制)技术,结合 MySQL Router 负责路由分发。

  • 优势: “原汁原味”的官方支持,紧跟 MySQL 新特性。

  • 适用场景: 团队对官方 MySQL 生态有执念,且希望使用 InnoDB Cluster 的场景。

  • 复杂度: 中等偏上。

前提环境:

k8s集群+sc存储

安装 MySQL Operator

在 Master 节点上执行以下命令安装官方的 CRD 和 Operator 组件:

# 1. 安装 Custom Resource Definitions (CRDs)
kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-crds.yaml

# 2. 安装 Operator 控制器及相关 RBAC 权限
kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-operator.yaml

第一阶段:部署 MySQL 3节点高可用集群

1. 创建数据库 Root 密码 Secret

kubectl create secret generic mypw \
  --from-literal=rootUser=root \
  --from-literal=rootHost=% \
  --from-literal=rootPassword="Asd147258,"

2. 编写 mysql-cluster.yaml 并部署

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
  name: mycluster
spec:
  instances: 3
  router:
    instances: 1
  secretName: mypw
  tlsUseSelfSigned: true
  

  mycnf: |
    [mysqld]
    innodb_buffer_pool_size=512M
    max_connections=100


  datadirVolumeClaimTemplate:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 5Gi
    storageClassName: managed-nfs-storage

执行部署并观察:

kubectl apply -f mysql-cluster.yaml
kubectl get pods -l mysql.oracle.com/cluster=mycluster -o wide -w

等待 mycluster-0, 1, 2 以及 router 全部变成 Running

第二阶段:部署 wordpress服务进行测试

1. 拉起临时客户端连入主库:

kubectl run -it --rm --image=mysql:8.0 mysql-client -- mysql -h mycluster -uroot -p

(输入你的 MySQL root 密码)

2. 在 mysql> 提示符下执行:

-- 创建 wordpress 数据库
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户 
CREATE USER 'wordpress'@'%' IDENTIFIED BY 'WordPress123!';

-- 赋予权限并刷新
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';
FLUSH PRIVILEGES;

-- 退出终端
exit

3. 创建文件 wordpress.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress:latest
        ports:
        - containerPort: 80
        env:
        - name: WORDPRESS_DB_HOST
          value: "mycluster:6446" # 对接高可用 Router 端口
        - name: WORDPRESS_DB_USER
          value: "wordpress"
        - name: WORDPRESS_DB_PASSWORD
          value: "WordPress123!"
        - name: WORDPRESS_DB_NAME
          value: "wordpress"
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-svc
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080 # 依然使用 30080 端口暴露到宿主机
  selector:
    app: wordpress

4. 执行部署:

kubectl apply -f wordpress.yaml

打开浏览器访问:http://<你任意K8s节点的IP>:30080

  • 安装成功后,进入 WordPress 后台,点击“写文章”。

  • 回到你的终端,删掉当前的主节点:

kubectl delete pod mycluster-0

立刻切回浏览器,点击“发布”文章。

因为 WordPress 走的是 6446 端口,Router 会在底层瞬间把流量切换到新的主节点,你的文章依然可以丝滑发布成功,业务完全不中断,我在断开前写了个11标题文章,断开后写了个322标题的文章,结果就是没有问题

可以看到mycluster-1已经自动成为了PRIMARY主库

当mycluster-0恢复后就会自动加入集群成为从库

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐