【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)
【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)
- 一、准备工作
- 二、搭建nfs服务器
- 2.1 安装 NFS 服务器软件包(所有节点执行)
- 2.2 设置共享目录
- 2.3 启动 NFS 服务器
- 2.4 设置防火墙规则(可选)
- 2.5 验证 NFS 服务器
- 三、搭建部署mysql主节点
- 3.1 创建命名空间
- 3.2 创建一个名为 mysql-password 的 Secret
- 3.3 创建持久卷(PV)和持久卷声明(PVC)
- 3.4 创建主节点的mysql配置文件
- 3.5 生成 master 节点的mysql ConfigMap 的 YAML 资源描述文件
- 3.6 应用 YAML 文件到 Kubernetes 集群
- 3.7 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
- 3.8 查看NFS 挂载的目录路径
- 3.9 连接数据库测试
- 四、搭建部署第1个Slave
- 4.1 创建持久卷(PV)和持久卷声明(PVC)
- 4.2 创建slave01从节点配置文件
- 4.3 生成 slave01 节点的mysql ConfigMap 的 YAML 资源描述文件
- 4.4 应用 YAML 文件到 Kubernetes 集群
- 4.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
- 五、搭建部署第2个Slave
- 5.1 创建持久卷(PV)和持久卷声明(PVC)
- 5.2 创建slave02从节点配置文件
- 5.3 生成 slave02 节点的mysql ConfigMap 的 YAML 资源描述文件
- 5.4 应用 YAML 文件到 Kubernetes 集群
- 5.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
- 六、将三台服务器组成一个集群
- 6.1 连接到deploy-mysql-master-0 的 Pod
- 6.2 配置从节点(Slave)连接到主节点(Master)
- 6.3 Slave01 加入master
- 6.4 Slave02 加入master
- 七、测试主从集群复制
- 7.1 在主节点的 MySQL Pod中创建数据库并插入测试数据
- 7.2 Slave01 、Slave02验证复制情况
| 💖The Begin💖点点关注,收藏不迷路💖 |
Kubernetes 是一个强大的容器编排平台,可以帮助我们管理和部署容器化应用。MySQL 是一个流行的关系型数据库,在生产环境中通常需要高可用性和数据持久性。
本文将介绍如何在 Kubernetes 中部署 MySQL 集群,以确保数据的高可用性和持久性。
一、准备工作
1、你已经安装并配置好了 Kubernetes 集群环境。
2、这里采用master作为 NFS 服务器,如果在生产环境,最好单独使用一台服务器部署 NFS 。

3、创建三个文件夹,存放操作和部署文件
mkdir mysql-master
mkdir mysql-slave01
mkdir mysql-slave02
二、搭建nfs服务器
搭建 NFS 服务器是在网络上共享文件的一种常见方式,它可以让多台计算机访问共享的文件系统。
以下是在 Linux 环境中搭建 NFS 服务器的基本步骤:
2.1 安装 NFS 服务器软件包(所有节点执行)
使用 yum 安装 NFS 服务器软件包。在 CentOS 中,NFS 服务器软件包通常称为 nfs-utils。
yum install nfs-utils
2.2 设置共享目录
在 NFS 服务器(例如 k8s-master)上创建用于 MySQL 主从节点的数据目录。这些目录将用于存储 MySQL 实例的数据。然后,你将这些目录导出给 Kubernetes 集群中的 Pod 使用。
1、在 NFS 服务器上创建数据目录:
mkdir -p /data/nfs/{mysql-master,mysql-slaver-01,mysql-slaver-02}
这将创建三个目录,分别用于 MySQL 主节点和两个从节点。

2、配置导出:
将这些数据目录导出给 Kubernetes 集群中的 Pod 使用。编辑 /etc/exports 文件,并添加以下行:
cat >> /etc/exports << EOF
/data/nfs/mysql-master *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-01 *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-02 *(rw,sync,no_root_squash)
EOF
这将允许所有客户端访问这些目录,并授予读写权限,同时启用同步模式和允许 root 用户访问。

2.3 启动 NFS 服务器
在编辑完 /etc/exports 文件后,主节点重新启动 NFS 服务以使更改生效。
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
sudo systemctl status nfs-server

2.4 设置防火墙规则(可选)
如果你的服务器启用了防火墙,确保允许 NFS 流量通过防火墙。例如,使用 firewalld 来添加防火墙规则:
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --reload
2.5 验证 NFS 服务器
最后,使用 showmount 命令验证 NFS 服务器是否正确工作。运行以下命令:
showmount -e 192.168.234.20

如果一切设置正确,你应该会看到列出了共享的目录 /data/nfs/。
至此,你已经成功安装并配置了 NFS 服务器,使其他计算机能够通过网络访问共享的文件。
三、搭建部署mysql主节点
3.1 创建命名空间
使用 kubectl create namespace deploy-mysql 命令来创建 deploy-mysql 命名空间。这将为部署 MySQL 集群提供一个隔离的环境。
kubectl create namespace deploy-mysql

3.2 创建一个名为 mysql-password 的 Secret
创建一个名为 mysql-password 的 Secret,其中包含了 MySQL root 用户的密码,并且指定了命名空间为 deploy-test 的 Kubernetes YAML 配置:
kubectl create secret generic mysql-password --namespace=deploy-mysql --from-literal=mysql_root_password=root --dry-run=client -o=yaml
将上述 YAML 配置保存为 mysql-secret.yaml 文件,然后使用 kubectl apply -f mysql-secret.yaml 命令来创建 Secret。
apiVersion: v1
data:mysql_root_password: cm9vdA==
kind: Secret
metadata:creationTimestamp: nullname: mysql-passwordnamespace: deploy-mysql

列出命名空间 deploy-mysql 中的所有 Secrets。
[root@k8s-master ~]# kubectl get secret -n deploy-mysql

3.3 创建持久卷(PV)和持久卷声明(PVC)
现在我将创建一个 PV 和 PVC 的清单文件,以便使用 NFS 存储。
vim mysql-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: deploy-mysql-master-nfs-pv # PV 的名称namespace: deploy-mysql # PV 所属的命名空间
spec:capacity:storage: 5Gi # PV 的存储容量为 5GB(根据实际调整)accessModes:- ReadWriteMany # 允许多个 Pod 同时对 PV 进行读写访问nfs:server: 192.168.234.20 # NFS 服务器的 IP 地址path: /data/nfs/mysql-master # NFS 服务器上暴露的目录路径storageClassName: "nfs" # PV 使用的存储类名称为 "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: deploy-mysql-master-nfs-pvc # PVC 的名称namespace: deploy-mysql # PVC 所属的命名空间
spec:accessModes:- ReadWriteMany # PVC 的访问模式为 ReadWriteManystorageClassName: "nfs" # PVC 使用的存储类名称为 "nfs"resources:requests:storage: 5Gi # 请求 5GB 的存储空间volumeName: deploy-mysql-master-nfs-pv # 将 PVC 绑定到 PV 的名称为 "deploy-mysql-master-nfs-pv"
现在,使用以下命令来创建 PV 和 PVC:
kubectl apply -f mysql-master-pv-pvc.yaml
kubectl get pv,pvc -n deploy-mysql

3.4 创建主节点的mysql配置文件
vi my.cnf
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不解析主机名
datadir = /var/lib/mysql # 数据文件存放目录
socket = /var/run/mysqld/mysqld.sock # MySQL服务器套接字文件路径
secure-file-priv = /var/lib/mysql-files # 指定安全文件的位置
pid-file = /var/run/mysqld/mysqld.pid # PID文件路径
user = mysql # MySQL服务运行的用户
secure-file-priv = NULL # 禁用安全文件访问限制
server-id = 1 # 服务器唯一标识符
log-bin = master-bin # 启用二进制日志,并指定日志文件名
log_bin_index = master-bin.index # 二进制日志索引文件路径
binlog_do_db = db_k8s # 仅记录指定数据库的操作到二进制日志
binlog_ignore_db = information_schema # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = mysql # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = performance_schema # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = sys # 忽略记录指定数据库的操作到二进制日志
binlog-format = ROW # 设置二进制日志格式为行格式[client]
socket = /var/run/mysqld/mysqld.sock # 客户端连接MySQL服务器时使用的套接字文件路径!includedir /etc/mysql/conf.d/ # 包含额外的配置文件目录
3.5 生成 master 节点的mysql ConfigMap 的 YAML 资源描述文件
使用 kubectl create configmap 命令来生成 ConfigMap 的 YAML 资源描述文件,这个 ConfigMap 指定mysql 配置文件 my.cnf。
kubectl create configmap mysql-master-configmap -n deploy-mysql --from-file=my.cnf=my.cnf --dry-run=client -o yaml
这里的命令包括几个部分:
mysql-master-configmap 是 ConfigMap 的名称。
-n deploy-mysql 指定了 ConfigMap 应该创建在 deploy-mysql 这个命名空间。
- -from-file=my.cnf=my.cnf 指定了要包括的文件。左边的 my.cnf= 指定在 ConfigMap 中的键,右边的 my.cnf 是本地文件名。
- -dry-run=client 表示这个命令将不会真正执行,而是只预览将要创建的对象。
-o yaml 指定输出格式为 YAML。

复制保存生成后的内容为文件 mysql-master-configmap.yaml,添加svc、StatefulSet的配置:
vi mysql-master-configmap.yaml ,添加下面内容
apiVersion: v1
data:my.cnf: |+[mysqld]skip-host-cache # 不使用主机缓存skip-name-resolve # 不解析主机名datadir = /var/lib/mysql # 数据文件存放目录socket = /var/run/mysqld/mysqld.sock # MySQL服务器套接字文件路径secure-file-priv = /var/lib/mysql-files # 指定安全文件的位置pid-file = /var/run/mysqld/mysqld.pid # PID文件路径user = mysql # MySQL服务运行的用户secure-file-priv = NULL # 禁用安全文件访问限制server-id = 1 # 服务器唯一标识符log-bin = master-bin # 启用二进制日志,并指定日志文件名binlog_do_db = db_k8s # 仅记录指定数据库的操作到二进制日志log_bin_index = master-bin.index # 二进制日志索引文件路径binlog_ignore_db = information_schema # 忽略记录指定数据库的操作到二进制日志binlog_ignore_db = mysql # 忽略记录指定数据库的操作到二进制日志binlog_ignore_db = performance_schema # 忽略记录指定数据库的操作到二进制日志binlog_ignore_db = sys # 忽略记录指定数据库的操作到二进制日志binlog-format = ROW # 设置二进制日志格式为行格式[client]socket = /var/run/mysqld/mysqld.sock # 客户端连接MySQL服务器时使用的套接字文件路径kind: ConfigMap
metadata:creationTimestamp: nullname: mysql-master-configmapnamespace: deploy-mysql---
apiVersion: v1
kind: Service
metadata:name: deploy-mysql-master-svc # 定义服务的名称namespace: deploy-mysql # 定义服务所属的命名空间labels:app: mysql-master
spec:ports:- port: 3306 # 服务暴露的端口号name: mysqltargetPort: 3306nodePort: 30306 # NodePort 类型服务的端口selector:app: mysql-master # 选择器,选择哪些 Pod 作为后端type: NodePort # 服务类型为 NodePortsessionAffinity: ClientIP # 会话亲和性设置为 ClientIP---apiVersion: apps/v1
kind: StatefulSet
metadata:name: deploy-mysql-master # StatefulSet 的名称namespace: deploy-mysql # StatefulSet 所属的命名空间
spec:selector:matchLabels:app: mysql-master # 选择器,用于选择管理的 PodserviceName: "deploy-mysql-master-svc" # 关联的 Service 的名称replicas: 1 # 副本数template:metadata:labels:app: mysql-master # Pod 模板的标签spec:terminationGracePeriodSeconds: 10 # 终止优雅期的秒数containers:- args:- --character-set-server=utf8mb4 # MySQL 参数设置- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql # 容器的名称image: mysql:8.0.34 # 容器镜像ports:- containerPort: 3306 # 容器监听的端口号name: mysqlvolumeMounts:- name: mysql-data # 挂载的持久化卷mountPath: /var/lib/mysql- name: mysql-conf # 挂载的 ConfigMapmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv: # 容器的环境变量- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-password # 引用的 Secret 的名称volumes:- name: mysql-data # 持久化卷的名称persistentVolumeClaim:claimName: deploy-mysql-master-nfs-pvc # 持久化卷声明的名称- name: mysql-conf # ConfigMap 的名称configMap:name: mysql-master-configmap # ConfigMap 的名称items:- key: my.cnf # ConfigMap 中的键值对mode: 0644 # 文件权限path: my.cnf # 挂载路径
StatefulSet 是 Kubernetes 中用来部署有状态应用程序的资源对象。与 Deployment 不同,StatefulSet 管理的 Pod 具有固定的标识符和稳定的网络标识符。
这使得 StatefulSet 适用于需要持久化存储、有序部署和唯一网络标识符的应用程序,比如数据库。
3.6 应用 YAML 文件到 Kubernetes 集群
kubectl apply -f mysql-master-configmap.yaml

3.7 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
kubectl get all -o wide -n deploy-mysql

MySQL已经成功运行。
查看 Pod 的日志:使用 kubectl logs 命令查看 Pod 的日志,以了解容器为何崩溃。例如:
kubectl logs deploy-mysql-master-0 -n deploy-mysql

3.8 查看NFS 挂载的目录路径
检查其中的文件并确认是否存在 log-bin 文件。
ls -l /data/nfs/mysql-master/

/data/nfs/mysql-master/ 目录下已生成 MySQL 主节点的二进制日志文件(如 master-bin.000001)。
3.9 连接数据库测试
连接到 deploy-mysql-master-0 的 Pod 中的 MySQL 数据库,并使用 root 用户身份登录。
[root@k8s-master ~]# kubectl exec -itn deploy-mysql pod/deploy-mysql-master-0 -- mysql -uroot -p

四、搭建部署第1个Slave
4.1 创建持久卷(PV)和持久卷声明(PVC)
vi mysql-slave01-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: deploy-mysql-slave-01-nfs-pv # 持久卷的名称namespace: deploy-mysql # 所属命名空间
spec:capacity:storage: 5Gi # 容量为5GiaccessModes:- ReadWriteMany # 可读可写,多节点访问nfs:server: 192.168.234.20 # NFS 服务器地址path: /data/nfs/mysql-slaver-01 # NFS 路径storageClassName: "nfs" # 存储类名称为 "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: deploy-mysql-slave-01-nfs-pvc # 持久卷声明的名称namespace: deploy-mysql # 所属命名空间
spec:accessModes:- ReadWriteMany # 可读可写,多节点访问storageClassName: "nfs" # 存储类名称为 "nfs"resources:requests:storage: 5Gi # 请求5Gi的存储容量volumeName: deploy-mysql-slave-01-nfs-pv # 关联的持久卷名称
现在,使用以下命令来创建slave 01 的 PV 和 PVC:
kubectl apply -f mysql-slave01-pv-pvc.yaml
获取命名空间“deploy-mysql”中的所有持久卷(PV)和持久卷声明(PVC):
kubectl get pv,pvc -n deploy-mysql

4.2 创建slave01从节点配置文件
vi my.cnf
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不进行主机名解析
datadir = /var/lib/mysql # MySQL 数据目录
socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
secure-file-priv = /var/lib/mysql-files # 安全文件目录
pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
user = mysql # MySQL 运行用户
secure-file-priv = NULL # 安全文件权限设置
server-id = 2 # 从节点服务器 ID
log-bin = slave-bin # 二进制日志文件名
relay-log = slave-relay-bin # 中继日志文件名
relay-log-index = slave-relay-bin.index # 中继日志索引文件名[client]
socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
4.3 生成 slave01 节点的mysql ConfigMap 的 YAML 资源描述文件
kubectl create configmap mysql-slave-01-configmap -n deploy-mysql --from-file=my.cnf --dry-run=client -o yaml

复制保存生成后的内容为文件 mysql-slave01-configmap.yaml,添加svc、StatefulSet的配置:
vi mysql-slave01-configmap.yaml ,添加下面内容
apiVersion: v1
data:my.cnf: |+[mysqld]skip-host-cache # 不使用主机缓存skip-name-resolve # 不进行主机名解析datadir = /var/lib/mysql # MySQL 数据目录socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径secure-file-priv = /var/lib/mysql-files # 安全文件目录pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径user = mysql # MySQL 运行用户secure-file-priv = NULL # 安全文件权限设置server-id = 2 # 从节点服务器 IDlog-bin = slave-bin # 二进制日志文件名relay-log = slave-relay-bin # 中继日志文件名relay-log-index = slave-relay-bin.index # 中继日志索引文件名[client]socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径kind: ConfigMap
metadata:creationTimestamp: nullname: mysql-slave-01-configmapnamespace: deploy-mysql---
apiVersion: v1
kind: Service
metadata:name: deploy-mysql-slave-svc # MySQL从节点服务名称namespace: deploy-mysql # 部署的命名空间labels:app: mysql-slave
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 30308 # 暴露的节点端口selector:app: mysql-slavetype: NodePortsessionAffinity: ClientIP---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: deploy-mysql-slave-01 # MySQL从节点StatefulSet名称namespace: deploy-mysql # 部署的命名空间
spec:selector:matchLabels:app: mysql-slaveserviceName: "deploy-mysql-slave-svc" # 关联的Service名称replicas: 1template:metadata:labels:app: mysql-slavespec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: mysql:8.0.34 # MySQL镜像地址ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: deploy-mysql-slave-01-nfs-pvc # 持久卷声明名称- name: mysql-confconfigMap:name: mysql-slave-01-configmap # ConfigMap名称items:- key: my.cnfmode: 0644path: my.cnf
4.4 应用 YAML 文件到 Kubernetes 集群
kubectl apply -f mysql-slave01-configmap.yaml
4.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
kubectl get all -o wide -n deploy-mysql
日志查看:
kubectl logs deploy-mysql-slave-01-0 -n deploy-mysql

MySQL已经成功运行。
五、搭建部署第2个Slave
5.1 创建持久卷(PV)和持久卷声明(PVC)
vi mysql-slave02-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: deploy-mysql-slave-02-nfs-pv # 持久卷的名称namespace: deploy-mysql # 所属命名空间
spec:capacity:storage: 5Gi # 容量为5GiaccessModes:- ReadWriteMany # 可读可写,多节点访问nfs:server: 192.168.234.20 # NFS 服务器地址path: /data/nfs/mysql-slaver-02 # NFS 路径storageClassName: "nfs" # 存储类名称为 "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: deploy-mysql-slave-02-nfs-pvc # 持久卷声明的名称namespace: deploy-mysql # 所属命名空间
spec:accessModes:- ReadWriteMany # 可读可写,多节点访问storageClassName: "nfs" # 存储类名称为 "nfs"resources:requests:storage: 5Gi # 请求5Gi的存储容量volumeName: deploy-mysql-slave-02-nfs-pv # 关联的持久卷名称
现在,使用以下命令来创建slave 02 的 PV 和 PVC:
kubectl apply -f mysql-slave02-pv-pvc.yaml
获取命名空间“deploy-mysql”中的所有持久卷(PV)和持久卷声明(PVC):
kubectl get pv,pvc -n deploy-mysql

5.2 创建slave02从节点配置文件
vi my.cnf
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不进行主机名解析
datadir = /var/lib/mysql # MySQL 数据目录
socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
secure-file-priv = /var/lib/mysql-files # 安全文件目录
pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
user = mysql # MySQL 运行用户
secure-file-priv = NULL # 安全文件权限设置
server-id = 3 # 从节点服务器 ID
log-bin = slave-bin # 二进制日志文件名
relay-log = slave-relay-bin # 中继日志文件名
relay-log-index = slave-relay-bin.index # 中继日志索引文件名[client]
socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
5.3 生成 slave02 节点的mysql ConfigMap 的 YAML 资源描述文件
kubectl create configmap mysql-slave-02-configmap -n deploy-mysql --from-file=my.cnf --dry-run=client -o yaml

复制保存生成后的内容为文件 mysql-slave02-configmap.yaml,添加svc、StatefulSet的配置:
vi mysql-slave02-configmap.yaml ,添加下面内容
apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cache # 不使用主机缓存skip-name-resolve # 不进行主机名解析datadir = /var/lib/mysql # MySQL 数据目录socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径secure-file-priv = /var/lib/mysql-files # 安全文件目录pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径user = mysql # MySQL 运行用户secure-file-priv = NULL # 安全文件权限设置server-id = 3 # 从节点服务器 IDlog-bin = slave-bin # 二进制日志文件名relay-log = slave-relay-bin # 中继日志文件名relay-log-index = slave-relay-bin.index # 中继日志索引文件名[client]socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
kind: ConfigMap
metadata:creationTimestamp: nullname: mysql-slave-02-configmapnamespace: deploy-mysql---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: deploy-mysql-slave-02namespace: deploy-mysql
spec:selector:matchLabels:app: mysql-slave-02serviceName: "deploy-mysql-slave-svc" ## 共用之前定义的 Servicereplicas: 1template:metadata:labels:app: mysql-slave-02spec:spec:nodeSelector:kubernetes.io/hostname: k8s-node02 ## 指定调度到 k8s-node02terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: deploy-mysql-slave-02-nfs-pvc- name: mysql-confconfigMap:name: mysql-slave-02-configmapitems:- key: my.cnfmode: 0644path: my.cnf
5.4 应用 YAML 文件到 Kubernetes 集群
kubectl apply -f mysql-slave02-configmap.yaml
5.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
kubectl get all -o wide -n deploy-mysql

注意:可在yaml文件中添加配置,指定pod调度到服务器
spec:nodeSelector:kubernetes.io/hostname: k8s-node02
六、将三台服务器组成一个集群
6.1 连接到deploy-mysql-master-0 的 Pod
## 启动一个交互式会话,连接到名为 deploy-mysql-master-0 的 Pod
kubectl exec -it -n deploy-mysql deploy-mysql-master-0 -- mysql -uroot -p## 查看主节点的状态:
show master status;

6.2 配置从节点(Slave)连接到主节点(Master)
在 MySQL 中执行 CHANGE MASTER TO 命令用于配置从节点(Slave)连接到主节点(Master)的参数。在你的情况下,你想在两个从节点中执行这个命令,以便它们连接到主节点。
假设你已经连接到两个从节点的 MySQL Pod 中,你可以分别执行以下命令来配置它们连接到主节点:
CHANGE MASTER TO MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local', MASTER_PORT=3306, MASTER_USER='root', MASTER_PASSWORD='root', MASTER_LOG_FILE='master-bin.000003', MASTER_LOG_POS=157, MASTER_CONNECT_RETRY=30, GET_MASTER_PUBLIC_KEY=1;
需要注意下面的几个参数:
master_host: 这个参数是master的地址,kubernetes提供的解析规则是 pod名称.service名称.命名空间.svc.cluster.local ,所以我们master的mysql地址是 deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local
master_port: 主节点的mysql端口,我们没改默认是3306
master_user: 登录到主节点的mysql用户
master_password: 登录到主节点要用到的密码
master_log_file: 我们之前查看mysql主节点状态时候的 File 字段
master_log_pos: 我们之前查看mysql主节点状态时候的 Position 字段
master_connect_retry: 主节点重连时间
get_master_public_key: 连接主mysql的公钥获取方式
根据上面参数,按照自己的环境进行修改。
6.3 Slave01 加入master
1、进 入deploy-mysql-slave-01-0 的 Pod。
kubectl exec -itn deploy-mysql pod/deploy-mysql-slave-01-0 -- mysql -uroot -p
2、配置从节点(Slave)连接到主节点(Master)的参数:
执行以下命令来配置它们连接到主节点:
CHANGE MASTER TO MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local', MASTER_PORT=3306, MASTER_USER='root', MASTER_PASSWORD='root', MASTER_LOG_FILE='master-bin.000003', MASTER_LOG_POS=157, MASTER_CONNECT_RETRY=30, GET_MASTER_PUBLIC_KEY=1;

3、启动从节点的复制进程
START SLAVE;

4、查看从节点的复制状态
SHOW SLAVE STATUS\G;

第一个从节点已经成功加入并开始复制主节点的数据。
6.4 Slave02 加入master
1、进 入deploy-mysql-slave-02-0 的 Pod。
kubectl exec -itn deploy-mysql pod/deploy-mysql-slave-02-0 -- mysql -uroot -p
2、配置从节点(Slave)连接到主节点(Master)的参数:
执行以下命令来配置它们连接到主节点:
CHANGE MASTER TO MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local', MASTER_PORT=3306, MASTER_USER='root', MASTER_PASSWORD='root', MASTER_LOG_FILE='master-bin.000003', MASTER_LOG_POS=157, MASTER_CONNECT_RETRY=30, GET_MASTER_PUBLIC_KEY=1;

3、启动从节点的复制进程
START SLAVE;

4、查看从节点的复制状态
SHOW SLAVE STATUS\G;

第二个从节点已经成功加入并开始复制主节点的数据。
七、测试主从集群复制
7.1 在主节点的 MySQL Pod中创建数据库并插入测试数据
-- 创建数据库
CREATE DATABASE IF NOT EXISTS db_k8s;-- 切换到 testdb 数据库
USE db_k8s;-- 创建数据表 t_user
CREATE TABLE IF NOT EXISTS t_user (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50)
);-- 向 t_user 表中插入数据
INSERT INTO t_user (name) VALUES ('John'), ('Doe'), ('Jane');

7.2 Slave01 、Slave02验证复制情况
mysql> USE db_k8s;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Doe |
| 3 | Jane |
+----+------+
3 rows in set (0.00 sec)mysql>


| 💖The End💖点点关注,收藏不迷路💖 |
相关文章:
【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)
【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从) 一、准备工作二、搭建nfs服务器2.1 安装 NFS 服务器软件包(所有节点执行)2.2 设置共享目录2.3 启动 NFS 服务器2.4 设置防火墙规则(可选&am…...
Vue内置组件TransitionGroup详细介绍
<TransitionGroup> 是一个内置组件,用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 和 <Transition> 的区别 <TransitionGroup> 支持和 <Transition> 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器…...
【机器学习300问】71、神经网络中前向传播和反向传播是什么?
我之前写了一篇有关计算图如何帮助人们理解反向传播的文章,那为什么我还要写这篇文章呢?是因为我又学习了一个新的方法来可视化前向传播和反向传播,我想把两种方法总结在一起,方便我自己后续的复习。对了顺便附上往期文章的链接方…...
【ZZULIOJ】1067: 有问题的里程表(Java)
目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从3变到5,而跳过数字4,里程表…...
A21 STM32_HAL库函数 之 I2c通用驱动程序 -- B -- 所有函数的介绍及使用
A21 STM32_HAL库函数 之 I2c通用驱动程序 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.12 HAL_I2C_Master_Sequential_Receive_IT1.13 HAL_I2C_Slave_Transmit_IT1.14 HAL_I2C_Slave_Receive_IT1.15 HAL_I2C_Slave_Sequential_Transmit_IT1.16 HAL_I2C_Slave_Sequential_R…...
简介:Asp.Net Core进阶高级编程教程
课程简介目录 🚀前言一、课程背景二、课程目的三、课程特点四、课程适合人员六、最后 🚀前言 本文是《.Net Core进阶编程课程》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)…...
Linux系统中LVM与磁盘配额
目录 一、LVM逻辑卷管理 二、LVM的管理命令 物理卷管理 卷组管理 逻辑卷管理 *创建并使用LVM步骤 三、磁盘配额概述 实现磁盘限额的条件 Linux 磁盘限额的特点 四、磁盘配额管理 磁盘限额 一、LVM逻辑卷管理 能够在保持现有数据不变的情况下动态调整磁盘容量&#…...
手机重启手app没了
发现公司有些Android球机设备,安装了一些app,重启后app没了,还有公司的一些Android手机,原来是没问题的,不知道哪天起,只要重启,新安装的软件就会没了,很神奇。后来发现,…...
github上传代码
偷一下懒,把链接贴一下,后续再补充。 1.下载Git 【学习笔记】上传代码到GitHub(保姆级教程) 2.如何创建GitHub仓库 手把手教你在github上传文件 3.如何删掉GitHub仓库 github如何删除仓库或项目? 4.遇到的错误 …...
Qt+vstudio2022的报错信息积累
从今天开始记录一下平常开发工作中的报错记录,后续有错误动态补充! 报错信息:【MSB8041】此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。 解决: 背景:换…...
力扣练习题(2024/4/16)
1买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…...
c++中一些常用库函数
1.最大公约数 需要包括头文件#include<algorithm>,直接写__gcd(a,b),就是求a与b的最大公约数。 #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<map>…...
竞赛 基于GRU的 电影评论情感分析 - python 深度学习 情感分类
文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖,适合作为竞…...
软件杯 深度学习图像修复算法 - opencv python 机器视觉
文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步:将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…...
java日志log4j使用
1、导入jar包 log4j-1.2.17.jar log4j-api-2.0-rc1.jar log4j-core-2.0-rc1.jar https://download.csdn.net/download/weixin_44201223/89148839 所需jar包下载地址 2、创建 log4j.properties src 下创建 log4j.properties (路径和名称都不允许改变),放置 src 下…...
探索Python爬虫利器:Scrapy框架解析与实战
探索Python爬虫利器:Scrapy框架解析与实战 在当今信息时代,数据的价值不言而喻。而Python爬虫技术,作为获取网络数据的重要手段,已经成为了许多数据分析师、开发者和研究者必备的技能。本文将为您详细介绍Python爬虫技术中的利器—…...
Rust腐蚀服务器修改背景和logo图片操作方法
Rust腐蚀服务器修改背景和logo图片操作方法 大家好我是艾西一个做服务器租用的网络架构师。在我们自己搭建的rust服务器游戏设定以及玩法都是完全按照自己的想法设定的,如果你是一个社区服那么对于进游戏的主页以及Logo肯定会有自己的想法。这个东西可以理解为做一…...
【架构-15】NoSQL数据库
NoSQL(Not Only SQL)数据库是一类非关系型数据库,与传统的关系型数据库(如MySQL、Oracle)相对而言。NoSQL数据库的设计目标是针对大规模数据和高并发访问的需求,具有高可扩展性、高性能和灵活的数据模型。 …...
中国人工智能产业年会智能交通与自动驾驶专题全景扫描
中国人工智能产业年会(CAIIAC)是中国人工智能技术发展和应用的重要展示平台,不仅关注创新,还涵盖了市场和监管方面的内容,对于促进人工智能领域的发展起到了重要作用。年会汇集了来自学术界、工业界和政府的专家&#…...
SpringBoot相关知识点总结
1 SpringBoot的目的 简化开发,开箱即用。 2 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中的一个重要概念,它是一种提供依赖项的方式,可以帮助开发人员快速集成各种第三方库和框架。Spring Boot Starter 的目的是简化 Sprin…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
