實現MySQL master-slave架構在K8S平台內的部署與功能驗證

閱讀時間約 13 分鐘

上一篇說明了如何在Kubernetes上建立基本的MySQL standalone,並加入phpmyadmin(PMA)來進行圖形化的管理,本篇就再進階一步,實作MySQL replication架構(master-salve),並進行驗證是否成功。

raw-image

一般而言,在生產環境通常不會單純只用Standalone來運行這種類型的應用,至少會應用到本文所提到的MySQL replication或是MySQL cluster架構來確保資料的安全或高可用。

本文將分成以下部分進行說明:

  1. 什麼是MySQL replication?
  2. 實作MySQL replication(master-slave)
  3. 功能驗證
  4. 結論

1. 什麼是MySQL replication?

此處簡單說明什麼是MySQL replication,簡單來說就是將資料在多個節點上進行同步、備份以達成高可用的目的。

這種做法可以實現以下優點:

  1. 擴充性:在負載分散在多個slave上以提高效能。對於讀寫比要求較高的應用服務,replication可以透過增加slave節點來提供處理能力。並且因為寫入只能在master上提交,所以對於寫入要求高的效能提升較不明顯。
  2. 資料安全:slave可以中斷自已的replication程序,而不會影響到master。所以可以在slave上再達行備份任務。如果同樣的動作要在master上執行,則必須要將master狀態改為readonly,會影響服務。
  3. 分析:資料在master上寫入,但資料可以在slave上進行分析,所以不會影響服務的運作。通常利用mysql做資料分析的任務時,都是將slave做為資料接入端。
  4. 備援:可以將slave節點放在讀取需求較近的位置,可以讓資料取用的效率增加,不用一直往遠端的master節點去請求,對於災難備援有很大的好處。


※ 常用的架構有以下三種,簡單說明給大家有個基本了解:

1. Master-slave : 實務上大多數都是運行這種架構,主要是針對解決讀取壓力高的一種成本最底的解決方式。因為通常master與slave之間的延遲都不會太高,同時也可以透過增加slave的做法來拉高讀取需求的處理效率。

2. Master-master:為了減少master節點維護所造成的服務中斷時間,可以直接建立雙master架構來解決這個問題,實務上就是二個MySQL server互相將對方當做自已的master,自身為slave角色。

3. Master-salve-slave: 這種架構一般用在讀取的壓力特別大的情況,透過多層級的複製來減少master因為同時要處理請求又要複製資料到slave的壓力,等於由slave來負責將資料複製給下一層的slave。


2. 實作MySQL replication(master-slave)

raw-image
#-----------------------------------------
# S2-1. 加入helm source下載mysql部署清單
#-----------------------------------------
[master]# helm repo add bitnami https://charts.bitnami.com/bitnami
[master]# helm search repo bitnami/mysql -l
[master]# helm3 pull bitnami/mysql --version 9.3.4 --untar
[master]# ls mysql
raw-image
#-----------------------------------------
# S2-2. 修改value.yaml
#-----------------------------------------
[master]# vim values.ysml
...
#修改部署模式
architecture: replication

#DB相關帳號(root,user,replicastion user)、密碼(留空自動生成)DB
auth:
rootPassword: ""
createDatabase: true
database: "testapp"
username: "app"
password: ""
replicationUser: replicator
replicationPassword: ""

#修改mysql primary服務參數
primary:
persistence:
enabled: true
storageClass: "managed-nfs-storage"
accessModes:
- ReadWriteOnce
size: 8Gi
service:
type: NodePort
ports:
mysql: 3306
nodePorts:
mysql: "31006"

secondary:
persistence:
enabled: true
storageClass: "managed-nfs-storage"
accessModes:
- ReadWriteOnce
size: 8Gi
service:
type: NodePort
ports:
mysql: 3306
nodePorts:
mysql: "31005"
metrics:
enabled: true
#-----------------------------------------
# S2-3. 上傳鏡像到Harbor (optional)
#-----------------------------------------
[master]# docker pull bitnami/mysql:8.0.36-debian-12-r8
[master]# docker tag bitnami/mysql:8.0.36-debian-12-r8 harbor1.test.example.poc/mysql/mysql:8.0.36-debian-12-r8
[master]# docker push harbor1.test.example.poc/mysql/mysql:8.0.36-debian-12-r8

[master]# docker pull bitnami/mysqld-exporter:0.15.1-debian-12-r8
[master]# docker tag bitnami/mysqld-exporter:0.15.1-debian-12-r8 harbor1.test.example.poc/mysql/mysqld-exporter:0.15.1-debian-12-r8
[master]# docker push harbor1.test.example.poc/mysql/mysqld-exporter:0.15.1-debian-12-r8
raw-image
#-----------------------------------------
# S2-4. 安裝
#-----------------------------------------
[master]# helm install mysql ./mysql --namespace mysql-replication --create-namespace
[master]# helm list -n mysql-replication
[master]# kubectl get sts,pod -n mysql-replication -l app.kubernetes.io/name=mysq
raw-image

3.功能驗證

#-----------------------------------------
# S3-1. 取得自動生成的MySQL root, app, replication password
#-----------------------------------------
[master]# echo -n "MYSQL_ROOT_PASSWORD=";kubectl get secret --namespace mysql-replication mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d;echo
MYSQL_ROOT_PASSWORD=FLSDMzpjO3

[master]# echo -n "MYSQL_PASSWORD=";kubectl get secret --namespace mysql-replication mysql -o jsonpath="{.data.mysql-password}" | base64 -d;echo
MYSQL_PASSWORD=gAV87AooJk

[master]# echo -n "MYSQL_REPLICATION_PASSWORD=";kubectl get secret --namespace mysql-replication mysql -o jsonpath="{.data.mysql-replication-password}" | base64 -d;echo
MYSQL_REPLICATION_PASSWORD=U2pYaNkDO2
#-----------------------------------------
# S3-2. 使用phpmyadmin連接到主服務進行讀寫,驗證Slave節點是否正確可讀
# 從Master節點寫入資料 (直接在phpmyadmin執行SQL指令)
#-----------------------------------------
CREATE TABLE replication (
id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
INDEX name_in (name)
);

INSERT INTO testapp.replication(name) VALUES('Albert')

CREATE DATABASE testdev;
CREATE USER 'testdev'@'%' IDENTIFIED BY 'testdev.Albert.top';
GRANT ALL ON dev.* TO 'testdev'@"%";
FLUSH PRIVILEGES;
raw-image
#-----------------------------------------
# S3-3. 從節點查詢插入的資料 (直接在phpmyadmin執行SQL指令)
#-----------------------------------------
[master]# kubectl run mysql-client --rm --tty -i --restart='Never' --image harbor1.test.example.poc/mysql/mysql:8.0.36-debian-12-r8 --namespace mysql-replication --env MYSQL_ROOT_PASSWORD=FLSDMzpjO3 --command -- bash
(連線到secondary service(read))

1001@mysql-client:/$ mysql -h mysql-secondary -u app -p
mysql> status
mysql> select * from testapp.replication
raw-image
raw-image

4.結論

本篇說明了什麼是MySQL replication,並且在kubernetes平台上實作了master-slave機制,這種做法可以同時利用到這種主從式架構的好處,同時又多一層kubernetes平台原生的機制加值,相信在未來愈來愈多的應用移轉至容器平台,這種架構也可以提供給大家一個部署時的參考。

本次分享就到這邊,我們下期再見~~~

14會員
40Content count
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
發表第一個留言支持創作者!
超健忘閒人的沙龍 的其他內容
本文記錄如何在Kubernetes環境下,部署Standalone架構的MySQL Database,並透過phpmyadmin進行管理。這篇文章將分成MySQL部署在K8S內的優勢、部署MySQL DB standalone、部署PhpMyAdmin (PMA)、結論四個部分進行說明與實作的流程。
本篇文章將教你如何在Kubernetes cluster內部署一個MongoDB,包括取得Manifests、建立Volume、部署實務、基本操作和結論。透過操作演示,讓你瞭解在實務上如何成功建立MongoDB,並進行基本操作。
本文將介紹Gitlab與GitHub的差異,以及在本地環境部署Gitlab的流程與實作。文章內容包括版本管理系統的選擇,Gitlab的基本功能,以及使用Docker進行部署的詳細步驟。
本文介紹了在K8S Cluster出現問題時,透過ETCD的備份來還原Cluster的方法。包括ETCD的資料類型、備份、還原以及相關建議,並提出了自動進行ETCD備份作業和備份存放位置的重要性。
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
本篇將介紹Minio的功能和如何與Harbor進行整合,並說明這樣做的好處。包括Minio的優勢及Harbor x Minio的部署和測試。
本文記錄如何在Kubernetes環境下,部署Standalone架構的MySQL Database,並透過phpmyadmin進行管理。這篇文章將分成MySQL部署在K8S內的優勢、部署MySQL DB standalone、部署PhpMyAdmin (PMA)、結論四個部分進行說明與實作的流程。
本篇文章將教你如何在Kubernetes cluster內部署一個MongoDB,包括取得Manifests、建立Volume、部署實務、基本操作和結論。透過操作演示,讓你瞭解在實務上如何成功建立MongoDB,並進行基本操作。
本文將介紹Gitlab與GitHub的差異,以及在本地環境部署Gitlab的流程與實作。文章內容包括版本管理系統的選擇,Gitlab的基本功能,以及使用Docker進行部署的詳細步驟。
本文介紹了在K8S Cluster出現問題時,透過ETCD的備份來還原Cluster的方法。包括ETCD的資料類型、備份、還原以及相關建議,並提出了自動進行ETCD備份作業和備份存放位置的重要性。
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
本篇將介紹Minio的功能和如何與Harbor進行整合,並說明這樣做的好處。包括Minio的優勢及Harbor x Minio的部署和測試。
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
什麼是幸福?對不同的人來說,答案各不相同。我認為,當一個人實現了自己的價值,才能真正感到幸福。
Thumbnail
汽車貸款 汽車在現代社會已成為人們生活中不可或缺的一部分。然而,隨著汽車價格的不斷攀升,購買一輛新車可能需要耗費相當的資金。為了讓更多人能夠實現購車夢想,汽車貸款成為一個廣受歡迎的選擇。本文將探討汽車貸款的重要性,介紹其基本結構,並闡述信用評分、利率和貸款期限等三個關鍵要點。 購車之路:汽車貸款
Thumbnail
生命本來就是一場旅途,只是過程當中你是否願意挑戰,每個人身上擁有一個創造者的天份,礙於現狀,促使我們受困在這個外在,導致我們無法發揮真正的潛力,所以說當我們把障礙移開,我們就有機會發揮自己的潛能。
Thumbnail
當我們有理想,然而要演變過程為現實當中,不停地在腦海思考,直到「看見」它的結果為止,所以成功者永遠相信自己已經看見後果,只是他們都會更深層探討及分析該怎麼做比較恰當。
Thumbnail
觀察學生學習狀況前,先分享對自己的觀察,關於站上講台的故事。 我從工程師起步,主要職涯是擔任科技業產品經理,但從學生時代,我就一直想站在講台上教書,只是沒有想到,是教程式設計、教AI、教產品思維。 學生對象可以從國小五年級、一路延伸到他們的爸媽,也就是上班族。 這一切是從哪裡開始的呢?
Thumbnail
實現夢想 你必須行動 想要夢想實現,就先要從夢中醒「本金、時間、殖利率」是發揮複利累積財富最重要的因素。 「存錢」是為了走更遠的路、每個人都知道要「 存錢」但不是每個人都真的會「存錢」你必須開始行動、給自己多一些挑戰、願意為自己的未來做更多打算、趁現在年輕的時候、要多買進一些績優的好股票、這會支持
心理學家知道這麼多關於關係是如何工作的,這是可悲的,看到這麼多的人在努力建立和維持他們的生活充滿愛的連接。世界上最重要的關係研究者是約翰·戈特曼(John Gottman),他確定了“使婚姻起作用的七項原則”。戈特曼的研究表明,能夠按照所有七個原則生活的夫婦,在未來五年中,他們的關係將非常幸福的可能
    對你來說,「錢」重要嗎?     對我來說,是養活自己、是滿足慾望、是犒賞自己,也是一種約定。 一個銅板拉住了思念的彼端,現在我的能拉起亦或是放下嗎...?
Thumbnail
一直以來,渴望自由 就像One Piece裡的台詞 『成為海賊王之後不是要統治世界,而是成為這片大海上最自由的人』 要成為最自由的人,意謂著不再依循別人的定義來滿足自己的靈魂, 在工作中找到熱情、生活中找到熱情、在生命中找到熱情。 因此,一直以來, 我希望可以在別人花費時間娛樂自我時讓自己成長; 我
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
什麼是幸福?對不同的人來說,答案各不相同。我認為,當一個人實現了自己的價值,才能真正感到幸福。
Thumbnail
汽車貸款 汽車在現代社會已成為人們生活中不可或缺的一部分。然而,隨著汽車價格的不斷攀升,購買一輛新車可能需要耗費相當的資金。為了讓更多人能夠實現購車夢想,汽車貸款成為一個廣受歡迎的選擇。本文將探討汽車貸款的重要性,介紹其基本結構,並闡述信用評分、利率和貸款期限等三個關鍵要點。 購車之路:汽車貸款
Thumbnail
生命本來就是一場旅途,只是過程當中你是否願意挑戰,每個人身上擁有一個創造者的天份,礙於現狀,促使我們受困在這個外在,導致我們無法發揮真正的潛力,所以說當我們把障礙移開,我們就有機會發揮自己的潛能。
Thumbnail
當我們有理想,然而要演變過程為現實當中,不停地在腦海思考,直到「看見」它的結果為止,所以成功者永遠相信自己已經看見後果,只是他們都會更深層探討及分析該怎麼做比較恰當。
Thumbnail
觀察學生學習狀況前,先分享對自己的觀察,關於站上講台的故事。 我從工程師起步,主要職涯是擔任科技業產品經理,但從學生時代,我就一直想站在講台上教書,只是沒有想到,是教程式設計、教AI、教產品思維。 學生對象可以從國小五年級、一路延伸到他們的爸媽,也就是上班族。 這一切是從哪裡開始的呢?
Thumbnail
實現夢想 你必須行動 想要夢想實現,就先要從夢中醒「本金、時間、殖利率」是發揮複利累積財富最重要的因素。 「存錢」是為了走更遠的路、每個人都知道要「 存錢」但不是每個人都真的會「存錢」你必須開始行動、給自己多一些挑戰、願意為自己的未來做更多打算、趁現在年輕的時候、要多買進一些績優的好股票、這會支持
心理學家知道這麼多關於關係是如何工作的,這是可悲的,看到這麼多的人在努力建立和維持他們的生活充滿愛的連接。世界上最重要的關係研究者是約翰·戈特曼(John Gottman),他確定了“使婚姻起作用的七項原則”。戈特曼的研究表明,能夠按照所有七個原則生活的夫婦,在未來五年中,他們的關係將非常幸福的可能
    對你來說,「錢」重要嗎?     對我來說,是養活自己、是滿足慾望、是犒賞自己,也是一種約定。 一個銅板拉住了思念的彼端,現在我的能拉起亦或是放下嗎...?
Thumbnail
一直以來,渴望自由 就像One Piece裡的台詞 『成為海賊王之後不是要統治世界,而是成為這片大海上最自由的人』 要成為最自由的人,意謂著不再依循別人的定義來滿足自己的靈魂, 在工作中找到熱情、生活中找到熱情、在生命中找到熱情。 因此,一直以來, 我希望可以在別人花費時間娛樂自我時讓自己成長; 我