基于Kubernetes部署MySQL主从集群

以下是一个基于Kubernetes部署MySQL主从集群的详细YAML示例,包含StatefulSet、Service、ConfigMap和Secret等关键配置。MySQL主从集群需要至少1个主节点和多个从节点,这里使用 StatefulSet + 初始化脚本 实现主从自动配置。


1. 创建 Namespace (可选)

apiVersion: v1
kind: Namespace
metadata:name: mysql-cluster

2. 创建 Secret (存储MySQL密码)

apiVersion: v1
kind: Secret
metadata:name: mysql-secretsnamespace: mysql-cluster
type: Opaque
data:root-password: eHg=  # echo -n "xx" | base64 (示例密码)replication-password: eHg=  # 主从同步专用密码

3. 创建 ConfigMap (主从配置文件)

apiVersion: v1
kind: ConfigMap
metadata:name: mysql-confignamespace: mysql-cluster
data:master.cnf: |[mysqld]log-bin=mysql-binserver-id=1slave.cnf: |[mysqld]log-bin=mysql-binserver-id=2init.sql: |  # 初始化主从复制的SQL脚本CREATE USER 'repl'@'%' IDENTIFIED BY 'xx';  # 密码需与Secret中一致GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';FLUSH PRIVILEGES;

4. 创建 Service (主从分离访问)

# 主节点服务
apiVersion: v1
kind: Service
metadata:name: mysql-masternamespace: mysql-cluster
spec:ports:- name: mysqlport: 3306selector:app: mysqlrole: masterclusterIP: None# 从节点服务
apiVersion: v1
kind: Service
metadata:name: mysql-slavenamespace: mysql-cluster
spec:ports:- name: mysqlport: 3306selector:app: mysqlrole: slaveclusterIP: None

5. 创建 StatefulSet (1主2从)

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysqlnamespace: mysql-cluster
spec:serviceName: mysqlreplicas: 3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlrole: slave  # 默认标记为slave,init容器中将修改第一个Pod为masterspec:initContainers:- name: init-mysqlimage: mysql:8.0command:- bash- "-c"- |# 根据Pod序号分配server-id和角色[[ `hostname` =~ -([0-9]+)$ ]] || exit 1ordinal=${BASH_REMATCH[1]}if [[ $ordinal -eq 0 ]]; then# 主节点配置cp /mnt/config/master.cnf /mnt/conf.d/echo "role=master" > /mnt/conf.d/roleelse# 从节点配置cp /mnt/config/slave.cnf /mnt/conf.d/echo "role=slave" > /mnt/conf.d/rolefivolumeMounts:- name: confmountPath: /mnt/conf.d- name: config-mapmountPath: /mnt/config- name: clone-mysqlimage: alpine:3.18command:- bash- "-c"- |# 只有从节点需要等待主节点初始化完成if [ -f /mnt/conf.d/role ] && grep -q "slave" /mnt/conf.d/role; thenuntil nslookup mysql-0.mysql; dosleep 2donefivolumeMounts:- name: confmountPath: /mnt/conf.dcontainers:- name: mysqlimage: mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretskey: root-password- name: MYSQL_REPL_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretskey: replication-passwordports:- name: mysqlcontainerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysql- name: confmountPath: /etc/mysql/conf.d- name: init-sqlmountPath: /docker-entrypoint-initdb.dlivenessProbe:exec:command: ["mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]initialDelaySeconds: 30periodSeconds: 10readinessProbe:exec:command: ["mysql", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "-e", "SELECT 1"]initialDelaySeconds: 5periodSeconds: 5volumes:- name: confemptyDir: {}- name: config-mapconfigMap:name: mysql-configitems:- key: master.cnfpath: master.cnf- key: slave.cnfpath: slave.cnf- name: init-sqlconfigMap:name: mysql-configitems:- key: init.sqlpath: init.sqlvolumeClaimTemplates:- metadata:name: dataspec:accessModes: ["ReadWriteOnce"]storageClassName: "standard"  # 根据环境调整resources:requests:storage: 10Gi

6. 主从初始化自动化脚本 (StatefulSet启动后执行)

主节点启动后自动创建复制用户,从节点自动连接主节点:

# 在StatefulSet的Pod模板中添加以下生命周期钩子
lifecycle:postStart:exec:command:- "/bin/bash"- "-c"- |if [ -f /etc/mysql/conf.d/role ] && grep -q "master" /etc/mysql/conf.d/role; then# 主节点执行初始化SQLmysql -uroot -p${MYSQL_ROOT_PASSWORD} < /docker-entrypoint-initdb.d/init.sqlelse# 从节点配置主从复制until mysql -h mysql-0.mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SELECT 1"; dosleep 1donemysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "CHANGE MASTER TOMASTER_HOST='mysql-0.mysql',MASTER_USER='repl',MASTER_PASSWORD='${MYSQL_REPL_PASSWORD}',MASTER_AUTO_POSITION=1;START SLAVE;"fi

验证主从同步

# 检查主节点状态
kubectl exec -it mysql-0 -n mysql-cluster -- mysql -uroot -p -e "SHOW MASTER STATUS\G"# 检查从节点同步状态
kubectl exec -it mysql-1 -n mysql-cluster -- mysql -uroot -p -e "SHOW SLAVE STATUS\G"

关键注意事项:

  1. 主节点高可用:此方案主节点单点,若需高可用,需结合 OrchestratorProxySQL 实现故障转移。
  2. 数据持久化:确保 storageClassName 与实际存储系统匹配(如 rook-cephfsnfs)。
  3. 密码安全:通过Secret管理敏感信息,禁止明文存储。
  4. 网络通信:确保StatefulSet的Pod之间可通过DNS名称互相访问(如 mysql-0.mysql.mysql-cluster.svc.cluster.local)。
  5. 扩展性:通过增加 replicas 数量扩展从节点。

完整架构示意图:

Client -> Service(mysql-master) -> Pod(mysql-0) [Master]
Client -> Service(mysql-slave)  -> Pod(mysql-1, mysql-2) [Slave]

可根据需求调整副本数量或增加读写分离中间件(如ProxySQL)。

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

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

相关文章

如何使用 GPT-4o 翻译播客声音

Voice Translation into Different Languages | OpenAI Cookbook 如何使用 GPT-4o 将播客翻译并配音成您的母语 您是否曾想过将播客翻译成您的母语&#xff1f;翻译和配音音频内容可以让全球更多的观众获取信息。而现在&#xff0c;借助 GPT-4o 的音频输入&#xff08;audio-i…

Lab17_ Blind SQL injection with out-of-band data exfiltration

文章目录 前言&#xff1a;进入实验室构造 payload 前言&#xff1a; 实验室标题为&#xff1a; 带外数据泄露的 SQL 盲注 简介&#xff1a; 本实验包含一个SQL盲目注入漏洞。应用程序使用跟踪Cookie进行分析&#xff0c;并执行包含提交的Cookie值的SQL查询。 SQL查询是异…

深入解析 configService.addListener 使用中的注意事项

在使用 Nacos 的 configService.addListener 方法进行配置监听时&#xff0c;为了确保程序的稳定性、可靠性以及高效性&#xff0c;有诸多注意事项需要我们关注。下面将对这些关键要点进行详细阐述。 一、连接稳定性 1.1 网络连接问题 Nacos 客户端与服务端通过网络进行通信&…

C/C++蓝桥杯算法真题打卡(Day4)

一、P11041 [蓝桥杯 2024 省 Java B] 报数游戏 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;// 计算第 n 个满足条件的数 long long findNthNumber(long long n) {long long low 1, high 1e18; // 二分查找范围while (low < high) {lo…

【Python 数据结构 10.二叉树】

目录 一、二叉树的基本概念 1.二叉树的定义 2.二叉树的特点 3.特殊的二叉树 Ⅰ、斜树 Ⅱ、满二叉树 Ⅲ、完全二叉树 Ⅳ、完全二叉树和满二叉树的区别 4.二叉树的性质 5.二叉树的顺序存储 Ⅰ、完全二叉树 Ⅱ、非完全二叉树 Ⅲ、稀疏二叉树 6.二叉树的链式存储 7.二叉树的遍历概念…

Windows 系统 Docker Desktop 入门教程:从零开始掌握容器化技术

文章目录 前言一、Docker 简介二、Docker Desktop 安装2.1 系统要求2.2 安装步骤 三、Docker 基本概念四、Docker 常用命令五、实战&#xff1a;运行你的第一个容器5.1 拉取并运行 Nginx 容器5.2 查看容器日志5.3 停止并删除容器 六、总结 前言 随着云计算和微服务架构的普及&…

可变参数与递归

可变参数与递归 可变参数 package method; ​ public class Demo03 {public static void main(String[] args) {Demo03 demo03new Demo03();demo03.test(1,2,3);​}public void test (int... i){System.out.println(i[0]);//1System.out.println(i[1]);//2System.out.println(…

【redis】全局命令exists、del、expire、ttl(惰性删除和定期删除)

exists——判定 key 是否存在 语法&#xff1a; exists key [key...] # 返回值&#xff1a;key 存在的个数针对多个 key 来说&#xff0c;是非常有用的时间复杂度 O ( 1 ) O(1) O(1) Redis 组织这些 key 就是按照哈希表的方式来组织的。Redis 支持很多数据结构指的是 value …

系统架构设计师—系统架构设计篇—特定领域软件体系结构

文章目录 概述领域分类垂直域水平域 系统模型基本活动参与角色 概述 特定领域软件架构&#xff08;Domain Specific Software Architecture&#xff0c;DSSA&#xff09;是在一个特定应用领域中&#xff0c;为一组应用提供组织结构参考的标准团建体系结构。 领域分类 垂直域…

OpenManus:优点突出,短板也明显

最近&#xff0c;OpenManus 在 AI 领域掀起了一阵热潮。作为开源版的智能代理软件&#xff0c;它自诞生起就备受瞩目。今天&#xff0c;咱们就来深入聊聊 OpenManus 在实际测试中的表现&#xff0c;看看它到底有哪些过人之处&#xff0c;又存在哪些不足。​ 优点大起底​ 开源…

VUE3项目的文档结构分析

1. Vue 3 项目的文档结构 Vue 3 项目通常基于 Vue CLI 或 Vite 等工具创建&#xff0c;其文档结构如下&#xff1a; 常见目录结构 my-vue-project/ ├── public/ # 静态资源目录 │ ├── index.html # 入口页面 ├── src/ …

P8662 [蓝桥杯 2018 省 AB] 全球变暖--DFS

P8662 [蓝桥杯 2018 省 AB] 全球变暖--dfs 题目 解析讲下DFS代码 题目 解析 这道题的思路就是遍历所有岛屿&#xff0c;判断每一块陆地是否会沉没。对于这种图的遍历&#xff0c;我们首先应该想到DFS。 代码的注意思想就是&#xff0c;在主函数中遍历找出所有岛屿&#xff0c…

mmseg

系列文章目录 文章目录 系列文章目录bug bug File "/public/home/rsinfo/project/mmsegmentation/mmseg/__init__.py", line 61, in <module>assert (mmcv_min_version < mmcv_version < mmcv_max_version), \ AssertionError: MMCV2.2.0 is used but i…

AI多模态教程:DeepSeek多模态模型解析及实践指南

AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台&#xff0c;涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等…

【银河麒麟高级服务器操作系统实例】虚拟机桥接网络问题分析及处理

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…

使用腾讯ncnn加速推理yolo v9对比opencv dnn

前面博客 【opencv dnn模块 示例(25) 目标检测 object_detection 之 yolov9 介】 绍了 yolov9 详细使用方式&#xff0c;重参数化、导出端到端模型&#xff0c;使用 torch、opencv、tensorrt 以及 paddle 的测试。 由于存在移动端推理部署的需求&#xff0c;需要进行加速处理&…

前端小食堂 | Day10 - 前端路由の时空裂隙

🕳️ 今日穿梭指南:两种维度の路由宇宙 1. Hash 模式:锚点の量子隧道 // 手动创建路由监听器 window.addEventListener(hashchange, () => {const path = location.hash.slice(1) || /; console.log(进入哈希宇宙:, path); renderComponent(path); }); // 编程…

C语言学习笔记-进阶(7)字符串函数3

1. strstr的使用和模拟实现 char * strstr ( const char * str1, const char * str2); Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. &#xff08;函数返回字符串str2在字符串str1中第⼀次出现的位置&#x…

HarmonyOS Next 属性动画和转场动画

HarmonyOS Next 属性动画和转场动画 在鸿蒙应用开发中&#xff0c;动画是提升用户体验的关键要素。通过巧妙运用动画&#xff0c;我们能让应用界面更加生动、交互更加流畅&#xff0c;从而吸引用户的注意力并增强其使用粘性。鸿蒙系统为开发者提供了丰富且强大的动画开发能力&…

PHP:phpstudy无法启动MySQL服务问题解决

文章目录 一、问题说明二、解决问题 一、问题说明 我的Windows10系统&#xff0c;之前安装过MySQL5.7的版本。 然后&#xff0c;用phpstudy安装MySQL8&#xff0c;并启动MySQL8。 发生无法启动的情况。 二、解决问题 1、删除本地MySQL7的服务 net stop MySQL //这里的服务名…