K8s-MySQL主从集群

K8s-MySQL主从集群

引言

该案例代码均可从https://github.com/WeiXiao-Hyy/k8s_example 获取,欢迎Star!

需求

在这里插入图片描述

  1. 一个“主从复制”的MySQL集群
  2. 有一个主节点Master
  3. 有多个从节点Slave
  4. 从节点需要能水平扩展
  5. 所以写操作只能在主节点上执行
  6. 读操作可以在所有节点上执行

xtrabackup 案例

xtrabackup原理和实战案例参考xtrabackup docker实战

MySQL conf文件配置

由于statefulset生成的pod命名为mysql-0,mysql-1依次递增,则可以取末尾的idx作为MySQL service-id.cnf文件中的mysqld属性。

spec:
  initContainers:
    - name: init-mysql
      image: mysql:5.7
      command:
        - bash
        - "-c"
        - |
          set -ex
          # Generate mysql server-id from pod ordinal index.
          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
          ordinal=${BASH_REMATCH[1]}
          echo [mysqld] > /mnt/conf.d/server-id.cnf
          # Add an offset to avoid reserved server-id=0 value.
          echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
          # Copy appropriate conf.d files from config-map to emptyDir.
          if [[ $ordinal -eq 0 ]]; then
            cp /mnt/config-map/master.cnf /mnt/conf.d/
          else
            cp /mnt/config-map/slave.cnf /mnt/conf.d/
          fi
      volumeMounts:
        - name: conf
          mountPath: /mnt/conf.d
        - name: config-map
          mountPath: /mnt/config-map

Headless Service创建

# Headless service for stable DNS entries of StatefulSet members.
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  ports:
    - name: mysql
      port: 3306
  clusterIP: None
  selector:
    app: mysql
---
# Client service for connecting to any MySQL instance for reads.
# For writes, you must instead connect to the master: mysql-0.mysql.
apiVersion: v1
kind: Service
metadata:
  name: mysql-read
  labels:
    app: mysql
spec:
  ports:
    - name: mysql
      port: 3306
  selector:
    app: mysql

创建HeadLess-Service,并且保证主节点的DNS为mysql-0.mysql,其他从节点为mysql-read。

在这里插入图片描述

从节点复制同步数据

spec:
	initContainers:
		- name: clone-mysql
	    image: gcr.io/google-samples/xtrabackup:1.0
	    command:
	      - bash
	      - "-c"
	      - |
	        set -ex
	        # Skip the clone if data already exists.
	        [[ -d /var/lib/mysql/mysql ]] && exit 0
	        # Skip the clone on master (ordinal index 0).
	        [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
	        ordinal=${BASH_REMATCH[1]}
	        [[ $ordinal -eq 0 ]] && exit 0
	        # Clone data from previous peer.
	        ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql
	        # Prepare the backup.
	        xtrabackup --prepare --target-dir=/var/lib/mysql
	    volumeMounts:
	      - name: data
	        mountPath: /var/lib/mysql
	        subPath: mysql
	      - name: conf
	        mountPath: /etc/mysql/conf.d

流程图如下:
在这里插入图片描述

从节点启动如何恢复数据

前提

  1. xtrabackup_salve_info文件存在则说明该节点为从节点
  2. xtrabackup_binlog_info 文件存在则说明该节点为主节点
  3. 从节点恢复数据启动主要需要获取两个字段,MASTER_LOG_FILE和MASTER_LOG_POS
- name: xtrabackup
  image: gcr.io/google-samples/xtrabackup:1.0
  ports:
    - name: xtrabackup
      containerPort: 3307
  command:
    - bash
  - "-c"
    - |
      set -ex
      cd /var/lib/mysql
      
      # Determine binlog position of cloned data, if any.
      if [[ -f xtrabackup_slave_info ]]; then
        # XtraBackup already generated a partial "CHANGE MASTER TO" query
        # because we're cloning from an existing slave.
        mv xtrabackup_slave_info change_master_to.sql.in
        # Ignore xtrabackup_binlog_info in this case (it's useless).
        rm -f xtrabackup_binlog_info
      elif [[ -f xtrabackup_binlog_info ]]; then
        # We're cloning directly from master. Parse binlog position.
        [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
        rm xtrabackup_binlog_info
        echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\
              MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
      fi
      
      # Check if we need to complete a clone by starting replication.
      if [[ -f change_master_to.sql.in ]]; then
        echo "Waiting for mysqld to be ready (accepting connections)"
        until mysql -h 127.0.0.1 -uroot -p$MYSQL_ROOT_PASSWORD -e "SELECT 1"; do sleep 1; done
      
        echo "Initializing replication from clone position"
        # In case of container restart, attempt this at-most-once.
        mv change_master_to.sql.in change_master_to.sql.orig
        mysql -h 127.0.0.1 -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
      $(<change_master_to.sql.orig),
        MASTER_HOST='mysql-0.mysql',
        MASTER_USER='root',
        MASTER_PASSWORD=$MYSQL_ROOT_PASSWORD,
        MASTER_CONNECT_RETRY=10;
      START SLAVE;
      EOF
      fi
      
      # Start a server to send backups when requested by peers.
      exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
        "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"
  volumeMounts:
    - name: data
      mountPath: /var/lib/mysql
      subPath: mysql
    - name: conf
      mountPath: /etc/mysql/conf.d
  resources:
    requests:
      cpu: 100m
      memory: 100Mi

流程图如下
在这里插入图片描述
等待MySQL服务启动操作:until mysql -h 127.0.0.1 -uroot -pPASSWORD -e “Select 1”; do sleep 1; done

结果测试

K8s执行效果

在这里插入图片描述

MySQL客户端执行效果

主节点mysql-0.mysql写入;从节点mysql-read读取。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 Python 读取 NetCDF 数据

栅格通用数据格式(NetCDF)通常用于存储多维地理数据。这些数据的一些示例包括温度、降水量和风速。NetCDF 中存储的变量通常每天在大片(大陆)区域进行多次测量。由于每天进行多次测量,数据值会快速积累并且变得难以处理。当每个值还分配给一个地理位置时,数据管理会更加复…

Axure基础 各元件的作用及介绍

图像热区 增加按钮或者文本的点击区域&#xff0c;他是透明的&#xff0c;在预览时看不见。 动态面板 用来绘制一下带交互效果的元件&#xff0c;他是动态的&#xff0c;如轮播图&#xff0c;一个动态面板里可以有多个子面板&#xff0c;每一个子面板对应着不同的效果。 他…

学习笔记。。。

1.字符串的拼接 sprintf() 往字符串的前面或中间、后面拼接一个字符串。 strncpy()用来复制字符串的前n个字符 //dest为目标数组&#xff0c;src为源数组&#xff0c;n为要复制的字符个数 char* My_strncpy(char* dest, const char* src, int n)

一步到位!快速精通Git工作流及实战技巧详解

Git是一个分布式版本控制系统。 1、git的应用场景 1.备份 小明负责的模块就要完成了&#xff0c;就在即将release之前的一瞬间&#xff0c;电脑突然蓝屏。硬盘光荣牺牲&#xff01;几个月来的努力付之东流。 场景二&#xff1a;代码还原 这个项目中需要一个很复杂的功能&…

【漏洞复现】订货易管家婆在线商城 VshopProcess 任意文件上传漏洞

漏洞描述 管家婆订货易,是一个帮助传统企业构建专属的订货平台的系统,包括PC+微信+APP+小程序+h5商城5网合一。管家婆订货易在线商城VshopProcess.ashx接口处存在任意文件上传漏洞,未授权的攻击者可以利用此漏洞上传恶意文件最终导致服务器被远控。 免责声明 技术文章仅供…

【C语言】结构体的相关知识点

结构 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构体 结构体&#xff08;Struct&#xff09;是一种用户自定义的数据类型&#xff0c;用于组合不同类型的数据项&#xff08;成员变量&#xff09;以表示一个整体的数据结构…

动态规划(带你了解 原理 实践)

目录 引言 一、动态规划的基本概念 二、动态规划的应用 1. 背包问题 2. 最短路径问题 3. 0-1背包问题的变种 4. 字符串匹配与编辑距离 5. 金融投资组合优化 6. 生产调度问题 7. 项目管理中的资源分配 三、动态规划算法的优缺点 优点 1 效率高 2 通用性强 缺点&a…

数据结构 - 堆(优先队列)+ 堆的应用 + 堆练习

文章目录 前言堆一、什么是堆二、堆又分为大根堆和小根堆三、由于堆的逻辑结构被看成完全二叉树&#xff0c;那么我们先来了解一下完全二叉树。四、堆使用数组还是链表储存数据呢&#xff1f;五、数组构建二叉树和父子节点之间的定位六、堆进行的操作七、实现小根堆1、堆的初始…

HTML5基础2

drag 可以把拖放事件拆分成4个步骤 设置元素为可拖放。为了使元素可拖动&#xff0c;把 draggable 属性设置为 true 。 <img draggable"true"> 拖动什么。ondragstart 和 setData() const dragestart (ev)>{ev.dataTransfer.setData(play,ev.target.id)} …

深入探索HAProxy:高性能负载均衡器的奥秘

目录 引言 一、HAProxy基础知识 &#xff08;一&#xff09;HAProxy概述 &#xff08;二&#xff09;核心特性 &#xff08;三&#xff09;支持调度算法 二、安装haproxy &#xff08;一&#xff09;下载源码包 &#xff08;二&#xff09;解决依赖环境 &#xff08;三…

BDD - Python Behave log 为每个 Scenario 生成对应的 log 文件

BDD - Python Behave log 为每个 Scenario 生成对应的 log 文件 引言应用 Behave 官网 Log 配置文件项目 SetupFeature 文件steps 文件Log 配置文件environment.py 文件behave.ini 执行结果 直接应用 Python logging 模块方式 1&#xff1a;应用 log 配置文件log 配置文件envir…

根据QQ号获取暗恋的人的全部歌单

文章目录 前言一、成果展示二、后端开发流程三、前后端障碍与难点解决四、待扩展内容五、总结 前言 本人喜欢使用QQ音乐听歌&#xff0c;并且喜欢点击好友栏目观看最近在听&#xff0c;了解暗恋的人最近在听什么歌曲&#xff0c;知己知彼&#xff0c;百战不殆。但是每次都需要…

Goya主题 Wordpress简约时尚类电商模板Woocommerce跨境电商主题优化版

Goya 是一个现代而简约的主题&#xff0c;具有您下一个在线商店的所有必需功能。其美丽而清晰的风格旨在展示您的产品并增加销量。您的客户会喜欢其在所有设备上的简单用户体验。由世界上最灵活的电子商务平台 WooCommerce 提供支持。 主题下载地址&#xff1a;Goya主题优化版…

业务随行简介

定义 业务随行是一种不管用户身处何地、使用哪个IP地址&#xff0c;都可以保证该用户获得相同的网络访问策略的解决方案。 背景 在企业网络中&#xff0c;为实现用户不同的网络访问需求&#xff0c;可以在接入设备上为用户部署不同的网络访问策略。在传统园区网络中&#xf…

b站小土堆pytorch学习记录—— P23-P24 损失函数、反向传播和优化器

文章目录 一、损失函数1.简要介绍2.代码 二、优化器1.简要介绍2.代码 一、损失函数 1.简要介绍 可参考博客&#xff1a; 常见的损失函数总结 损失函数的全面介绍 pytorch学习之十九种损失函数 损失函数&#xff08;Loss Function&#xff09;是用来衡量模型预测输出与实际…

vue结合vue-electron创建应用程序

这里写自定义目录标题 安装electron第一种方式&#xff1a;vue init electron-vue第二种方式&#xff1a;vue add electron-builder 启动electron调试功能&#xff1a;background操作和使用1、覆盖窗口的菜单上下文、右键菜单2、监听关闭事件、阻止默认行为3、创建悬浮窗口4、窗…

office下常见问题总结——(持续更新学习记录中......)

目录 Wordword2019中, 当给选定的汉字设置格式后&#xff0c;其他相同汉字也会自动应用相同的格式?在Word中&#xff0c;当输入数字后加上句点&#xff08;.&#xff09;时会自动被识别为标题,如何关闭功能?如何让当前的word中的样式 ,匹配全局模版中的样式?在word中,为什么…

c++中string的使用!!!(适合初学者 浅显易懂)

我们先初步的认识一下string,string底层其实是一个模版类 typedef basic_string<char> string; 我们先大致的把string的成员函数列举出来 class string { private: char * str; size_t size; size_t capacity; }; 1.string的六大默认函数 1.1 构造函数、拷贝构造 注&am…

悬浮工具球(仿 iphone 辅助触控)

悬浮工具球&#xff08;仿 iphone 辅助触控&#xff09; 兼容移动端 touch 事件点击元素以外位置收起解决鼠标抬起触发元素的点击事件问题 Demo Github <template><divref"FloatingBal"class"floating_ball":class"[dragging, isClick]&q…

AntV L7的符号地图

本案例使用L7库和Mapbox GL JS添加符号地图。 文章目录 1. 引入 CDN 链接2. 引入组件3. 创建地图4. 创建场景5. 添加符号6. 创建点数据7. 创建点图层8. 演示效果9. 代码实现 1. 引入 CDN 链接 <script src"https://unpkg.com/antv/l7"></script> <scr…