当前位置: 首页 > news >正文

【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】&#xff1a;在 Kubernetes 集群中部署 MySQL8.0 高可用集群&#xff08;1主2从&#xff09; 一、准备工作二、搭建nfs服务器2.1 安装 NFS 服务器软件包&#xff08;所有节点执行&#xff09;2.2 设置共享目录2.3 启动 NFS 服务器2.4 设置防火墙规则&#xff08;可选&am…...

Vue内置组件TransitionGroup详细介绍

<TransitionGroup> 是一个内置组件&#xff0c;用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 和 <Transition> 的区别​ <TransitionGroup> 支持和 <Transition> 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器…...

【机器学习300问】71、神经网络中前向传播和反向传播是什么?

我之前写了一篇有关计算图如何帮助人们理解反向传播的文章&#xff0c;那为什么我还要写这篇文章呢&#xff1f;是因为我又学习了一个新的方法来可视化前向传播和反向传播&#xff0c;我想把两种方法总结在一起&#xff0c;方便我自己后续的复习。对了顺便附上往期文章的链接方…...

【ZZULIOJ】1067: 有问题的里程表(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 某辆汽车有一个里程表&#xff0c;该里程表可以显示一个整数&#xff0c;为该车走过的公里数。然而这个里程表有个毛病&#xff1a;它总是从3变到5&#xff0c;而跳过数字4&#xff0c;里程表…...

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进阶高级编程教程

课程简介目录 &#x1f680;前言一、课程背景二、课程目的三、课程特点四、课程适合人员六、最后 &#x1f680;前言 本文是《.Net Core进阶编程课程》教程专栏的导航站&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09…...

Linux系统中LVM与磁盘配额

目录 一、LVM逻辑卷管理 二、LVM的管理命令 物理卷管理 卷组管理 逻辑卷管理 *创建并使用LVM步骤 三、磁盘配额概述 实现磁盘限额的条件 Linux 磁盘限额的特点 四、磁盘配额管理 磁盘限额 一、LVM逻辑卷管理 能够在保持现有数据不变的情况下动态调整磁盘容量&#…...

手机重启手app没了

发现公司有些Android球机设备&#xff0c;安装了一些app&#xff0c;重启后app没了&#xff0c;还有公司的一些Android手机&#xff0c;原来是没问题的&#xff0c;不知道哪天起&#xff0c;只要重启&#xff0c;新安装的软件就会没了&#xff0c;很神奇。后来发现&#xff0c;…...

github上传代码

偷一下懒&#xff0c;把链接贴一下&#xff0c;后续再补充。 1.下载Git 【学习笔记】上传代码到GitHub&#xff08;保姆级教程&#xff09; 2.如何创建GitHub仓库 手把手教你在github上传文件 3.如何删掉GitHub仓库 github如何删除仓库或项目&#xff1f; 4.遇到的错误 …...

Qt+vstudio2022的报错信息积累

从今天开始记录一下平常开发工作中的报错记录&#xff0c;后续有错误动态补充&#xff01; 报错信息&#xff1a;【MSB8041】此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。 解决&#xff1a; 背景&#xff1a;换…...

力扣练习题(2024/4/16)

1买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…...

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 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖&#xff0c;适合作为竞…...

软件杯 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本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 (路径和名称都不允许改变)&#xff0c;放置 src 下…...

探索Python爬虫利器:Scrapy框架解析与实战

探索Python爬虫利器&#xff1a;Scrapy框架解析与实战 在当今信息时代&#xff0c;数据的价值不言而喻。而Python爬虫技术&#xff0c;作为获取网络数据的重要手段&#xff0c;已经成为了许多数据分析师、开发者和研究者必备的技能。本文将为您详细介绍Python爬虫技术中的利器—…...

Rust腐蚀服务器修改背景和logo图片操作方法

Rust腐蚀服务器修改背景和logo图片操作方法 大家好我是艾西一个做服务器租用的网络架构师。在我们自己搭建的rust服务器游戏设定以及玩法都是完全按照自己的想法设定的&#xff0c;如果你是一个社区服那么对于进游戏的主页以及Logo肯定会有自己的想法。这个东西可以理解为做一…...

【架构-15】NoSQL数据库

NoSQL&#xff08;Not Only SQL&#xff09;数据库是一类非关系型数据库&#xff0c;与传统的关系型数据库&#xff08;如MySQL、Oracle&#xff09;相对而言。NoSQL数据库的设计目标是针对大规模数据和高并发访问的需求&#xff0c;具有高可扩展性、高性能和灵活的数据模型。 …...

中国人工智能产业年会智能交通与自动驾驶专题全景扫描

中国人工智能产业年会&#xff08;CAIIAC&#xff09;是中国人工智能技术发展和应用的重要展示平台&#xff0c;不仅关注创新&#xff0c;还涵盖了市场和监管方面的内容&#xff0c;对于促进人工智能领域的发展起到了重要作用。年会汇集了来自学术界、工业界和政府的专家&#…...

SpringBoot相关知识点总结

1 SpringBoot的目的 简化开发&#xff0c;开箱即用。 2 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中的一个重要概念&#xff0c;它是一种提供依赖项的方式&#xff0c;可以帮助开发人员快速集成各种第三方库和框架。Spring Boot Starter 的目的是简化 Sprin…...

【QT】关于qcheckbox常用的三个信号,{sstateChanged(int) clicked() clicked(bool)}达成巧用

在 Qt 中&#xff0c;QCheckBox 是一个提供复选框功能的小部件&#xff0c;允许用户选择和取消选择一个或多个选项。QCheckBox 提供了几种信号来响应用户的交互&#xff0c;其中 stateChanged(int), clicked(), 和 clicked(bool) 是常用的。下面解释这些信号的意义及其用法。 …...

在线音乐网站的设计与实现

在线音乐网站的设计与实现 摘 要 在社会和互联网的快速发展中&#xff0c;音乐在人们生活中也产生着很大的作用。音乐可以使我们紧张的神经得到放松&#xff0c;有助于开启我们的智慧&#xff0c;可以辅助治疗&#xff0c;达到药物无法达到的效果&#xff0c;所以利用现代科学…...

【电路笔记】-数字缓冲器

数字缓冲器 文章目录 数字缓冲器1、概述2、单输入数字缓冲器3、三态缓冲器3.1 有效“高”三态缓冲器3.2 有效“高”反相三态缓冲器3.3 有效“低”三态缓冲器3.4 有效“低”反相三态缓冲器4、三态缓冲器控制数字缓冲器和三态缓冲器可以在数字电路中提供电流放大以驱动输出负载。…...

Opencv | 基于ndarray的基本操作

这里写目录标题 一. Opencv 基于ndarray的基本操作1. 浅拷贝2. np.copy ( ) 深拷贝3. 堆叠3.1 np.vstack ( ) 垂直方向堆叠3.2 np.hstack ( ) 水平方向堆叠 4. numpy创建图像5 np.transpose ( ) 更改维度顺序6. cv.resize ( ) 放大缩小7. np.clip ( ) 一. Opencv 基于ndarray的…...

【大语言模型】应用:10分钟实现搜索引擎

本文利用20Newsgroup这个数据集作为Corpus(语料库)&#xff0c;用户可以通过搜索关键字来进行查询关联度最高的News&#xff0c;实现对文本的搜索引擎&#xff1a; 1. 导入数据集 from sklearn.datasets import fetch_20newsgroupsnewsgroups fetch_20newsgroups()print(fNu…...

UT单元测试

Tips&#xff1a;在使用时一定要注意版本适配性问题 一、Mockito 1.1 Mock的使用 Mock 的中文译为仿制的&#xff0c;模拟的&#xff0c;虚假的。对于测试框架来说&#xff0c;即构造出一个模拟/虚假的对象&#xff0c;使我们的测试能顺利进行下去。 Mock 测试就是在测试过程…...

leetcode-合并两个有序链表

目录 题目 图解 方法一 方法二 代码(解析在注释中) 方法一 ​编辑方法二 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1…...

006Node.js cnpm的安装

百度搜索 cnpm,进入npmmirror 镜像站https://npmmirror.com/ cmd窗口输入 npm install -g cnpm --registryhttps://registry.npmmirror.com...

web server apache tomcat11-01-官方文档入门介绍

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 同时也为从零手写实现 tomcat 提供一些基础和特性的思路。 minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apac…...

java的总结

由于最近已经开始做项目了&#xff0c;所以对java的基础知识的学习都是一个离散化的状态没有一个很系统的学习&#xff0c;都是哪里不会就去学哪里。 先来讲一下前后端的区别吧 在我的理解前端就是&#xff1a;客户端在前端进行点击输入数据&#xff0c;前端将这些数据整合起来…...

wordpress 图书馆主题/深圳网络提速优化服务包

上周&#xff0c;谷歌正式推送了Android 9.0 Pie的正式版&#xff0c;谷歌Pixel手机和Essential Phone率先升级&#xff0c;索尼等第三方厂商也都在第一时间公布了适配进度&#xff0c;小米、华为等厂商更是给部分机型推出了测试版固件。近日&#xff0c;HTC也通过官方推特公布…...

如何给网站做外链/seo如何优化关键词

一.Android Studio将support库改成Androidx 为什么转换? 最近 Google 发布了 Android support library 28&#xff0c;同时也发布了 androidx 1.0.0 第一个正式版本&#xff0c;然后得知支持库的 “28.0.0” 将会是最后一次更新&#xff0c;之后的更新都会迁移到 Androidx 中…...

移动网站建设的前景/什么平台可以免费发广告

先记录要学的东西&#xff0c;有空把这部分内容补上 参考&#xff1a; http://www.cnblogs.com/luyubin/archive/2009/03/18/1415249.html http://topic.csdn.net/u/20080527/09/822fafb1-1477-4598-a1bb-cf1096261417.html 本文转自xwdreamer博客园博客&#xff0c;原文链接&a…...

用asp.net做的网站框架/国内网络销售平台有哪些

斐波那契数列计算 B 描述 斐波那契数列如下: F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) 编写一个计算斐波那契数列的函数,采用递归方式,输出不超过n的所有斐波那契数列元素 调用上述函数,完成如下功能: 用户输入一个整数n,输出所有不超过n的斐波那契数列元素、输出数列…...

万网如何做网站/新媒体口碑营销案例

夜光序言&#xff1a; 有人刻薄的嘲讽你&#xff0c;你马上尖酸的回敬他。有人毫无理由的看不起你&#xff0c;你马上轻蔑的鄙视他。有人在你面前大肆炫耀&#xff0c;你马上加倍证明你更厉害。有人对你冷漠忽视&#xff0c;你马上对他冷淡疏远。看&#xff0c;你讨厌的那些人&…...

日照聊城网站建设/青岛seo关键词优化公司

作者&#xff1a;袁腾飞 李峰学序言1 没有笨学生&#xff0c;只有笨方法也有一些学生&#xff0c;他们该学的时候学&#xff0c;该玩的时候玩&#xff0c;花费的学习时间相对较少&#xff0c;每次考试却总能考高分&#xff0c;让埋头于书山题海的同学羡慕不已。这些学生的智力并…...