K8s部署实战:构建MySQL主从复制集群

k8s实现mysql的主从

时间:2025-06-18 23:35


K8s实现MySQL主从同步:提升数据库高可用性与性能 在现代微服务架构中,数据库的高可用性和可扩展性至关重要

    MySQL作为广泛使用的开源关系数据库,通过主从架构可以有效分摊负载、提高容错性,满足这些需求

    本文将详细介绍如何在Kubernetes(K8s)环境中实现MySQL的主从同步,从而提升数据库的可用性和性能

     一、MySQL主从同步概述 MySQL主从同步是一种常见的数据库高可用性和性能优化技术

    在这种架构中,存在一个主数据库(Master)负责处理写操作,一个或多个从数据库(Slave)负责处理读操作

    主从同步可以确保数据的一致性,同时提高读取性能,并为主数据库提供数据备份

     在Kubernetes中部署MySQL主从同步,可以利用K8s的自动化部署、扩展和管理能力,轻松管理和扩展容器化的MySQL实例

     二、K8s部署MySQL主从同步的步骤 1. 创建Kubernetes命名空间 首先,为数据库服务创建一个Kubernetes命名空间,以便于管理相关资源

    例如,创建一个名为`mysql`的命名空间: bash kubectl create namespace mysql 2. 创建ConfigMap和Secret ConfigMap用于存储MySQL的配置文件,而Secret用于存储敏感信息,如数据库密码

     创建一个名为`mysql-config`的ConfigMap,包含MySQL的配置文件`my.cnf`: yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql-config namespace: mysql data: my.cnf: | 【mysqld】 bind-address =0.0.0.0 log-bin = mysql-bin server-id =1 注意,这里的`server-id`需要设置为主节点的唯一标识

     同时,创建一个名为`mysql-secret`的Secret,存储MySQL的root密码: yaml apiVersion: v1 kind: Secret metadata: name: mysql-secret namespace: mysql type: Opaque data: MYSQL_ROOT_PASSWORD: 将密码进行base64编码 3.部署主数据库 接下来,创建主数据库的Deployment和Service

    Deployment定义了Pod的模板和副本数,而Service则定义了如何访问这些Pod

     创建一个名为`mysql-master`的Deployment: yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql-master namespace: mysql spec: replicas:1 selector: matchLabels: app: mysql-master template: metadata: labels: app: mysql-master spec: containers: - name: mysql image: mysql:5.7 或使用其他版本 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: MYSQL_ROOT_PASSWORD volumeMounts: - name: mysql-config mountPath: /etc/mysql/conf.d ports: - containerPort:3306 volumes: - name: mysql-config configMap: name: mysql-config 创建一个名为`mysql-master`的Service,用于暴露主数据库: yaml apiVersion: v1 kind: Service metadata: name: mysql-master namespace: mysql spec: ports: - port:3306 targetPort:3306 selector: app: mysql-master 4. 配置主节点 在主数据库中创建一个用于从节点连接的用户,并授予复制权限

    使用`kubectl exec`命令进入主数据库的Pod,并执行MySQL命令: bash kubectl exec -it$(kubectl get pods -n mysql -l app=mysql-master -o jsonpath={.items【0】.metadata.name}) -n mysql -- mysql -uroot -p 在MySQL命令行中执行以下SQL命令: sql CREATE USER replica@% IDENTIFIED BY replica_password; GRANT REPLICATION SLAVE ON. TO replica@%; FLUSH PRIVILEGES; 记录主数据库的状态,以便在从数据库中配置复制: sql SHOW MASTER STATUS; 5.部署从数据库 创建一个名为`mysql-replica-config`的ConfigMap,用于从数据库的配置

    注意,从数据库的`server-id`需要与主数据库不同: yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql-replica-config namespace: mysql data: my.cnf: | 【mysqld】 bind-address =0.0.0.0 server-id =2 创建一个名为`mysql-replica`的Deployment和Service,配置与主数据库类似,但需要使用从数据库的ConfigMap: yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql-replica namespace: mysql spec: replicas:1 selector: matchLabels: app: mysql-replica template: metadata: labels: app: mysql-replica spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: MYSQL_ROOT_PASSWORD volumeMounts: - name: mysql-replica-config mountPath: /etc/mysql/conf.d ports: - containerPort:3306 volumes: - name: mysql-replica-config configMap: name: mysql-replica-config --- apiVersion: v1 kind: Service metadata: name: mysql-replica namespace: mysql spec: ports: - port:3306 targetPort:3306 selector: app: mysql-replica 6. 配置从节点 使用`kubectl exec`命令进入从数据库的Pod,并执行MySQL命令来配置复制: bash kubectl exec -it$(kubectl get pods -n mysql -l app=mysql-replica -o jsonpath=