《Kubernetes 構建 MySQL MGR 集群實戰教程》

#### 一、前言 ?

MySQL Group Replication (MGR) 是 MySQL 官方提供的高可用集群方案,基于 Paxos 協議實現多節點數據強一致性。本教程將指導如何在 Kubernetes 上部署 MySQL MGR 集群,適用于生產級高可用場景。

---

#### 二、環境準備 ?

1. **Kubernetes 集群** ?

? ?- 版本 ≥ 1.24,支持 StatefulSet 和 PersistentVolume。 ?
- 推薦工具:Minikube(測試)或 kubeadm 部署的生產集群。 ?

2. **存儲類(StorageClass)** ?

? ?- 確保動態存儲供應已配置(如 `standard` 或 `rook-cephfs`)。 ?

3. **MySQL 鏡像** ?

? ?- 使用官方鏡像或定制鏡像(需包含 MGR 插件): ?

? ? ?```dockerfile
FROM mysql:8.0.28
RUN echo "plugin-load-add=group_replication.so" >> /etc/mysql/my.cnf
```

---

#### 三、部署 MySQL MGR 集群 ?

##### 1. 創建 nfs網絡存儲配置

```yaml
# 在 czkmaster1 上搭建 NFS 服務器(選擇存儲空間足夠的節點)
sudo yum install -y nfs-utils
sudo mkdir -p /nfs/mysql/mysql-data-mysql-{0,1,2}
sudo chown -R 999:999 /nfs/mysql ?# MySQL 容器用戶ID
sudo chmod -R 755 /nfs/mysql

# 配置 NFS 共享
echo "/nfs/mysql *(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports

# 啟動 NFS 服務
sudo systemctl enable --now nfs-server rpcbind
sudo exportfs -a

# 在其他節點安裝 NFS 客戶端
sudo yum install -y nfs-utils
```

##### 2. 創建 ConfigMap 配置 ?

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
namespace: mysql
data:
my.cnf: |
[mysqld]
server-id=1
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64

# Group Replication配置
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="mysql-0.mysql:33061"
loose-group_replication_group_seeds="mysql-0.mysql:33061,mysql-1.mysql:33061,mysql-2.mysql:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=on
loose-group_replication_enforce_update_everywhere_checks=off

max_connections=1000
innodb_buffer_pool_size=1G

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
```

##### 3. 創建 nfs-storageclass 配置 ?

```yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-mysql
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
archiveOnDelete: "false"
pathPattern: "${.PVC.namespace}/${.PVC.name}"
```

##### 4. 創建 secret 配置 ?

```yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: mysql
type: Opaque
data:
root-password: bXlzcWwtcm9vdC0xMjM= ?# mysql-root-123
replication-password: cmVwbGljYXRpb24tMTIz ?# replication-123
```

##### 5. 創建 Headless Service 與 四層代理

```yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: mysql
spec:
ports:
- name: mysql
port: 3306
targetPort: 3306
clusterIP: None
selector:
app: mysql
---
apiVersion: v1
kind: Service
metadata:
name: mysql-read
namespace: mysql
spec:
ports:
- name: mysql
port: 3306
targetPort: 3306
selector:
app: mysql
```

##### 6. 創建 pv-final.yaml

```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-0
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-mysql
nfs:
path: /nfs/mysql/mysql-data-mysql-0
server: 192.168.179.170
claimRef:
name: mysql-data-mysql-0
namespace: mysql
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-1
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-mysql
nfs:
path: /nfs/mysql/mysql-data-mysql-1
server: 192.168.179.170
claimRef:
name: mysql-data-mysql-1
namespace: mysql
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-2
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-mysql
nfs:
path: /nfs/mysql/mysql-data-mysql-2
server: 192.168.179.170
claimRef:
name: mysql-data-mysql-2
namespace: mysql
```

##### 7. 部署 StatefulSet ?

```yaml
[root@czkmaster1 mysql]# cat mysql-simple-statefulset.yaml?
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: mysql
spec:
serviceName: mysql ?# 核心:與 Headless Service 匹配,確保 DNS 生成
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: docker.io/library/mysql:8.0.28
ports:
- containerPort: 3306 ?# MySQL 業務端口
- containerPort: 33061 ?# 【補充】MGR 集群通信端口(必需)
env:
- name: MYSQL_ROOT_PASSWORD
value: "mysql-root-123"
- name: MYSQL_DATABASE
value: "appdb"
- name: MYSQL_ROOT_PASSWORD
value: "mysql-root-123"
- name: MYSQL_REPLICATION_PASSWORD ?# 添加復制密碼
value: "replication-123"
- name: MYSQL_DATABASE
value: "appdb"
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql ?# 數據持久化
- name: mysql-config
mountPath: /etc/mysql/conf.d/ ?# 配置文件掛載(MGR 參數通過這里注入)
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "2Gi"
cpu: "1000m"
# 【補充】就緒探針:確保 MySQL 服務正常后才加入集群
readinessProbe:
exec:
command: ["mysqladmin", "ping", "-uroot", "-p$(MYSQL_ROOT_PASSWORD)"]
initialDelaySeconds: 30 ?# 啟動后延遲30秒檢查(避免服務未就緒誤判)
periodSeconds: 10 ?# 每10秒檢查一次
timeoutSeconds: 5 ?# 超時時間5秒
volumes:
- name: mysql-config
configMap:
name: mysql-config ?# 需確保該 ConfigMap 已創建
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-mysql" ?# 你的 NFS 存儲類,確保可用
resources:
requests:
storage: 10Gi

```

#### 四、初始化 MGR 集群 ?

1. **檢查pod狀態** ?

? ?```
kubectl get pods -n mysql -o wide
```

2. **測試MYSQL鏈接** ?

? ?```
kubectl exec -it mysql-0 -n mysql -- mysql -uroot -pmysql-root123 -e "SHOW DATABASES;"
```

3. **檢查MYSQL版本和插件支持** ?

? ?```
kubectl exec -it mysql-0 -n mysql -- mysql -uroot -pmysql-root-123 -e "SELECT VERSION(); SHOW PLUGINS;"
```

4. **在每個節點上安裝Group Replication插件** ?

? ?```
for i in 0 1 2; do
kubectl exec -it mysql-$i -n mysql -- mysql -uroot -pmysql-root-123 -e "INSTALL PLUGIN group_replication SONAME 'group_replication.so';"
done
```

5. **驗證插件安裝**

? ?```
kubectl exec -it mysql-0 -n mysql -- mysql -uroot -pmysql-root-123 -e "SHOW PLUGINS LIKE '%group%';"
```

6. **批量執行從節點加入命令**

? ?```
for i in 1 2; do
kubectl exec -i mysql-$i -n mysql -- mysql -uroot -pmysql-root-123 -e "
# 配置從節點參數
SET GLOBAL group_replication_local_address=CONCAT('mysql-', $i, '.mysql:33061');
SET GLOBAL group_replication_group_seeds='mysql-0.mysql:33061,mysql-1.mysql:33061,mysql-2.mysql:33061';
SET GLOBAL group_replication_ip_allowlist='%';

# 配置復制用戶并啟動組復制
CHANGE MASTER TO?
MASTER_USER='root',?
MASTER_PASSWORD='mysql-root-123'?
FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
"
done
```

7. **最終驗證整個集群狀態**

? ?```
kubectl exec -i mysql-0 -n mysql -- mysql -uroot -pmysql-root-123 -e "
SELECT MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE?
FROM performance_schema.replication_group_members;
"
```

8. **成功標志(所有節點 ONLINE)**

? ?```
+-------------+--------------+-------------+
| MEMBER_HOST | MEMBER_STATE | MEMBER_ROLE |
+-------------+--------------+-------------+
| mysql-0 ? ? | ONLINE ? ? ? | PRIMARY ? ? |
| mysql-1 ? ? | ONLINE ? ? ? | SECONDARY ? |
| mysql-2 ? ? | ONLINE ? ? ? | SECONDARY ? |
+-------------+--------------+-------------+
```

---

#### 五、高可用測試 ?

1. **故障轉移** ?
- 手動刪除 `mysql-0` Pod,觀察其他節點是否自動選舉新 Primary。 ?
2. **數據一致性** ?
- 在 Primary 節點插入數據,檢查 Secondary 節點是否同步。 ?

---

#### 六、監控與維護 ?

1. **Prometheus 監控** ?
- 配置 MySQL Exporter 采集 MGR 指標。 ?
2. **備份策略** ?
- 使用 `mysqldump` 或 Percona XtraBackup 定期備份。 ?

---

#### 七、常見問題 ?

1. **節點無法加入集群** ?
- 檢查防火墻是否放行 3306 端口。 ?
- 驗證 `group_replication_group_seeds` 配置。 ?
2. **腦裂問題** ?
- 確保奇數節點數(如 3 或 5)。 ?

---

#### 八、總結 ?

通過 Kubernetes StatefulSet 和 MySQL MGR 的結合,可實現高可用、強一致的數據庫集群。后續可擴展讀寫分離或自動化運維工具(如 Operator)進一步提升效率。

?

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

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

相關文章

影視APP源碼 SK影視 安卓+蘋果雙端APP 反編譯詳細視頻教程+源碼

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 影視APP源碼 SK影視 安卓蘋果雙端APP 反編譯詳細視頻教程源碼 自帶對接優效SDK廣告(已失效)。域名和IP都可以搭建。 自帶一起看和短劇頁面功能,三種…

pyqt+python之二進制生肖占卜

目錄 一、引言 二、GUI界面設計 1.效果演示 2.相關提示 3.界面設計.py 三、主要程序詳解 1.導入相關模塊 2.初始化設置 3.組內判斷 4.猜測過程 四、總程序代碼 一、引言 在數字時代,傳統文化與編程語言的碰撞總能迸發奇妙火花。本項目以PyQtPython為技術…

人工智能-python-深度學習-經典網絡模型-LeNets5

文章目錄LeNet-5(詳解)—— 從原理到 PyTorch 實現(含訓練示例)簡介LeNet-5 的核心思想LeNet-5 逐層結構詳解逐層計算舉例📌 輸入層📌 C1 卷積層📌 S2 池化層📌 C3 卷積層&#x1f4…

機器視覺的手機柔性屏貼合應用

在智能手機制造領域,柔性屏逐漸成為智能手機的主流選擇,柔性屏因其輕便、易于彎曲的特性,已成為現代電子設備的重要組成部分,但同時也帶來了前所未有的制造挑戰。柔性屏與傳統剛性玻璃屏有本質區別,它容易形變&#xf…

貪心算法應用:數字孿生同步問題詳解

Java中的貪心算法應用:數字孿生同步問題詳解 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是全局最好或最優的算法。下面我將全面詳細地講解貪心算法在數字孿生同步問題中的應用。…

UOS20系統安裝與 SSH/XRDP 遠程訪問功能配置指南

UOS20系統安裝與 SSH/XRDP 遠程訪問功能配置指南 一、UOS 20 系統安裝? ?1. 下載系統鏡像? 訪問統信官網下載 UOS 20 專業版鏡像(推薦適配當前硬件的版本): https://www.chinauos.com/resource/download-professional 2. 系統安裝與硬件配…

【Python】S1 基礎篇 P5 字典模塊指南

目錄字典的本質與底層實現基礎語法結構使用字典訪問字典中的值添加鍵值對修改字典中的值刪除鍵值對使用 get() 來訪問值遍歷字典遍歷所有鍵值對遍歷字典中的所有鍵遍歷字典中的所有值嵌套字典列表在字典中存儲列表字典(Dictionary)是Python中靈活且強大的…

計算機視覺之多模板匹配

簡介 計算機視覺第一課opencv(四)保姆級教學 之前說過模糊匹配只是對于單個目標進行匹配,今天我們就來學習一下如何對多個目標進行匹配 一、多目標匹配 對于這個圖片我們要匹配下面那個箭頭,我們可以發現圖中是有兩個位置相同的…

封裝日期選擇器組件,帶有上周,下周按鈕

ui圖組件代碼如下&#xff1a; <template><div><el-date-pickerv-model"dateRange"type"daterange"align"right"size"mini":editable"false"unlink-panelsrange-separator"至"start-placeholder&q…

基于SpringBoot+MYSQL開發的AI智能大數據醫療診斷平臺

角色&#xff1a; 管理員、醫生、居民 技術&#xff1a; SpringBoot、MyBatis、MySQL、Shiro、Beetl、Swagger、jQuery、Bootstrap 核心功能&#xff1a; 這是一個基于SpringBoot的社區醫療管理平臺&#xff0c;旨在為管理員提供用戶、角色、部門、菜單、日志等系統管理功能&am…

【MFC 小白日記】對話框編輯器里“原型圖像”到底要不要勾?3 分鐘看懂!

摘要&#xff1a;本文解析了MFC中Picture Control的"原型圖像(Prototype Image)"屬性的真實作用。該屬性僅在設計時提供可視化的占位圖預覽&#xff0c;方便UI布局&#xff0c;運行時不會影響程序表現。文章通過對比實驗驗證&#xff0c;勾選后會在對話框編輯器中顯示…

微信開放平臺第三方平臺,可以管理多個微信小程序

大家好&#xff0c;我是小悟。 這個系統可以幫助服務商更好地管理多個商家小程序&#xff0c;無需管理多個商家小程序的賬號密碼或者appId和secret&#xff0c;大大提升效率。 不需要頻繁登錄小程序后臺就能完成上傳代碼、認證、備案、提交代碼審核、發布小程序等操作。 這里錄…

Java全棧學習筆記32

-- drop table t_stu;-- unique 唯一約束的列允許為null-- 如果在之后的操作中。需要某列必須為key&#xff0c;才能做一些操作的情況下。也可以使用唯一約束代替主鍵約束-- create table t_stu(-- studId int,-- tel varchar(11) unique,-- sex varchar(1),-- addr va…

linux升級系統,重啟出現Minimal BASH-like line editingis supported

文章目錄一.問題背景二.解決步驟2.1確認系統分區2.2手動引導2.3 重建grub引導2.4 還原軟件包 一.問題背景 閑來無事&#xff0c;把ubuntu25.04通過sudo do-release-upgrade命令升級到了ubuntu25.10.在升級的過程會出現以下問題 1.自動替換flatpak程序為snap2.請求是否清除舊依賴…

type(類型別名)和 interface的區別和最佳實踐

核心結論在大多數情況下&#xff0c;它們可以互換使用&#xff0c;都能描述對象的結構。它們的區別更多在于設計和擴展能力上。主要區別總結表特性interface (接口)type (類型別名)擴展方式使用 extends 繼承interface A extends B {}使用 & 交叉類型type A B & C合并…

vscode中使用git、githup的基操

一、git提交 配置賬戶密碼 查看用戶信息 git config --global user.name # 查看用戶名 git config --global user.email # 查看郵箱賬戶配置 # 設置全局用戶名和郵箱 git config --global user.name "你的用戶名" git config --global user.email "你的郵箱&q…

jsBridge接入流程

import deviceInfo from ./deviceInfo import { setRefreshToken } from ./token// 設備判斷 const u navigator.userAgent export const isAndroid u.indexOf(Android) > -1 || u.indexOf(Adr) > -1 export const isIOS !!u.match(/\(i[^;];( U;)? CPU.Mac OS X/)…

【C++】19. 封裝紅?樹實現set和map

文章目錄一、源碼及框架分析二、模擬實現map和set1、insert的實現2、iterator的實現3、map?持[ ]4、模擬實現的完整源代碼1&#xff09;RBTree.h2&#xff09;Myset.h3&#xff09;Mymap.h4&#xff09;Test.cpp一、源碼及框架分析 SGI-STL30版本源代碼&#xff0c;map和set的…

面試不會問題

1. 什么是表鎖&#xff1f;什么是行鎖&#xff1f;什么情況下會使用表鎖&#xff1f;InnoDB引擎通過“索引”實現行鎖&#xff08;鎖定滿足條件的行&#xff09;&#xff0c;但如果操作無法通過索引定位行&#xff0c;會導致行鎖失效&#xff0c;進而升級為表鎖。常見的表現為&…

達夢數據庫-用戶,權限,角色

達夢數據庫-用戶,權限,角色 在達夢數據庫(DM8)中,用戶(User)、權限(Privilege)和角色(Role) 是數據庫安全體系的核心組成部分,用于控制誰可以訪問數據庫、能訪問哪些對象以及能執行哪些操作。 下面為你提供一份全面、詳細、結構化的說明,幫助你深入理解達夢數據…