K8S-statefulset-mysql-ha

需求

實現一個HA mysql,包括1個master,2個slave。在K8S上已statefulset部署。

mysql HA原理

K8S環境需要解決的問題

1、由于使用同一個statefulset配置,因此需要考慮master和slave使用不同的cnf文件。

2、不同pod之間文件的傳輸

3、容器重啟之后,有些狀態不能改變。

K8S部署

configmap

apiVersion: v1
kind: ConfigMap
metadata:name: mysqllabels:app: mysql
data:master.cnf: |# Apply this config only on the master.[mysqld]log-binslave.cnf: |# Apply this config only on slaves.[mysqld]super-read-only

master.cnf用于master節點,slave.cnf用于slave節點。

service

#寫要通過mysql-0來寫
apiVersion: v1
kind: Service
metadata:name: mysqllabels:app: mysql
spec:ports:- name: mysqlport: 3306clusterIP: None  #與service不同selector:app: mysql
---
#用于讀
apiVersion: v1
kind: Service
metadata:name: mysql-readlabels:app: mysql
spec:ports:- name: mysqlport: 3306selector:app: mysql

statefulset

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:selector:matchLabels:app: mysqlserviceName: mysqlreplicas: 3template:metadata:labels:app: mysqlspec:
#----------------初始化容器部分-----------------  initContainers:             //pod初始化階段,第一個初始化容器#=============== 初始化mysql- name: init-mysqlimage: reg.westos.org/k8s/mysql:5.7command:- bash- "-c"- |set -ex# 通過hostname創建 mysql server-id 。[[ `hostname` =~ -([0-9]+)$ ]] || exit 1ordinal=${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# 根據pod序號從configmap拷貝不同cnfif [[ $ordinal -eq 0 ]]; thencp /mnt/config-map/master.cnf /mnt/conf.d/elsecp /mnt/config-map/slave.cnf /mnt/conf.d/fivolumeMounts:- name: conf   #emptyDir保證每次啟動pod都會重新生成,這樣每次configmap都會生效。mountPath: /mnt/conf.d- name: config-mapmountPath: /mnt/config-map#==========拷貝數據文件    - name: clone-mysql            //第二個初始化容器,主從復制image: reg.westos.org/k8s/xtrabackup:1.0command:- bash- "-c"- |set -ex# 數據已存在則退出.[[ -d /var/lib/mysql/mysql ]] && exit 0# master節點 直接退出 (ordinal index 0).[[ `hostname` =~ -([0-9]+)$ ]] || exit 1ordinal=${BASH_REMATCH[1]}[[ $ordinal -eq 0 ]] && exit 0# 從其他節點(前一個節點)拷貝數據文件. 僅接收數據,接收完數據就退出。ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql# 準備備份為后面的節點服務.xtrabackup --prepare --target-dir=/var/lib/mysqlvolumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.d
#--------------容器定義部分--------------------           containers:#===========mysql容器- name: mysql                   image: reg.westos.org/k8s/mysql:5.7env:- name: MYSQL_ALLOW_EMPTY_PASSWORDvalue: "1"ports:- name: mysqlcontainerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dresources:requests:cpu: 500mmemory: 1GilivenessProbe:exec:command: ["mysqladmin", "ping"]initialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 5readinessProbe:exec:# Check we can execute queries over TCP (skip-networking is off).command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]initialDelaySeconds: 5periodSeconds: 2timeoutSeconds: 1#=========  備份容器    - name: xtrabackup          image: reg.westos.org/k8s/xtrabackup:1.0ports:- name: xtrabackupcontainerPort: 3307command:- bash- "-c"- |set -excd /var/lib/mysql#  從備份信息文件里讀取MASTER_LOG_FILEM和MASTER_LOG_POS這兩個字段的值,用來拼裝集群初始化SQLif [[ -f xtrabackup_slave_info && "x$(<xtrabackup_slave_info)" != "x" ]]; then# 如果xtrabackup_slave_info文件存在,說明這個備份數據來自于另一個Slave節點。#這種情況下,XtraBackup工具在備份的時候,就已經在這個文件里自動生成了"CHANGE MASTER TO" SQL語句。#所以,我們只需要把這個文件重命名為change_master_to.sql.in,后面直接使用即可# 由于從slave節點拷貝,因此把最后一個分號去掉。cat xtrabackup_slave_info | sed -E 's/;$//g' > change_master_to.sql.in# 就用不著xtrabackup_binlog_info了,刪除rm -f xtrabackup_slave_info xtrabackup_binlog_infoelif [[ -f xtrabackup_binlog_info ]]; then#如果只存在xtrabackup_binlog_inf文件,那說明備份來自于Master節點,#我們就需要解析這個備份信息文件,讀取MASTER_LOG_FILEM和MASTER_LOG_POS這兩個字段的值[[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1#刪除不用了rm -f xtrabackup_binlog_info xtrabackup_slave_infoecho "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.infi# 如果change_master_to.sql.in存在,就意味著需要做集群初始化工作if [[ -f change_master_to.sql.in ]]; then#一定要先等MySQL容器啟動之后才能進行下一步連接MySQL的操作echo "Waiting for mysqld to be ready (accepting connections)"until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; doneecho "Initializing replication from clone position"# 使用change_master_to.sql.in的內容,拼裝SQL,組成一個完整的初始化和啟動Slave的SQL語句mysql -h 127.0.0.1 \-e "$(<change_master_to.sql.in), \MASTER_HOST='mysql-0.mysql', \MASTER_USER='root', \MASTER_PASSWORD='', \MASTER_CONNECT_RETRY=10; \START SLAVE;" || exit 1#  將文件change_master_to.sql.in改個名字,防止這個Container重啟的時候,因為又找到了change_master_to.sql.in,從而重復執行一遍這個初始化流程mv change_master_to.sql.in change_master_to.sql.origfi#使用ncat監聽3307端口。它的作用是,在收到傳輸請求的時候,直接執行"xtrabackup --backup"命令,備份MySQL的數據并發送給請求者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: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dresources:requests:cpu: 100mmemory: 100Mivolumes:- name: confemptyDir: {}- name: config-mapconfigMap:name: mysql
#---------------數據持久化部分-----------------        volumeClaimTemplates:- metadata:name: dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 10Gi

原理

部署結構

image-20210407171052689

使用statefulset部署pod,headless service 訪問服務。service 訪問read節點。

init-mysql容器

init-mysql容器主要用于根據節點的類型不同生成server-id和拷貝cnf文件。

容器使用的目錄是容器內部的目錄,因此每次啟動pod,容器都會重新創建。server-id不會變。

clone-mysql容器

容器主要用于從其他節點拷貝數據文件到 slave節點。

mysql容器

mysql運行容器。

xtrabackup容器

備份還原工具

共享目錄

conf 目錄 掛載在init-mysql容器的/mnt/conf.d目錄,clone-mysql容器的/etc/mysql/conf.d目錄,,mysql容器的/etc/mysql/conf.d目錄。通過此方式實現數據文件共用。

ncat

說起ncat我們不得不說一下Netcat。Netcat用于從TCP/UDP連接中讀取或發送網絡數據。cat是Linux中查看或連接文件的命令,所以netcat本意為從網絡上查看文件內容。

鏡像說明

  • reg.westos.org/k8s/mysql:5.7

  • reg.westos.org/k8s/xtrabackup:1.0
    備份還原鏡像

探針

mysql容器探針

livenessProbe:mysqladmin ping
readinessProbe:mysql -h 127.0.0.1 -e "SELECT 1 "

附錄

參考

mysql主從搭建:https://blog.csdn.net/demon7552003/article/details/124728616

xtrabackup原理:https://blog.csdn.net/ChenVast/article/details/72594055,https://blog.csdn.net/yu891203/article/details/106758822

ncat詳細介紹:https://blog.csdn.net/demon7552003/article/details/117162103

解決K8S/openshift等限制以root賬戶運行問題


Dockerfile


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906813.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人臉美顏磨皮祛痘1:數據集說明(含下載鏈接)

一. 前言 本篇博客是《人臉美顏磨皮祛痘》系列文章之《數據集說明(含下載鏈接)》&#xff0c;像這種深度學習圖像修復的數據一般是需要成對&#xff0c;網上很難找到&#xff0c;公司或者個人都是花錢找人做。為了方便你我他&#xff0c;本博客將分享一個由我自己整理的人臉美…

redis功能清單

文章目錄 Redis高級功能使用說明功能清單1. 分布式鎖1.1 功能描述1.2 使用方法1.3 測試接口 2. 消息發布訂閱2.1 功能描述2.2 使用方法發布消息訂閱消息 2.3 測試接口 3. 接口限流3.1 功能描述3.2 使用方法方式一&#xff1a;直接使用工具類方式二&#xff1a;使用注解&#xf…

從代碼學習深度學習 - 預訓練word2vec PyTorch版

文章目錄 前言輔助工具1. 繪圖工具 (`utils_for_huitu.py`)2. 數據處理工具 (`utils_for_data.py`)3. 訓練輔助工具 (`utils_for_train.py`)預訓練 Word2Vec - 主流程1. 環境設置與數據加載2. 跳元模型 (Skip-gram Model)2.1. 嵌入層 (Embedding Layer)2.2. 定義前向傳播3. 訓練…

Python實現對大批量Word文檔進行自動添加頁碼(16)

前言 本文是該專欄的第16篇,后面會持續分享Python辦公自動化干貨知識,記得關注。 在處理word文檔的時候,相信或多或少都遇到過這樣的需求——需要對“目標word文檔,自動添加頁碼”。 換言之,如果有大批量的word文檔文件需要你添加頁碼,這個時候最聰明的辦法就是使用“程…

云原生安全:Linux命令行操作全解析

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 ——從基礎概念到安全實踐的完整指南 一、基礎概念 1. Shell與終端交互 Shell是Linux命令行的解釋器&#xff08;如Bash、Zsh&#xff09;&#xff0c;負…

Day 34

GPU訓練 要讓模型在 GPU 上訓練&#xff0c;主要是將模型和數據遷移到 GPU 設備上。 在 PyTorch 里&#xff0c;.to(device) 方法的作用是把張量或者模型轉移到指定的計算設備&#xff08;像 CPU 或者 GPU&#xff09;上。 對于張量&#xff08;Tensor&#xff09;&#xff1…

C++筆試題(金山科技新未來訓練營):

題目分布&#xff1a; 17道單選&#xff08;每題3分&#xff09;3道多選題&#xff08;全對3分&#xff0c;部分對1分&#xff09;2道編程題&#xff08;每一道20分&#xff09;。 不過題目太多&#xff0c;就記得一部分了&#xff1a; 單選題&#xff1a; static變量的初始…

Spark(29)基礎自定義分區器

&#xff08;一&#xff09;什么是分區 【復習提問&#xff1a;RDD的定義是什么&#xff1f;】 在 Spark 里&#xff0c;彈性分布式數據集&#xff08;RDD&#xff09;是核心的數據抽象&#xff0c;它是不可變的、可分區的、里面的元素并行計算的集合。 在 Spark 中&#xf…

python打卡訓練營打卡記錄day35

知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀推理的寫法&#xff1a;評估模式 作業&#xff1a;調整模型定義時的超參數&#xff0c;對比下效果 1…

【MySQL】07.表內容的操作

1. insert 我們先創建一個表結構&#xff0c;這部分操作我們使用這張表完成我們的操作&#xff1a; mysql> create table student(-> id int primary key auto_increment,-> name varchar(20) not null,-> qq varchar(20) unique-> ); Query OK, 0 rows affec…

使用SQLite Expert個人版VACUUM功能修復數據庫

使用SQLite Expert個人版VACUUM功能修復數據庫 一、SQLite Expert工具簡介 SQLite Expert 是一款功能強大的SQLite數據庫管理工具&#xff0c;分為免費的個人版&#xff08;Personal Edition&#xff09;和收費的專業版&#xff08;Professional Edition&#xff09;。其核心功…

LM-BFF——語言模型微調新范式

gpt3&#xff08;GPT3——少樣本示例推動下的通用語言模型雛形)結合提示詞和少樣本示例后&#xff0c;展示出了強大性能。但大語言模型的訓練門檻太高&#xff0c;普通研究人員無力&#xff0c;LM-BFF(Making Pre-trained Language Models Better Few-shot Learners)的作者受gp…

遙感解譯項目Land-Cover-Semantic-Segmentation-PyTorch之二訓練模型

遙感解譯項目Land-Cover-Semantic-Segmentation-PyTorch之一推理模型 背景 上一篇文章了解了這個項目的環境安裝和模型推理,這篇文章介紹下如何訓練這個模型,添加類別 下載數據集 在之前的一篇文章中,也有用到這個數據集 QGIS之三十六Deepness插件實現AI遙感訓練模型 數…

【NLP 71、常見大模型的模型結構對比】

三到五年的深耕&#xff0c;足夠讓你成為一個你想成為的人 —— 25.5.8 模型名稱位置編碼Transformer結構多頭機制Feed Forward層設計歸一化層設計線性層偏置項激活函數訓練數據規模及來源參數量應用場景側重GPT-5 (OpenAI)RoPE動態相對編碼混合專家架構&#xff08;MoE&#…

[250521] DBeaver 25.0.5 發布:SQL 編輯器、導航器全面升級,新增 Kingbase 支持!

目錄 DBeaver 25.0.5 發布&#xff1a;SQL 編輯器、導航器全面升級&#xff0c;新增 Kingbase 支持&#xff01; DBeaver 25.0.5 發布&#xff1a;SQL 編輯器、導航器全面升級&#xff0c;新增 Kingbase 支持&#xff01; 近日&#xff0c;DBeaver 發布了 25.0.5 版本&#xf…

服務器硬盤虛擬卷的處理

目前的情況是需要刪除邏輯卷&#xff0c;然后再重新來弄一遍。 數據已經備份好了&#xff0c;所以不用擔心數據會丟失。 查看服務器的具體情況 使用 vgdisplay 操作查看服務器的卷組情況&#xff1a; --- Volume group ---VG Name vg01System IDFormat …

Flutter 中 build 方法為何寫在 StatefulWidget 的 State 類中

Flutter 中 build 方法為何寫在 StatefulWidget 的 State 類中 在 Flutter 中&#xff0c;build 方法被設計在 StatefulWidget 的 State 類中而非 StatefulWidget 類本身&#xff0c;這種設計基于幾個重要的架構原則和實際考量&#xff1a; 1. 核心設計原因 1.1 生命周期管理…

傳統醫療系統文檔集中標準化存儲和AI智能化更新路徑分析

引言 隨著醫療數智化建設的深入推進&#xff0c;傳統醫療系統如醫院信息系統(HIS)、臨床信息系統(CIS)、護理信息系統(NIS)、影像歸檔與通信系統(PACS)和實驗室信息系統(LIS)已經成為了現代醫療機構不可或缺的技術基礎設施。這些系統各自承擔著不同的功能&#xff0c;共同支撐…

探索常識性概念圖譜:構建智能生活的知識橋梁

目錄 一、知識圖譜背景介紹 &#xff08;一&#xff09;基本背景 &#xff08;二&#xff09;與NLP的關系 &#xff08;三&#xff09;常識性概念圖譜的引入對比 二、常識性概念圖譜介紹 &#xff08;一&#xff09;常識性概念圖譜關系圖示例 &#xff08;二&#xff09…

Linux/aarch64架構下安裝Python的Orekit開發環境

1.背景 國產化趨勢越來越強&#xff0c;從軟件到硬件&#xff0c;從操作系統到CPU&#xff0c;甚至顯卡&#xff0c;就產生了在國產ARM CPU和Kylin系統下部署Orekit的需求&#xff0c;且之前的開發是基于Python的&#xff0c;需要做適配。 2.X86架構下安裝Python/Orekit開發環…