最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

k8s中實現(xiàn)mysql主備過程詳解

 更新時間:2025年09月28日 11:06:58   作者:努努&威朗普  
文章講解了在K8s中使用StatefulSet部署MySQL主備架構(gòu),包含NFS安裝、storageClass配置、MySQL部署及同步檢查步驟,確保主備數(shù)據(jù)一致性與高可用性

一、k8s中實現(xiàn)mysql主備

1.1 環(huán)境信息

機器操作系統(tǒng)ipmysql版本k8s版本storageClass
master1CentOS7.8192.168.0.20mysql5.7.421.27.1nfs
node1CentOS7.8192.168.0.21mysql5.7.421.27.1nfs

1.2 部署nfs-provisioner

說明:

使用statefulSet部署雙機MySQL,所以需要提供storageClass,這里使用nfs-provisioner。

1.2.1 安裝nfs

這里nfs安裝在node1節(jié)點上
mkdir /mnt/nfs && sh nfs_install.sh /mnt/nfs 192.168.0.0/24

  • nfs_install.sh
#!/bin/bash

### How to install it? ###
### 安裝nfs-server,需要兩個參數(shù):1、掛載點  2、允許訪問nfs-server的網(wǎng)段 ###

### How to use it? ###
### Client節(jié)點`yum -y install nfs-utils rpcbind`,然后掛載nfs-server目錄到本地 ###
### 如:echo "192.168.0.20:/mnt/data01  /mnt/data01  nfs  defaults  0 0" >> /etc/fstab && mount -a ###

mount_point=$1
subnet=$2

function nfs_server() {
  systemctl stop firewalld
  systemctl disable firewalld
  setenforce 0
  sed -i 's/^SELINUX.*/SELINUX\=disabled/' /etc/selinux/config
  yum -y install nfs-utils rpcbind
  mkdir -p $mount_point
  echo "$mount_point ${subnet}(rw,sync,no_root_squash)" >> /etc/exports
  systemctl start rpcbind && systemctl enable rpcbind
  systemctl restart nfs-server && systemctl enable nfs-server
  chown -R nfsnobody:nfsnobody $mount_point
}

function usage() {
echo "Require 2 argument: [mount_point] [subnet]
eg: sh $0 /mnt/data01 192.168.10.0/24"
}

declare -i arg_nums
arg_nums=$#
if [ $arg_nums -eq 2 ];then
  nfs_server
else
  usage
  exit 1
fi

1.2.2 部署nfs-provisioner

master1節(jié)點上執(zhí)行 kubectl create namespace devops && kubectl apply -f nfs-provisioner.yaml

  • nfs-provisioner.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
  namespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-provisioner-runner
rules:
- apiGroups: [""]
  resources: ["persistentvolumes"]
  verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
  resources: ["persistentvolumeclaims"]
  verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["create", "update", "patch"]
- apiGroups: [""]
  resources: ["services", "endpoints"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: run-nfs-provisioner
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nfs-provisioner-runner
subjects:
- kind: ServiceAccount
  name: nfs-provisioner
  namespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: leader-locking-nfs-provisioner
  namespace: devops
rules:
- apiGroups: [""]
  resources: ["endpoints"]
  verbs: ["get", "list", "watch", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: leader-locking-nfs-provisioner
  namespace: devops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: leader-locking-nfs-provisioner
subjects:
- kind: ServiceAccount
  name: nfs-provisioner
  namespace: devops
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-provisioner
  namespace: devops
spec:
  selector:
    matchLabels:
       app: nfs-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccountName: nfs-provisioner
      containers:
        - name: nfs-provisioner
          image: docker.io/gmoney23/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 192.168.0.21
            - name: NFS_PATH
              value: /mnt/nfs
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.0.21
            path: /mnt/nfs
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: nfs
provisioner: example.com/nfs
#reclaimPolicy: Retain

1.3 安裝mysql

kubectl apply -f deploy.yaml

  • deploy.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: mysql
  labels:
    app: mysql

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
data:
  master.cnf: |
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    max_connections=2000
    default-time_zone='+8:00'
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    innodb_buffer_pool_size=536870912
    datadir=/var/lib/mysql
    pid-file=/var/run/mysqld/mysqld.pid
    log-error=/var/lib/mysql/error.log
    log-bin=mysqllog
    skip-name-resolve
    lower-case-table-names=1
    log_bin_trust_function_creators=1
  slave.cnf: |
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    max_connections=2000
    default-time_zone='+8:00'
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    innodb_buffer_pool_size=536870912
    datadir=/var/lib/mysql
    pid-file=/var/run/mysqld/mysqld.pid
    log-error=/var/lib/mysql/error.log
    super-read-only
    skip-name-resolve
    log-bin=mysql-bin
    lower-case-table-names=1
    log_bin_trust_function_creators=1

---
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
  namespace: mysql
  labels:
    app: mysql
type: Opaque
data:
  password: TnNiZzExMTEqQCE= # Nsbg1111*@!
  replicationUser: Y29weQ== #copy
  replicationPassword: TnNiZzExMTEqQCE= #Nsbg1111*@!

---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
spec:
  selector:
    app: mysql
  clusterIP: None
  ports:
  - name: mysql
    port: 3306

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: mysql
  replicas: 2
  template:
    metadata:
      labels:
        app: mysql
    spec:
      initContainers:
      - name: init-mysql
        image: docker.io/library/mysql:5.7.42
        command: 
        - bash
        - "-c"
        - |
          set -ex
          #從pod的hostname中通過正則獲取序號,如果沒有截取到就退出程序
          ordinal=`cat /etc/hostname | awk -F"-" '{print $2}'` || exit 1
          #將serverId輸入到對應的配置文件中,路徑可以隨意(與之后的對應上就行),但是文件名不能換
          echo [mysqld] > /etc/mysql/conf.d/server-id.cnf
          # 由于server-id不能為0,因此給ID加100來避開它
          server_id=$((100 + $ordinal))
          echo "server-id=$server_id" >> /etc/mysql/conf.d/server-id.cnf
          if [[ ${ordinal} -eq 0 ]]; then
            # 如果Pod的序號為0,說明它是Master節(jié)點,從ConfigMap里把Master的配置文件拷貝到/mnt/conf.d目錄下
            cp /mnt/config-map/master.cnf /etc/mysql/conf.d
          else
            # 否則,拷貝ConfigMap里的Slave的配置文件
            cp /mnt/config-map/slave.cnf /etc/mysql/conf.d
          fi
          echo "ending..."
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        - name: MYSQL_REPLICATION_USER
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: replicationUser
        - name: MYSQL_REPLICATION_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: replicationPassword
        volumeMounts:
        - name: conf
          mountPath: /etc/mysql/conf.d
        - name: config-map
          mountPath: /mnt/config-map
      containers:
      - name: mysql
        image: docker.io/library/mysql:5.7.42
        lifecycle:
         postStart:
          exec:
            command:
            - bash
            - "-c"
            - |
              set -ex
              cd /var/lib/mysql
              #查看是否存在名為mysqlInitOk的文件,我們自己生產(chǎn)的標識文件,防止重復初始化集群
              if [ ! -f mysqlInitOk ]; then
                echo "Waiting for mysqld to be ready(accepting connections)"
                #執(zhí)行一條mysql的命令,查看mysql是否初始化完畢,如果沒有就反復執(zhí)行直到可以運行
                  #until mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "use mysql;SELECT 1;"; do sleep 1; done
                  sleep 5s
                  echo "Initialize ready"
                  #判斷是master還是slave
                  pod_seq=`cat /etc/hostname | awk -F"-" '{print $2}'`
                  if [ $pod_seq -eq 0 ];then
                    #創(chuàng)建主從賬戶
                  mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "create user '${MYSQL_REPLICATION_USER}'@'%' identified by '${MYSQL_REPLICATION_PASSWORD}';"
                  #設置權(quán)限
                  mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "grant replication slave on *.* to '${MYSQL_REPLICATION_USER}'@'%' with grant option;"
                  #刷新配置
                  mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "flush privileges;"
                  #初始化master
                  mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "reset master;"
                else
                  #設置slave連接的master
                  #mysql-0.mysql.mysql的由來{pod-name}.{service-name}.{namespace}
                  mysql -e \
                  "change master to master_host='mysql-0.mysql.mysql',master_port=3306, \
                  master_user='${MYSQL_REPLICATION_USER}',master_password='${MYSQL_REPLICATION_PASSWORD}', \
                  master_log_file='mysqllog.000001',master_log_pos=154;"
                  #重置slave
                  mysql -e "reset slave;"
                  #開始同步
                  mysql -e "start slave;"
                  #改成只讀模式
                  mysql -e "set global read_only=1;"
                fi
                #運行完畢創(chuàng)建標識文件,防止重復初始化集群
                touch mysqlInitOk
              fi
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        - name: MYSQL_REPLICATION_USER
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: replicationUser
        - name: MYSQL_REPLICATION_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: replicationPassword
        ports:
        - name: mysql
          containerPort: 3306
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
        - name: conf
          mountPath: /etc/mysql/conf.d
        - name: run-mysql
          mountPath: /var/run/mysql
        resources:
          requests:
            cpu: 500m
            memory: 2Gi
        #設置存活探針
        livenessProbe:
          exec:
            command: ["mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
        #設置就緒探針
        readinessProbe:
          exec:
            command: ["mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
          initialDelaySeconds: 5
          periodSeconds: 10
          timeoutSeconds: 1
      volumes:
      - name: config-map
        configMap:
          name: mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: nfs
      resources:
        requests:
          storage: 5Gi
  - metadata: 
      name: conf
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: nfs
      resources:
        requests:
          storage: 100Mi
  - metadata: 
      name: run-mysql
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: nfs
      resources:
        requests:
          storage: 100Mi

1.4 備庫上查看是否同步

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Kubernetes控制器中DaemonSet與Job的使用教程

    Kubernetes控制器中DaemonSet與Job的使用教程

    這篇文章主要介紹了Kubernetes控制器中DaemonSet與Job的使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • k8s中topologyKey的作用及說明

    k8s中topologyKey的作用及說明

    topologyKey定義拓撲域,用于Pod親和/反親和性規(guī)則,調(diào)度器根據(jù)其分組節(jié)點,當前配置僅強制節(jié)點標簽匹配,未限制副本數(shù)量,建議補充podAntiAffinity實現(xiàn)隔離
    2025-08-08
  • Kubernetes應用配置管理創(chuàng)建使用詳解

    Kubernetes應用配置管理創(chuàng)建使用詳解

    這篇文章主要為大家介紹了Kubernetes應用配置管理創(chuàng)建使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • kubernetes(k8s)中Yaml文件詳解

    kubernetes(k8s)中Yaml文件詳解

    這篇文章主要給大家介紹了關(guān)于kubernetes(k8s)中Yaml文件詳解的相關(guān)資料,YAML是專門用來寫配置文件的語言,非常簡潔和強大,使用比json更方便,需要的朋友可以參考下
    2023-12-12
  • Kubernetes集群中Calico網(wǎng)絡插件報錯問題分析及解決過程

    Kubernetes集群中Calico網(wǎng)絡插件報錯問題分析及解決過程

    Kubernetes集群中Calico網(wǎng)絡插件報錯(如FailedCreatePodSandBox)通常由配置錯誤、RBAC權(quán)限缺失或組件故障導致,解決方法包括重啟Calico組件、驗證配置和權(quán)限,定期監(jiān)控與維護以確保網(wǎng)絡正常運行
    2025-10-10
  • Kubernetes核心組件實戰(zhàn)解析之API?Server與Scheduler的生產(chǎn)級應用指南

    Kubernetes核心組件實戰(zhàn)解析之API?Server與Scheduler的生產(chǎn)級應用指南

    在Kubernetes集群中,kube-apiserver和kube-scheduler如同機場的塔臺控制系統(tǒng),一個負責全局通信調(diào)度,一個專注資源分配優(yōu)化,本文將深入解析這兩個核心組件在生產(chǎn)環(huán)境中的關(guān)鍵作用與實戰(zhàn)配置,需要的朋友可以參考下
    2025-03-03
  • Kubernetes?Ingress實現(xiàn)細粒度IP訪問控制

    Kubernetes?Ingress實現(xiàn)細粒度IP訪問控制

    這篇文章主要為大家介紹了Kubernetes?Ingress實現(xiàn)細粒度IP訪問控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Ubuntu22.04的Kubernetes環(huán)境中加載橋接網(wǎng)絡模塊方式

    Ubuntu22.04的Kubernetes環(huán)境中加載橋接網(wǎng)絡模塊方式

    在Ubuntu 22.04的Kubernetes環(huán)境中,解決sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables錯誤的步驟包括加載br_netfilter模塊、持久化配置、設置sysctl參數(shù)以及驗證配置,同時,確保Kubernetes組件和CNI插件依賴這些參數(shù),防火墻配置也要同步
    2026-01-01
  • K8s Pod容器中的command和args指令詳解

    K8s Pod容器中的command和args指令詳解

    這篇文章主要介紹了K8s新手系列之Pod容器中的command和args指令的相關(guān)資料,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-05-05
  • K8S?prometheus?operator監(jiān)控工作原理介紹

    K8S?prometheus?operator監(jiān)控工作原理介紹

    這篇文章主要為大家介紹了K8S?prometheus?operator監(jiān)控工作原理介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

庄浪县| 枣阳市| 精河县| 巨鹿县| 泽州县| 鄱阳县| 宕昌县| 报价| 沅江市| 财经| 台前县| 瓮安县| 商洛市| 巴林左旗| 邻水| 彭阳县| 大连市| 卢龙县| 海兴县| 新乐市| 文成县| 云和县| 德清县| 夏河县| 辽宁省| 周至县| 格尔木市| 朝阳区| 南漳县| 密云县| 隆昌县| 曲阜市| 金山区| 道真| 墨竹工卡县| 汉川市| 伊宁市| 响水县| 仪陇县| 岗巴县| 亳州市|