k8 安装 MySQL 主从

介绍

MySQL 主从复制是一种常见的数据库复制技术,可以将一个数据库的更改自动复制到其他数据库节点中。这种技术可以提高数据的可用性和可靠性,并且支持读写分离。在 Kubernetes(简称 k8)环境下,安装和配置 MySQL 主从复制可以有一些不同的步骤。本文将介绍如何在 k8 环境下安装和配置 MySQL 主从复制,并提供相应的代码示例。

安装 MySQL

在 k8 环境下,可以使用 Helm 来安装 MySQL。Helm 是一个 k8 的包管理工具,可以方便地安装和管理应用程序。

首先,需要安装 Helm。可以通过以下命令安装 Helm:

$ curl  | bash

安装完成后,可以使用 Helm 安装 MySQL。

$ helm repo add stable 
$ helm install mysql stable/mysql

这将在 k8 集群中创建一个名为 mysql 的 MySQL 实例。可以使用以下命令确认安装是否成功:

$ kubectl get pods

配置 MySQL 主从复制

安装完成后,接下来需要配置 MySQL 主从复制。首先,需要为主服务器创建一个复制用户,并为该用户授予必要的权限。

CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

然后,需要为主服务器启用二进制日志。可以在 MySQL 的配置文件中添加以下配置:

[mysqld]
log-bin=mysql-bin

重启 MySQL 服务器以使配置生效。

接下来,在从服务器上配置复制。可以使用以下命令连接到从服务器的 MySQL 控制台:

$ kubectl exec -it mysql-slave-0 -- mysql -u root -p

在 MySQL 控制台中,执行以下命令:

CHANGE MASTER TO
    MASTER_HOST='mysql-master',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=0;

然后,启动复制:

START SLAVE;

使用以下命令检查复制状态:

SHOW SLAVE STATUS\G

如果看到 Slave_IO_RunningSlave_SQL_Running 值为 Yes,则表示复制已成功启动。

示例代码

以下是一个示例 Kubernetes 配置文件,用于在 k8 环境下安装和配置 MySQL 主从复制。

apiVersion: v1
kind: Service
metadata:
  name: mysql-master
  labels:
    app: mysql
    role: master
spec:
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: mysql
    role: master
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave
  labels:
    app: mysql
    role: slave
spec:
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: mysql
    role: slave
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master
spec:
  serviceName: mysql-master
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      role: master
  template:
    metadata:
      labels:
        app: mysql
        role: master
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: password
            - name: MYSQL_REPLICATION_USER
              value: repl
            - name: MYSQL_REPLICATION_PASSWORD
              value: password
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-data
          emptyDir: {}
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-slave
spec:
  serviceName: mysql-slave
  replicas: 2
  selector:
    matchLabels:
      app: mysql
      role: slave
  template:
    metadata:
      labels:
        app: mysql
        role: slave
    spec:
      containers:
        - name: mysql