k8s实战案例之基于StatefulSet控制器运行MySQL一主多从

打印 上一主题 下一主题

主题 917|帖子 917|积分 2753

1、前言

Pod调度运⾏时,如果应⽤不需要任何稳定的标示、有序的部署、删除和扩展,则应该使⽤⼀组⽆状态副本的控制器来部署应⽤,例如 Deployment 或 ReplicaSet更适合⽆状态服务需求,⽽StatefulSet适合管理所有有状态的服务,⽐如MySQL、MongoDB集群等。
2、StatefulSet控制器运行MySQL一主多从架构图


StatefulSet本质上是Deployment的⼀种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为⽹络标识(hostname),还必须要⽤到共享存储。
在Deployment中,与之对应的服务是service,⽽在StatefulSet中与之对应的headless service,headless service,即⽆头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。
2.1、StatefulSet控制器特点


  • 给每个pod分配固定且唯⼀的⽹络标识符
  • 给每个pod分配固定且持久化的外部存储
  • 对pod进⾏有序的部署和扩展
  • 对pod进有序的删除和终⽌
  • 对pod进有序的⾃动滚动更新
2.2、StatefulSet的组成部分


  • Headless Service:⽤来定义Pod⽹络标识( DNS domain),指的是短的service(丢失了domainname)。
  • StatefulSet:定义具体应⽤,有多少个Pod副本,并为每个Pod定义了⼀个域名。
  • volumeClaimTemplates: 存储卷申请模板,创建PVC,指定pvc名称⼤⼩,将⾃动创建pvc,且pvc必须由存储类供应。
3、在k8s上部署mysql一主多从

3.1、基础镜像准备

3.1.1、准备mysql镜像

下载镜像
  1. root@k8s-master01:~# nerdctl pull mysql:5.7.36
复制代码
修改镜像tag为本地harbor地址
  1. root@k8s-master01:~# nerdctl tag mysql:5.7.36 harbor.ik8s.cc/magedu/mysql:5.7.36
复制代码
上传镜像至本地harbor
  1. root@k8s-master01:~# nerdctl push harbor.ik8s.cc/magedu/mysql:5.7.36
复制代码
3.1.2、准备xtrabackup镜像

下载镜像
  1. root@k8s-master01:~# nerdctl pull registry.cn-hangzhou.aliyuncs.com/hxpdocker/xtrabackup:1.0
复制代码
修改镜像tag为本地harbor地址
  1. root@k8s-master01:~# nerdctl tag registry.cn-hangzhou.aliyuncs.com/hxpdocker/xtrabackup:1.0 harbor.ik8s.cc/magedu/xtrabackup:1.0
复制代码
上传镜像至本地harbor
  1. root@k8s-master01:~# nerdctl push harbor.ik8s.cc/magedu/xtrabackup:1.0
复制代码
3.1.3、验证镜像是否上传至harbor?


3.2、准备pv

3.2.1、在nfs服务器上创建数据存储目录
  1. root@harbor:~# mkdir -pv /data/k8sdata/magedu/mysql-datadir-{1..5}
  2. mkdir: created directory '/data/k8sdata/magedu/mysql-datadir-1'
  3. mkdir: created directory '/data/k8sdata/magedu/mysql-datadir-2'
  4. mkdir: created directory '/data/k8sdata/magedu/mysql-datadir-3'
  5. mkdir: created directory '/data/k8sdata/magedu/mysql-datadir-4'
  6. mkdir: created directory '/data/k8sdata/magedu/mysql-datadir-5'
  7. root@harbor:~#
复制代码
3.2.2、在nfs服务器上导出数据存储目录
  1. root@harbor:/data/k8sdata/magedu# cat /etc/exports
  2. # /etc/exports: the access control list for filesystems which may be exported
  3. #               to NFS clients.  See exports(5).
  4. #
  5. # Example for NFSv2 and NFSv3:
  6. # /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
  7. #
  8. # Example for NFSv4:
  9. # /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
  10. # /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
  11. #
  12. /data/k8sdata/kuboard *(rw,no_root_squash)
  13. /data/volumes *(rw,no_root_squash)
  14. /pod-vol *(rw,no_root_squash)
  15. /data/k8sdata/myserver *(rw,no_root_squash)
  16. /data/k8sdata/mysite *(rw,no_root_squash)
  17. /data/k8sdata/magedu/images *(rw,no_root_squash)
  18. /data/k8sdata/magedu/static *(rw,no_root_squash)
  19. /data/k8sdata/magedu/zookeeper-datadir-1 *(rw,no_root_squash)
  20. /data/k8sdata/magedu/zookeeper-datadir-2 *(rw,no_root_squash)
  21. /data/k8sdata/magedu/zookeeper-datadir-3 *(rw,no_root_squash)
  22. /data/k8sdata/magedu/redis-datadir-1 *(rw,no_root_squash)
  23. /data/k8sdata/magedu/redis0 *(rw,no_root_squash)
  24. /data/k8sdata/magedu/redis1 *(rw,no_root_squash)
  25. /data/k8sdata/magedu/redis2 *(rw,no_root_squash)
  26. /data/k8sdata/magedu/redis3 *(rw,no_root_squash)
  27. /data/k8sdata/magedu/redis4 *(rw,no_root_squash)
  28. /data/k8sdata/magedu/redis5 *(rw,no_root_squash)
  29. /data/k8sdata/magedu/mysql-datadir-1 *(rw,no_root_squash)
  30. /data/k8sdata/magedu/mysql-datadir-2 *(rw,no_root_squash)
  31. /data/k8sdata/magedu/mysql-datadir-3 *(rw,no_root_squash)
  32. /data/k8sdata/magedu/mysql-datadir-4 *(rw,no_root_squash)
  33. /data/k8sdata/magedu/mysql-datadir-5 *(rw,no_root_squash)
  34. root@harbor:/data/k8sdata/magedu# exportfs -av
  35. exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/kuboard".
  36.   Assuming default behaviour ('no_subtree_check').
  37.   NOTE: this default has changed since nfs-utils version 1.0.x
  38. exportfs: /etc/exports [2]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/volumes".
  39.   Assuming default behaviour ('no_subtree_check').
  40.   NOTE: this default has changed since nfs-utils version 1.0.x
  41. exportfs: /etc/exports [3]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/pod-vol".
  42.   Assuming default behaviour ('no_subtree_check').
  43.   NOTE: this default has changed since nfs-utils version 1.0.x
  44. exportfs: /etc/exports [4]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/myserver".
  45.   Assuming default behaviour ('no_subtree_check').
  46.   NOTE: this default has changed since nfs-utils version 1.0.x
  47. exportfs: /etc/exports [5]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/mysite".
  48.   Assuming default behaviour ('no_subtree_check').
  49.   NOTE: this default has changed since nfs-utils version 1.0.x
  50. exportfs: /etc/exports [7]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/images".
  51.   Assuming default behaviour ('no_subtree_check').
  52.   NOTE: this default has changed since nfs-utils version 1.0.x
  53. exportfs: /etc/exports [8]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/static".
  54.   Assuming default behaviour ('no_subtree_check').
  55.   NOTE: this default has changed since nfs-utils version 1.0.x
  56. exportfs: /etc/exports [11]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/zookeeper-datadir-1".
  57.   Assuming default behaviour ('no_subtree_check').
  58.   NOTE: this default has changed since nfs-utils version 1.0.x
  59. exportfs: /etc/exports [12]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/zookeeper-datadir-2".
  60.   Assuming default behaviour ('no_subtree_check').
  61.   NOTE: this default has changed since nfs-utils version 1.0.x
  62. exportfs: /etc/exports [13]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/zookeeper-datadir-3".
  63.   Assuming default behaviour ('no_subtree_check').
  64.   NOTE: this default has changed since nfs-utils version 1.0.x
  65. exportfs: /etc/exports [16]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/redis-datadir-1".
  66.   Assuming default behaviour ('no_subtree_check').
  67.   NOTE: this default has changed since nfs-utils version 1.0.x
  68. exportfs: /etc/exports [18]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/redis0".
  69.   Assuming default behaviour ('no_subtree_check').
  70.   NOTE: this default has changed since nfs-utils version 1.0.x
  71. exportfs: /etc/exports [19]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/redis1".
  72.   Assuming default behaviour ('no_subtree_check').
  73.   NOTE: this default has changed since nfs-utils version 1.0.x
  74. exportfs: /etc/exports [20]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/redis2".
  75.   Assuming default behaviour ('no_subtree_check').
  76.   NOTE: this default has changed since nfs-utils version 1.0.x
  77. exportfs: /etc/exports [21]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/redis3".
  78.   Assuming default behaviour ('no_subtree_check').
  79.   NOTE: this default has changed since nfs-utils version 1.0.x
  80. exportfs: /etc/exports [22]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/redis4".
  81.   Assuming default behaviour ('no_subtree_check').
  82.   NOTE: this default has changed since nfs-utils version 1.0.x
  83. exportfs: /etc/exports [23]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/redis5".
  84.   Assuming default behaviour ('no_subtree_check').
  85.   NOTE: this default has changed since nfs-utils version 1.0.x
  86. exportfs: /etc/exports [27]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/mysql-datadir-1".
  87.   Assuming default behaviour ('no_subtree_check').
  88.   NOTE: this default has changed since nfs-utils version 1.0.x
  89. exportfs: /etc/exports [28]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/mysql-datadir-2".
  90.   Assuming default behaviour ('no_subtree_check').
  91.   NOTE: this default has changed since nfs-utils version 1.0.x
  92. exportfs: /etc/exports [29]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/mysql-datadir-3".
  93.   Assuming default behaviour ('no_subtree_check').
  94.   NOTE: this default has changed since nfs-utils version 1.0.x
  95. exportfs: /etc/exports [30]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/mysql-datadir-4".
  96.   Assuming default behaviour ('no_subtree_check').
  97.   NOTE: this default has changed since nfs-utils version 1.0.x
  98. exportfs: /etc/exports [31]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/k8sdata/magedu/mysql-datadir-5".
  99.   Assuming default behaviour ('no_subtree_check').
  100.   NOTE: this default has changed since nfs-utils version 1.0.x
  101. exporting *:/data/k8sdata/magedu/mysql-datadir-5
  102. exporting *:/data/k8sdata/magedu/mysql-datadir-4
  103. exporting *:/data/k8sdata/magedu/mysql-datadir-3
  104. exporting *:/data/k8sdata/magedu/mysql-datadir-2
  105. exporting *:/data/k8sdata/magedu/mysql-datadir-1
  106. exporting *:/data/k8sdata/magedu/redis5
  107. exporting *:/data/k8sdata/magedu/redis4
  108. exporting *:/data/k8sdata/magedu/redis3
  109. exporting *:/data/k8sdata/magedu/redis2
  110. exporting *:/data/k8sdata/magedu/redis1
  111. exporting *:/data/k8sdata/magedu/redis0
  112. exporting *:/data/k8sdata/magedu/redis-datadir-1
  113. exporting *:/data/k8sdata/magedu/zookeeper-datadir-3
  114. exporting *:/data/k8sdata/magedu/zookeeper-datadir-2
  115. exporting *:/data/k8sdata/magedu/zookeeper-datadir-1
  116. exporting *:/data/k8sdata/magedu/static
  117. exporting *:/data/k8sdata/magedu/images
  118. exporting *:/data/k8sdata/mysite
  119. exporting *:/data/k8sdata/myserver
  120. exporting *:/pod-vol
  121. exporting *:/data/volumes
  122. exporting *:/data/k8sdata/kuboard
  123. root@harbor:/data/k8sdata/magedu#
复制代码
3.2.2、创建pv

创建pv配置清单
  1. ---
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: mysql-datadir-1
  6.   namespace: magedu
  7. spec:
  8.   capacity:
  9.     storage: 50Gi
  10.   accessModes:
  11.     - ReadWriteOnce
  12.   nfs:
  13.     path: /data/k8sdata/magedu/mysql-datadir-1
  14.     server: 192.168.0.42
  15. ---
  16. apiVersion: v1
  17. kind: PersistentVolume
  18. metadata:
  19.   name: mysql-datadir-2
  20.   namespace: magedu
  21. spec:
  22.   capacity:
  23.     storage: 50Gi
  24.   accessModes:
  25.     - ReadWriteOnce
  26.   nfs:
  27.     path: /data/k8sdata/magedu/mysql-datadir-2
  28.     server: 192.168.0.42
  29. ---
  30. apiVersion: v1
  31. kind: PersistentVolume
  32. metadata:
  33.   name: mysql-datadir-3
  34.   namespace: magedu
  35. spec:
  36.   capacity:
  37.     storage: 50Gi
  38.   accessModes:
  39.     - ReadWriteOnce
  40.   nfs:
  41.     path: /data/k8sdata/magedu/mysql-datadir-3
  42.     server: 192.168.0.42
  43. ---
  44. apiVersion: v1
  45. kind: PersistentVolume
  46. metadata:
  47.   name: mysql-datadir-4
  48.   namespace: magedu
  49. spec:
  50.   capacity:
  51.     storage: 50Gi
  52.   accessModes:
  53.     - ReadWriteOnce
  54.   nfs:
  55.     path: /data/k8sdata/magedu/mysql-datadir-4
  56.     server: 192.168.0.42
  57. ---
  58. apiVersion: v1
  59. kind: PersistentVolume
  60. metadata:
  61.   name: mysql-datadir-5
  62.   namespace: magedu
  63. spec:
  64.   capacity:
  65.     storage: 50Gi
  66.   accessModes:
  67.     - ReadWriteOnce
  68.   nfs:
  69.     path: /data/k8sdata/magedu/mysql-datadir-5
  70.     server: 192.168.0.42
复制代码
创建pv
  1. root@k8s-master01:~/k8s-data/yaml/magedu/mysql# kubectl apply -f pv/mysql-persistentvolume.yaml
  2. persistentvolume/mysql-datadir-1 created
  3. persistentvolume/mysql-datadir-2 created
  4. persistentvolume/mysql-datadir-3 created
  5. persistentvolume/mysql-datadir-4 created
  6. persistentvolume/mysql-datadir-5 created
  7. root@k8s-master01:~/k8s-data/yaml/magedu/mysql#
复制代码
3.2.3、验证pv
  1. root@k8s-master01:~/k8s-data/yaml/magedu/mysql# kubectl get pv
  2. NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                            STORAGECLASS   REASON   AGE
  3. mysql-datadir-1          50Gi       RWO            Retain           Available                                                            5s
  4. mysql-datadir-2          50Gi       RWO            Retain           Available                                                            5s
  5. mysql-datadir-3          50Gi       RWO            Retain           Available                                                            5s
  6. mysql-datadir-4          50Gi       RWO            Retain           Available                                                            5s
  7. mysql-datadir-5          50Gi       RWO            Retain           Available                                                            5s
  8. redis-cluster-pv0        5Gi        RWO            Retain           Bound       magedu/data-redis-1                                      8d
  9. redis-cluster-pv1        5Gi        RWO            Retain           Bound       magedu/data-redis-3                                      8d
  10. redis-cluster-pv2        5Gi        RWO            Retain           Bound       magedu/data-redis-4                                      8d
  11. redis-cluster-pv3        5Gi        RWO            Retain           Bound       magedu/data-redis-0                                      8d
  12. redis-cluster-pv4        5Gi        RWO            Retain           Bound       magedu/data-redis-5                                      8d
  13. redis-cluster-pv5        5Gi        RWO            Retain           Bound       magedu/data-redis-2                                      8d
  14. redis-datadir-pv-1       10Gi       RWO            Retain           Bound       magedu/redis-datadir-pvc-1                               9d
  15. zookeeper-datadir-pv-1   20Gi       RWO            Retain           Bound       magedu/zookeeper-datadir-pvc-1                           10d
  16. zookeeper-datadir-pv-2   20Gi       RWO            Retain           Bound       magedu/zookeeper-datadir-pvc-2                           10d
  17. zookeeper-datadir-pv-3   20Gi       RWO            Retain           Bound       magedu/zookeeper-datadir-pvc-3                           10d
  18. root@k8s-master01:~/k8s-data/yaml/magedu/mysql#
复制代码
3.3、运行mysql服务

MYSQL CONFIGMAP配置清单
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: mysql
  5.   namespace: magedu
  6.   labels:
  7.     app: mysql
  8. data:
  9.   master.cnf: |
  10.     # Apply this config only on the master.
  11.     [mysqld]
  12.     log-bin
  13.     log_bin_trust_function_creators=1
  14.     lower_case_table_names=1
  15.   slave.cnf: |
  16.     # Apply this config only on slaves.
  17.     [mysqld]
  18.     super-read-only
  19.     log_bin_trust_function_creators=1
复制代码
MYSQL POD配置清单
  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4.   name: mysql
  5.   namespace: magedu
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       app: mysql
  10.   serviceName: mysql
  11.   replicas: 2
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: mysql
  16.     spec:
  17.       initContainers:
  18.       - name: init-mysql #初始化容器1、基于当前pod name匹配角色是master还是slave,并动态生成相对应的配置文件
  19.         image: harbor.ik8s.cc/magedu/mysql:5.7.36
  20.         command:
  21.         - bash
  22.         - "-c"
  23.         - |
  24.           set -ex
  25.           # Generate mysql server-id from pod ordinal index.
  26.           [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 #匹配hostname的最后一位、最后是一个顺序叠加的整数
  27.           ordinal=${BASH_REMATCH[1]}
  28.           echo [mysqld] > /mnt/conf.d/server-id.cnf
  29.           # Add an offset to avoid reserved server-id=0 value.
  30.           echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
  31.           # Copy appropriate conf.d files from config-map to emptyDir.
  32.           if [[ $ordinal -eq 0 ]]; then #如果是master、则cpmaster配置文件
  33.             cp /mnt/config-map/master.cnf /mnt/conf.d/
  34.           else #否则cp slave配置文件
  35.             cp /mnt/config-map/slave.cnf /mnt/conf.d/
  36.           fi
  37.         volumeMounts:
  38.         - name: conf #临时卷、emptyDir
  39.           mountPath: /mnt/conf.d
  40.         - name: config-map
  41.           mountPath: /mnt/config-map
  42.       - name: clone-mysql #初始化容器2、用于生成mysql配置文件、并从上一个pod完成首次的全量数据clone(slave 3从slave2 clone,而不是每个slave都从master clone实现首次全量同步,但是后期都是与master实现增量同步)
  43.         image: harbor.ik8s.cc/magedu/xtrabackup:1.0
  44.         command:
  45.         - bash
  46.         - "-c"
  47.         - |
  48.           set -ex
  49.           # Skip the clone if data already exists.
  50.           [[ -d /var/lib/mysql/mysql ]] && exit 0
  51.           # Skip the clone on master (ordinal index 0).
  52.           [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
  53.           ordinal=${BASH_REMATCH[1]}
  54.           [[ $ordinal -eq 0 ]] && exit 0 #如果最后一位是0(master)则退出clone过程
  55.           # Clone data from previous peer.
  56.           ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql #从上一个pod执行clone(binlog),xbstream为解压缩命令
  57.           # Prepare the backup.xue
  58.           xtrabackup --prepare --target-dir=/var/lib/mysql #通过xtrabackup恢复binlog
  59.         volumeMounts:
  60.         - name: data
  61.           mountPath: /var/lib/mysql
  62.           subPath: mysql
  63.         - name: conf
  64.           mountPath: /etc/mysql/conf.d
  65.       containers:
  66.       - name: mysql #业务容器1(mysql主容器)
  67.         image: harbor.ik8s.cc/magedu/mysql:5.7.36
  68.         env:
  69.         - name: MYSQL_ALLOW_EMPTY_PASSWORD
  70.           value: "1"
  71.         ports:
  72.         - name: mysql
  73.           containerPort: 3306
  74.         volumeMounts:
  75.         - name: data #挂载数据目录至/var/lib/mysql
  76.           mountPath: /var/lib/mysql
  77.           subPath: mysql
  78.         - name: conf #配置文件/etc/mysql/conf.d
  79.           mountPath: /etc/mysql/conf.d
  80.         resources: #资源限制
  81.           requests:
  82.             cpu: 500m
  83.             memory: 1Gi
  84.         livenessProbe: #存活探针
  85.           exec:
  86.             command: ["mysqladmin", "ping"]
  87.           initialDelaySeconds: 30
  88.           periodSeconds: 10
  89.           timeoutSeconds: 5
  90.         readinessProbe: #就绪探针
  91.           exec:
  92.             # Check we can execute queries over TCP (skip-networking is off).
  93.             command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]
  94.           initialDelaySeconds: 5
  95.           periodSeconds: 2
  96.           timeoutSeconds: 1
  97.       - name: xtrabackup #业务容器2(xtrabackup),用于后期同步master 的binglog并恢复数据
  98.         image: harbor.ik8s.cc/magedu/xtrabackup:1.0
  99.         ports:
  100.         - name: xtrabackup
  101.           containerPort: 3307
  102.         command:
  103.         - bash
  104.         - "-c"
  105.         - |
  106.           set -ex
  107.           cd /var/lib/mysql
  108.           # Determine binlog position of cloned data, if any.
  109.           if [[ -f xtrabackup_slave_info ]]; then
  110.             # XtraBackup already generated a partial "CHANGE MASTER TO" query
  111.             # because we're cloning from an existing slave.
  112.             mv xtrabackup_slave_info change_master_to.sql.in
  113.             # Ignore xtrabackup_binlog_info in this case (it's useless).
  114.             rm -f xtrabackup_binlog_info
  115.           elif [[ -f xtrabackup_binlog_info ]]; then
  116.             # We're cloning directly from master. Parse binlog position.
  117.             [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
  118.             rm xtrabackup_binlog_info
  119.             echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\
  120.                   MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in #生成CHANGE MASTER命令
  121.           fi
  122.           # Check if we need to complete a clone by starting replication.
  123.           if [[ -f change_master_to.sql.in ]]; then
  124.             echo "Waiting for mysqld to be ready (accepting connections)"
  125.             until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done
  126.             echo "Initializing replication from clone position"
  127.             # In case of container restart, attempt this at-most-once.
  128.             mv change_master_to.sql.in change_master_to.sql.orig
  129.             #执行CHANGE MASTER操作并启动SLAVE
  130.             mysql -h 127.0.0.1 <<EOF
  131.           $(<change_master_to.sql.orig),
  132.             MASTER_HOST='mysql-0.mysql',
  133.             MASTER_USER='root',
  134.             MASTER_PASSWORD='',
  135.             MASTER_CONNECT_RETRY=10;
  136.           START SLAVE;
  137.           EOF
  138.           fi
  139.           # Start a server to send backups when requested by peers. #监听在3307端口,用于为下一个pod同步全量数据
  140.           exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
  141.             "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"
  142.         volumeMounts:
  143.         - name: data
  144.           mountPath: /var/lib/mysql
  145.           subPath: mysql
  146.         - name: conf
  147.           mountPath: /etc/mysql/conf.d
  148.         resources:
  149.           requests:
  150.             cpu: 100m
  151.             memory: 100Mi
  152.       volumes:
  153.       - name: conf
  154.         emptyDir: {}
  155.       - name: config-map
  156.         configMap:
  157.           name: mysql
  158.   volumeClaimTemplates:
  159.   - metadata:
  160.       name: data
  161.     spec:
  162.       accessModes: ["ReadWriteOnce"]
  163.       resources:
  164.         requests:
  165.           storage: 10Gi
复制代码
能够在slave上看到IO和SQL线程正常running,说明slave状态没有问题;
进入mysql-0创建数据库
  1. # Headless service for stable DNS entries of StatefulSet members.
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   namespace: magedu
  6.   name: mysql
  7.   labels:
  8.     app: mysql
  9. spec:
  10.   ports:
  11.   - name: mysql
  12.     port: 3306
  13.   clusterIP: None
  14.   selector:
  15.     app: mysql
  16. ---
  17. # Client service for connecting to any MySQL instance for reads.
  18. # For writes, you must instead connect to the master: mysql-0.mysql.
  19. apiVersion: v1
  20. kind: Service
  21. metadata:
  22.   name: mysql-read
  23.   namespace: magedu
  24.   labels:
  25.     app: mysql
  26. spec:
  27.   ports:
  28.   - name: mysql
  29.     port: 3306
  30.   selector:
  31.     app: mysql
复制代码
在slave pod中验证数据是否同步?
  1. root@k8s-master01:~/k8s-data/yaml/magedu/mysql# kubectl apply -f mysql-configmap.yaml -f mysql-services.yaml -f mysql-statefulset.yaml
  2. configmap/mysql created
  3. service/mysql created
  4. service/mysql-read created
  5. statefulset.apps/mysql created
  6. root@k8s-master01:~/k8s-data/yaml/magedu/mysql#
复制代码
能够通过上述在主库创建数据库,从库能够正常同步,则说明mysql主从同步没有问题;
3.3.4、mysql⾼可⽤测试

3.3.4.1、删除master pod验证mysql高可用性


进入master,验证master数据是否丢失?

能够看到master数据并未丢失,这是因为该数据存放至远端nfs存储之上;
3.3.4.2、删除slave pod验证mysql高可用性
  1. root@k8s-master01:~/k8s-data/yaml/magedu/mysql# kubectl get pods -n magedu
  2. NAME                                             READY   STATUS      RESTARTS       AGE
  3. magedu-nginx-deployment-5589bbf4bc-6gd2w         1/1     Running     8 (113m ago)   11d
  4. magedu-tomcat-app1-deployment-7754c8549c-c7rtb   1/1     Running     4 (114m ago)   11d
  5. magedu-tomcat-app1-deployment-7754c8549c-prglk   1/1     Running     4 (114m ago)   11d
  6. mysql-0                                          2/2     Running     0              47s
  7. mysql-1                                          2/2     Running     0              23s
  8. redis-0                                          1/1     Running     2 (114m ago)   8d
  9. redis-1                                          1/1     Running     2 (114m ago)   8d
  10. redis-2                                          1/1     Running     2 (114m ago)   8d
  11. redis-3                                          1/1     Running     2 (114m ago)   8d
  12. redis-4                                          1/1     Running     2 (114m ago)   8d
  13. redis-5                                          1/1     Running     2 (114m ago)   8d
  14. ubuntu1804                                       0/1     Completed   0              8d
  15. zookeeper1-675c5477cb-vmwwq                      1/1     Running     4 (114m ago)   10d
  16. zookeeper2-759fb6c6f-7jktr                       1/1     Running     4 (114m ago)   10d
  17. zookeeper3-5c78bb5974-vxpbh                      1/1     Running     4 (114m ago)   10d
  18. root@k8s-master01:~/k8s-data/yaml/magedu/mysql#
复制代码
进入slave验证数据

        出处:https://www.cnblogs.com/qiuhom-1874/        本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表