当前位置:Gxlcms > 数据库问题 > Kubernetes 之 MySQL 持久存储和故障转移(十一)

Kubernetes 之 MySQL 持久存储和故障转移(十一)

时间:2021-07-01 10:21:17 帮助过:17人阅读

目录

  • 一、规划
  • 二、部署
    • 1、创建 PV 和 PVC
    • 2、部署 MySQL
    • 3、更新 MySQL 数据
    • 4、故障转移

一、规划

我们接着之前的文档的架构规划进行下面的操作。

IP 角色
192.168.1.200 k8s-master
192.168.1.201 k8s-node01
192.168.1.202 k8s-node02
192.168.1.203 k8s-store

我们演示如何为 MySQL 数据库提供持久化存储,主要分为下面几个步骤:

  1. 创建 PV 和 PVC。
  2. 部署 MySQL。
  3. 向 MySQL 添加数据。
  4. 模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到其他节点。
  5. 验证数据一致性。

二、部署

1、创建 PV 和 PVC

我们 PV 的配置文件mysql-pv.yaml如下:

  1. <code>apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: mysql-pv
  5. spec:
  6. capacity:
  7. storage: 1Gi
  8. accessModes:
  9. - ReadWriteOnce
  10. nfs:
  11. path: /data/volumes/mysql-pv
  12. server: 192.168.1.203</code>

创建 PV。

  1. <code>[root@master ~]# kubectl apply -f mysql-pv.yaml
  2. persistentvolume/mysql-pv created
  3. [root@master ~]# kubectl get pv
  4. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  5. mysql-pv 1Gi RWO Retain Available 7s</code>

PVC 的配置文件mysql-pvc.yaml内容如下:

  1. <code>apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: mysql-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. resources:
  9. requests:
  10. storage: 1Gi</code>

创建 PVC。

  1. <code>[root@master ~]# kubectl apply -f mysql-pvc.yaml
  2. persistentvolumeclaim/mysql-pvc created
  3. [root@master ~]# kubectl get pvc
  4. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  5. mysql-pvc Bound mysql-pv 1Gi RWO 7s</code>

2、部署 MySQL

MySQL 的配置文件mysql.yaml如下:

  1. <code>apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: mysql
  5. spec:
  6. ports:
  7. - port: 3306
  8. selector:
  9. app: mysql
  10. ---
  11. apiVersion: extensions/v1beta1
  12. kind: Deployment
  13. metadata:
  14. name: mysql
  15. spec:
  16. selector:
  17. matchLabels:
  18. app: mysql
  19. template:
  20. metadata:
  21. labels:
  22. app: mysql
  23. spec:
  24. containers:
  25. - name: mysql
  26. image: mysql:5.6
  27. env:
  28. - name: MYSQL_ROOT_PASSWORD
  29. value: password
  30. ports:
  31. - name: mysql
  32. containerPort: 3306
  33. volumeMounts:
  34. - name: mysql-persistent-storage
  35. mountPath: /var/lib/mysql
  36. volumes:
  37. - name: mysql-persistent-storage
  38. persistentVolumeClaim:
  39. claimName: mysql-pvc</code>

PVC mysql-pvc Bound 的 PV mysql-pv 将被 mount 到 MySQL 的数据目录 /var/lib/mysql

  1. <code>[root@master ~]# kubectl apply -f mysql.yaml
  2. service/mysql created
  3. deployment.extensions/mysql created
  4. [root@master ~]# kubectl get pod -o wide
  5. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  6. mysql-7686899cf9-d4m42 1/1 Running 0 62s 10.244.2.17 node02 <none> <none></code>

3、更新 MySQL 数据

MySQL 被部署到 k8s-node02,下面通过客户端访问 Service mysql:

  1. <code>[root@master ~]# kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
  2. If you don‘t see a command prompt, try pressing enter.
  3. mysql></code>

我们在mysql库中创建一个表myid,然后在表里新增几条数据。

  1. <code>mysql> use mysql
  2. Reading table information for completion of table and column names
  3. You can turn off this feature to get a quicker startup with -A
  4. Database changed
  5. mysql> create table myid( id int(4) );
  6. Query OK, 0 rows affected (0.04 sec)
  7. mysql> insert myid values( 111 );
  8. Query OK, 1 row affected (0.00 sec)
  9. mysql> select * from myid;
  10. +------+
  11. | id |
  12. +------+
  13. | 111 |
  14. +------+
  15. 1 row in set (0.00 sec)</code>

4、故障转移

我们现在把 node02 机器关机,模拟节点宕机故障。

一段时间之后,Kubernetes 将 MySQL 迁移到 k8s-node01

  1. <code>[root@master ~]# kubectl get pod -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. mysql-7686899cf9-8z6tc 1/1 Running 0 21s 10.244.1.19 node01 <none> <none>
  4. mysql-7686899cf9-d4m42 1/1 Terminating 0 23m 10.244.2.17 node02 <none> <none></code>

验证数据的一致性。

  1. <code>[root@master ~]# kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
  2. If you don‘t see a command prompt, try pressing enter.
  3. mysql> use mysql
  4. Reading table information for completion of table and column names
  5. You can turn off this feature to get a quicker startup with -A
  6. Database changed
  7. mysql> select * from myid;
  8. +------+
  9. | id |
  10. +------+
  11. | 111 |
  12. +------+
  13. 1 row in set (0.00 sec)</code>

MySQL 服务恢复,数据也完好无损,我们可以可以在存储节点上面查看一下生成的数据库文件。

  1. <code>[root@datanode03 mysql-pv]# ll
  2. 总用量 110604
  3. -rw-rw---- 1 systemd-bus-proxy ssh_keys 56 12月 14 09:53 auto.cnf
  4. -rw-rw---- 1 systemd-bus-proxy ssh_keys 12582912 12月 14 10:15 ibdata1
  5. -rw-rw---- 1 systemd-bus-proxy ssh_keys 50331648 12月 14 10:15 ib_logfile0
  6. -rw-rw---- 1 systemd-bus-proxy ssh_keys 50331648 12月 14 09:53 ib_logfile1
  7. drwx------ 2 systemd-bus-proxy ssh_keys 4096 12月 14 10:05 mysql
  8. drwx------ 2 systemd-bus-proxy ssh_keys 4096 12月 14 09:53 performance_schema</code>

Kubernetes 之 MySQL 持久存储和故障转移(十一)

标签:cli   Once   服务   cto   port   val   quic   match   文档   

人气教程排行