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_Running
和 Slave_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