Kubernetes 中實現 MySQL 的讀寫分離

风轻雪棉發表於2024-11-08

Kubernetes 中實現 MySQL 的讀寫分離

在 Kubernetes 中實現 MySQL 的讀寫分離,可以透過主從複製架構來實現。在這種架構中,MySQL 主節點(Master)負責處理所有寫操作,而 MySQL 從節點(Slave)負責處理所有讀操作。下面是一個詳細的步驟指南:

步驟 1:建立 Kubernetes 叢集

確保你有一個執行良好的 Kubernetes 叢集,建議有3個以上的節點,以便更好地分配資源並實現高可用性。

步驟 2:建立 MySQL 主從複製 Docker 映象

  1. 首先,需要構建一個支援主從複製的 MySQL 映象,或直接使用現有支援主從複製的 MySQL 映象。

  2. 如果要自己配置,可以從 MySQL 官方映象開始,透過設定 my.cnf 檔案來支援主從複製。

  3. 主要的配置如下:

    • 主節點配置(Master):設定 server-id,並啟用二進位制日誌(log-bin)。

    • 從節點配置(Slave):設定不同的 server-id,並配置為從屬節點。

步驟 3:建立 Kubernetes Secret 儲存 MySQL 密碼

為了安全性,我們可以使用 Kubernetes Secret 來儲存 MySQL 密碼。

apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
mysql-root-password: <base64編碼的root密碼>
mysql-replication-user: <base64編碼的replication使用者名稱>
mysql-replication-password: <base64編碼的replication密碼>

步驟 4:部署 MySQL 主節點

  1. 建立主節點的配置檔案 mysql-master-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-master
spec:
replicas: 1
selector:
matchLabels:
app: mysql
role: master
template:
metadata:
labels:
app: mysql
role: master
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
- name: MYSQL_REPLICATION_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-replication-user
- name: MYSQL_REPLICATION_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-replication-password
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
  1. 建立 MySQL 主節點的 Service:

apiVersion: v1
kind: Service
metadata:
name: mysql-master
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
role: master

步驟 5:部署 MySQL 從節點

  1. 建立從節點的配置檔案 mysql-slave-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-slave
spec:
replicas: 2
selector:
matchLabels:
app: mysql
role: slave
template:
metadata:
labels:
app: mysql
role: slave
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
- name: MYSQL_REPLICATION_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-replication-user
- name: MYSQL_REPLICATION_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-replication-password
- name: MYSQL_MASTER_HOST
value: "mysql-master"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
  1. 建立 MySQL 從節點的 Service:

apiVersion: v1
kind: Service
metadata:
name: mysql-slave
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
role: slave

步驟 6:設定主從複製

在從節點啟動後,執行以下命令來配置主從複製:

  1. 登入主節點,建立用於複製的使用者:

    CREATE USER 'replication'@'%' IDENTIFIED BY 'replication_password';
    GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
    FLUSH PRIVILEGES;
  2. 獲取主節點狀態:

    SHOW MASTER STATUS;
  3. 登入到從節點,將其配置為主節點的從屬節點:

    CHANGE MASTER TO
    MASTER_HOST='mysql-master',
    MASTER_USER='replication',
    MASTER_PASSWORD='replication_password',
    MASTER_LOG_FILE='<上一步中獲取的 File>',
    MASTER_LOG_POS=<上一步中獲取的 Position>;
    START SLAVE;
  4. 檢查從節點狀態以確認同步是否成功:

    SHOW SLAVE STATUS\G

步驟 7:配置讀寫分離

在 Kubernetes 中,可以使用一個自定義的 Service 來實現讀寫分離:

  1. 建立 MySQL 讀寫分離的 Service:

    apiVersion: v1
    kind: Service
    metadata:
    name: mysql-read-write
    spec:
    ports:
    - port: 3306
    targetPort: 3306
    selector:
    app: mysql
    role: master
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: mysql-read-only
    spec:
    ports:
    - port: 3306
    targetPort: 3306
    selector:
    app: mysql
    role: slave
  2. 透過應用層(例如應用程式碼)選擇訪問不同的 Service 來實現讀寫分離:

    • 寫操作:透過 mysql-read-write Service 連線。

    • 讀操作:透過 mysql-read-only Service 連線。

步驟 8:測試讀寫分離

  1. 將寫操作請求傳送到 mysql-read-write 服務,驗證資料是否被正確寫入。

  2. 將讀操作請求傳送到 mysql-read-only 服務,確保從節點上能夠讀到主節點寫入的資料。

步驟 9:監控與維護

可以透過 Prometheus 和 Grafana 對 MySQL 叢集進行監控,關注主從複製的延遲和節點的健康狀態,以便及時處理故障。

總結

主節點負責處理寫操作,從節點負責處理讀操作,應用可以根據需求連線到不同的 Service 來實現高效的資料庫讀寫分離。

相關文章