k8s搭建双主的mysql8集群---无坑

news2024/11/18 10:53:21

《k8s搭建一主三从的mysql8集群---无坑-CSDN博客》通过搭建一主三从,我们能理解到主节点只有1个,那么承担增删改主要还是主节点,如果你在从节点上去操作增删改操作,数据不会同步到其他节点。本章我们将实现多主(双主)集群。实现在多个节点上操作增删改,能同步其他节点

 一,环境准备

1.1 k8s集群服务器

ip角色系统主机名cpumem
192.168.40.129mastercentos7.9k8smaster48
192.168.40.130node1centos7.9k8snode148
192.168.40.131node2centos7.9k8snode248
192.168.40.132node3centos7.9k8snode348

k8s集群操作请参考《K8s安装部署(v1.28)--超详细(cri-docker作为运行时)-CSDN博客》 

1.2 nfs服务器器

ip角色系统主机名cpumem用图
192.168.40.129mastercentos7.9k8smaster48k8s主服务器

nfs服务器
192.168.40.130node1centos7.9k8snode148k8s的工作节点
需要装nfs软件
192.168.40.131node2centos7.9k8snode248k8s的工作节点
需要装nfs软件
192.168.40.132node3centos7.9k8snode348k8s的工作节点
需要装nfs软件

二,安装nfs服务

2.1  安装(所有节点)

因为需要在三个工作节点上连接nfs,所以工作节点上也要安装

yum install -y nfs-utils

2.2 暴露nfs目录(只暴露nfs主服务器)

要安装四台服务器。

直接在nfs服务器(k8s-master:192.168.40.129)当中创建这三个目录并写入 /etc/exports 文件夹中(创建的目录可以修改):

#创建nfs目录
mkdir -p /data/nfs/{mysql-master-01,mysql-master-02}
vi /etc/exports
#添加
/data/nfs/mysql-master-01 *(rw,sync,no_root_squash)
/data/nfs/mysql-master-02 *(rw,sync,no_root_squash)

如果目录不为空,需要清空

rm -rf /data/nfs/mysql-master-01/*
rm -rf /data/nfs/mysql-master-02/*

 2.3 开启nfs服务器

直接在主服务器(192.168.40.129)上启动nfs服务器。

systemctl enable --now nfs-server

 2.4 测试nfs服务

我们可以通过这行命令来检查目录是否暴露成功: 注意修改为自己的nfs服务器地址

showmount -e 192.168.40.129

 

三,搭建MySql集群

3.1 创建命名空间

创建一个命名空间来部署MySQL集群,当然你也可以使用默认的Default命名空间。这里就用 mysql-cluster 命名空间来搭建集群了,首先我们将这个命名空间创建出来:

创建yaml

kubectl create namespace mysql-cluster --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: mysql-cluster
spec: {}
status: {}

 将上面内容 保存到mysql-ns.yaml中

 执行命令

kubectl apply -f mysql-ns.yaml

查看名称空间

kubectl get ns

3.2 创建MySQL密码的Secret

创建一个存储了MySQL密码的Secret,直接使用这行命令生成这个Secret的资源清单文件:
注意修改root的密码和命名空间,我的root密码设置为的是123456

kubectl create secret generic mysql-password --namespace=mysql-cluster --from-literal=mysql_root_password=123456 --dry-run=client -o=yaml
apiVersion: v1
data:
  mysql_root_password: MTIzNDU2
kind: Secret
metadata:
  creationTimestamp: null
  name: mysql-password
  namespace: mysql-cluster

将上述yaml内容保存到  mysql-secret.yaml 

kubectl apply -f  mysql-secret.yaml 

查看创建的密码

 kubectl get secret -n mysql-cluster

  

3.3 编写MySQL双主节点yaml 

3.3.1 主节点1 

   mysql-master-1.yaml  内容如下

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-master-01-nfs-pv
  namespace: mysql-cluster
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.40.129
    path: /data/nfs/mysql-master-01
  storageClassName: "nfs"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-master-01-nfs-pvc
  namespace: mysql-cluster
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs"
  resources:
    requests:
      storage: 1Gi
  volumeName: mysql-master-01-nfs-pv

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-master-svc-01
  namespace: mysql-cluster
  labels:
    app: mysql-master
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 3306
  selector:
    app: mysql-master
  type: NodePort
  sessionAffinity: ClientIP

---
apiVersion: v1
data:
  my.cnf: |
    [mysqld]
    server-id = 1

    # 开启gtid
    gtid_mode = ON
    enforce_gtid_consistency = 1

    # 设置自增ID初始值为2,每次自增量为2。即都是偶数2,4,6,8,...
    auto_increment_offset = 2
    auto_increment_increment = 2

    # 开启bin_log(默认是开启的,直接使用默认),模式为ROW,允许最大日志为1G
    #log_bin = mysql-bin
    #binlog_format = ROW
    #max_binlog_size = 1024M

    # 主节点master不需要写binlog的数据库
    binlog_ignore_db = mysql
    binlog_ignore_db = information_schema
    binlog_ignore_db = performance_schema
    binlog_ignore_db = sys

    # 从节点slave不进行数据同步的数据库
    replicate_ignore_db = mysql
    replicate_ignore_db = information_schema
    replicate_ignore_db = performance_schema
    replicate_ignore_db = sys

    # 中继日志(默认是开启的,直接使用默认)
    #relay_log = mysql-relay-bin

    # mysql5.7以后的版本不需要配置log-slave-updates=1
    # log-slave-updates = 1

    #[client]
    #socket           = /var/run/mysqld/mysqld.sock

    #!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: mysql-master-01-cm
  namespace: mysql-cluster


---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master-01
  namespace: mysql-cluster
spec:
  selector:
    matchLabels:
      app: mysql-master
  serviceName: "mysql-master-svc-01"
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql-master
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:8.0.34
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysql-conf
          mountPath: /etc/my.cnf
          readOnly: true
          subPath: my.cnf
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-master-01-nfs-pvc
      - name: mysql-conf
        configMap:
          name: mysql-master-01-cm
          items:
          - key: my.cnf
            mode: 0644
            path: my.cnf

3.3.2 主节点2

主节点2 mysql-master-2.yaml 内容如下 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-master-02-nfs-pv
  namespace: mysql-cluster
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.40.129
    path: /data/nfs/mysql-master-02
  storageClassName: "nfs"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-master-02-nfs-pvc
  namespace: mysql-cluster
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs"
  resources:
    requests:
      storage: 1Gi
  volumeName: mysql-master-02-nfs-pv

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-master-svc-02
  namespace: mysql-cluster
  labels:
    app: mysql-master
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 3307
  selector:
    app: mysql-master
  type: NodePort
  sessionAffinity: ClientIP

---
apiVersion: v1
data:
  my.cnf: |
    [mysqld]
    server-id = 2

    # 开启gtid
    gtid_mode = ON
    enforce_gtid_consistency = 1

    # 设置自增ID初始值为1,每次自增量为2。即都是偶数2,4,6,8,...
    auto_increment_offset = 1
    auto_increment_increment = 2

    # 开启bin_log(默认是开启的,直接使用默认),模式为ROW,允许最大日志为1G
    #log_bin = mysql-bin
    #binlog_format = ROW
    #max_binlog_size = 1024M

    # 主节点master不需要写binlog的数据库
    binlog_ignore_db = mysql
    binlog_ignore_db = information_schema
    binlog_ignore_db = performance_schema
    binlog_ignore_db = sys

    # 从节点slave不进行数据同步的数据库
    replicate_ignore_db = mysql
    replicate_ignore_db = information_schema
    replicate_ignore_db = performance_schema
    replicate_ignore_db = sys

    # 中继日志(默认是开启的,直接使用默认)
    #relay_log = mysql-relay-bin

    # mysql5.7以后的版本不需要配置log-slave-updates=1
    # log-slave-updates = 1

    #[client]
    #socket           = /var/run/mysqld/mysqld.sock

    #!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: mysql-master-02-cm
  namespace: mysql-cluster


---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master-02
  namespace: mysql-cluster
spec:
  selector:
    matchLabels:
      app: mysql-master
  serviceName: "mysql-master-svc-02"
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql-master
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:8.0.34
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysql-conf
          mountPath: /etc/my.cnf
          readOnly: true
          subPath: my.cnf
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-master-02-nfs-pvc
      - name: mysql-conf
        configMap:
          name: mysql-master-02-cm
          items:
          - key: my.cnf
            mode: 0644
            path: my.cnf

3.3.3 配置注意点

  •  nfs 的地址、路径
  • msql的配置中 server-id 要不同,gtid_mode设置为on,enforce_gtid_consistency设置为1

    [mysqld]
    server-id = 2

    # 开启gtid
    gtid_mode = ON
    enforce_gtid_consistency = 1
  • mysql的镜像地址 有需要改成能拉取到的镜像
  • service 的nodePort端口要设置不同(共用一个service的可以不变)

3.4 启动集群

3.4.1 启动

kubectl apply -f .

 

 3.4.2 k8s查看所有集群信息 

kubectl get all -n mysql-cluster -o wide

 3.4.3 进入主节点1


 kubectl exec -itn mysql-cluster pod/mysql-master-01-0 -- mysql -uroot -p

输入密码·12345

加入集群命令

change master to
    master_host='mysql-master-02-0.mysql-master-svc-02.mysql-cluster.svc.cluster.local',
    master_port=3306,
    master_user='root',
    master_password='123456',
    master_auto_position=1,
    get_master_public_key=1;

需要注意下面的几个参数:

  • master_host: 这个参数是 节点2的 master的地址,(根据k8s的网络解析,pod名称.service名称.命名空间.svc.cluster.local 。我的是 mysql-master-02-0.mysql-master-svc-02.mysql-cluster.svc.cluster.local)
  • master_port: 主节点的mysql端口,我们没改默认是3306
  • master_user: 登录到主节点的mysql用户
  • master_password: 登录到主节点要用到的密码
  • get_master_public_key: 连接主mysql的公钥获取方式 根据上面参数,

如果要修改那么请按照自己的环境进行修改。 

 启动主从

#启动
start slave;
#查看副本状态
show replica status\G;

 

看到这两项都为yes表示正常           

Replica_IO_Running: Yes
Replica_SQL_Running: Yes 

3.4.4 进入主节点2

kubectl exec -itn mysql-cluster pod/mysql-master-02-0 -- mysql -uroot -p

输入密码·12345

加入集群命令

change master to
    master_host='mysql-master-01-0.mysql-master-svc-01.mysql-cluster.svc.cluster.local',
    master_port=3306,
    master_user='root',
    master_password='123456',
    master_auto_position=1,
    get_master_public_key=1;

需要注意下面的几个参数:

  • master_host: 这个参数是 节点1的 master的地址,(根据k8s的网络解析,pod名称.service名称.命名空间.svc.cluster.local 。我的是 mysql-master-01-0.mysql-master-svc-01.mysql-cluster.svc.cluster.local)
  • master_port: 主节点的mysql端口,我们没改默认是3306
  • master_user: 登录到主节点的mysql用户
  • master_password: 登录到主节点要用到的密码
  • get_master_public_key: 连接主mysql的公钥获取方式 根据上面参数,

如果要修改那么请按照自己的环境进行修改。 

 启动主从

#启动
start slave;
#查看副本状态
show replica status\G;

 

看到这两项都为yes表示正常           

Replica_IO_Running: Yes
Replica_SQL_Running: Yes 

四,测试集群

4.1 完整性测试

工具连接两个 是3306、3307,端口,

我们在在节点1上建库,建表


CREATE DATABASE `test_db`;
USE `test_db`;

CREATE TABLE `user` (
  `user_id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '用户id',
  `username` VARCHAR(50) NOT NULL COMMENT '用户名',
  `age` TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄',
  `gender` TINYINT UNSIGNED DEFAULT 2 COMMENT '性别;0=男,1=女,2=未知'
) COMMENT '用户表';

到节点2上查看,是否同步了 

 

我们在节点2上插入2条数据,看下是否能同步


INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('oopxiajun', '18', '0');
INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('01', '28', '0');

 

再去节点1上看下是否有这两条数据

已经成功同步。

 4.2 宕机其中一台测试

关闭 节点2 

kubectl delete -f mysql-master-2.yaml 

节点2已经连不上连不上了

这时我们在节点1插入一条数据

INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('02宕机数据', '28', '0');

启动节点2

 kubectl apply  -f mysql-master-2.yaml 

 

 查看数据是否同步

这样我们架构就保证我们两台中一台能正常运行,业务就不会停止,发生故障的服务器恢复后可以自动同步数据。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2173909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

引入Scrum激发研发体系活力

引言 在当今快速变化的技术环境中,IT企业面临着持续的市场压力和竞争,传统的瀑布式开发模式已经难以满足现代企业的需要。瀑布模型过于僵化,缺乏灵活性,导致项目经常延期,成本增加,最终可能无法达到预期效果…

【机器学习(十)】时间序列案例之月销量预测分析—Holt-Winters算法—Sentosa_DSML社区版

文章目录 一、Holt-Winters算法原理(一) 加法模型(二) 乘法模型(三) 阻尼趋势 二、Holt Winters算法优缺点优点缺点 三、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二) 数据预处理(三) 模型训练和模型评估(四) 模型可视化 四、总结 一、Holt-Winters…

Chromium 设置页面打开系统代理源码分析c++

1、前端页面调用showProxySettings() {chrome.send("showProxySettings")} 2、c 响应代码如下 chrome\browser\ui\webui\settings\system_handler.ccvoid SystemHandler::RegisterMessages() {web_ui()->RegisterMessageCallback("showProxySettings",b…

Java Statement SqlTemplate 源码分析

Java Statement SqlTemplate 源码分析 目录概述需求: 设计思路实现思路分析1. 概述2. 关键类3. 主要功能4. 源码结构5. 示例代码6. 性能考虑7. 常见问题8. 总结: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show y…

Meta AI 发布 Llama 3.2

Llama 3.2新闻 Meta公司在其Connect大会上宣布了Llama 3.2的发布,这是其首款能够理解图像和文本的旗舰视觉模型。Llama 3.2包含中型和小型两个版本(分别拥有11B与90B参数),以及更轻量化的纯文本模型(分别拥有1B与3B参数…

安全的价值:构建现代企业的基础

物理安全对于组织来说并不是事后才考虑的问题:它是关键的基础设施。零售商、医疗保健提供商、市政当局、学校和所有其他类型的组织都依赖安全系统来保障其人员和场所的安全。 随着安全技术能力的不断发展,许多组织正在以更广泛的视角看待他们的投资&am…

element plus block报错

解决: ::v-deep input[aria-hidden"true"] {display: none !important }

二叉树进阶oj题【二叉树相关10道oj题的解析和c++代码实现】

目录 二叉树进阶oj题1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历 II4.二叉树的最近公共祖先5.二叉搜索树和双向链表6.从前序与中序遍历序列构造二叉树7.从中序和后序遍历序列来构造二叉树8.二叉树的前序遍历,非递归迭代实现9.二叉树中序遍历 &…

日志工具spdlog全解析:理论、安装、使用与实践(C++)

文章目录 前言spdlog 与 glog spdlog介绍内容日志等级输出格式 使用步骤同步日志输出异步日志输出封装一个日志输出类对日志输出类的测试 安装 前言 在编写项目时,通过日志追踪程序错误或其他情况出现的位置是十分重要的,对于不太复杂的场景&#xff0c…

突发:Sam万字长文,OpenAI o1超越人类,o1模型训练原理、微调、能力来源-AI已死,大模型当立

OpenAl o1大模型:原理、突破、前景及影响 北京时间2024年9月13日凌晨,OpenAI正式发布了新的人工智能模型o1(o是orion猎户座,1代表从头再来,也意味着后续将出现更多序列),就是此前OpenAI一直在高…

烟雾污染云层检测系统源码分享

烟雾污染云层检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

嵌入式学习--LinuxDay04

嵌入式学习--LinuxDay04 shell脚本 1.1数组 1.1.1数组的赋值 1.1.2数组的调用 1.2函数 1.2.1函数的定义方式 1.2.2函数的调用 2.分文件编程 2.1源文件 2.2头文件 3.编译工具 3.1 gcc编译工具 3.2 gdb调试 4.make工具 4.1定义 4.2Makefile格式 4.3Makefile管理多个文件 4.4Makef…

【笔记】X射线的衍射方向

X射线在晶体中的衍射,实质是大量原子散射波互相干涉的结果。 衍射花样有两个特征: 衍射方向(衍射线在空间的分布规律):由晶胞的大小、形状和位向决定。 衍射强度:由原子的种类以及它在晶胞中所处的位置决…

56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录门控循环单元(GRU)门控隐状态重置门和更新门候选隐状态隐状态 从零开始实现初始化模型参数定义模型训练与预测 简洁实现小结练习 门控循环单元(GRU) 之前我们讨论了如何在循环神经网络中计算梯…

PREDATOR: Registration of 3D Point Clouds with Low Overlap

Abstract 这篇文章介绍了一种新的点云配准模型-Predator。该模型专注于处理低重叠的点云对,它更加关注于重叠区域的处理,其新颖之处在于一个重叠的注意块,作用是用于两个点云的潜在编码之间的早期信息交换。该模型大大提高了低重叠场景下的配…

AI跟踪报道第58期-新加坡内哥谈技术-本周AI新闻: OpenAI动荡时刻和Meta从未如此动人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

深度学习与数学归纳法

最近发现,深度学习可以分为两个主要的阶段,分别是前向推理以及反向传播,分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候,本质上是在利用历史数据求网络参数的先验分布; …

leetcode每日一题day15(24.9.25)——公司命名

思路:首先如果没有相同的后缀,则无论只要不是相同的首字母交换都不会出现重复情况,如果有重复后缀,则还需多增加个不能和,首字符与另一相同后缀字串的首字符相同的字串交换。 主要矛盾已经明确,则可对矛盾…

MySql5.7.26安装和配置

一.下载: 地址MySQL :: Download MySQL Community Server 1、选择版本 根据自己需要选择32位或64位版本(这里选择64位)点击下载 进入到下载页面按下图操作 2.解压文件放置位置:这边将下载的文件解压到D:Software 下 解压后内部文…

Linux---文件io

1.系统调用 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。是应用程序同系统之间数据交互的桥梁。 C标准函数和系统函数调用关系。一个helloworld如何打印到屏幕。 man手册中一共有九卷,其中一卷就有讲到系…