从零开始部署“生产级别”的主从模式Mysql
1. 撰写的缘由
Mysql 在日常应用中使用范围非常广泛,它的部署,其实一个docker run
就可以搞定了,但是这种单个standalone模式下,非常不具备高可用性。
测试环境和开发可以随便用,但是在生产环境中,决不允许如此简单粗暴。
本来以为很容易的事儿,真的想从头开始自己亲力亲为,还是要费点儿劲儿。我在华为云商,随便找个mysql的云服务,它的价格还是非常可观的。
这种程度的配置,一年就要2万元,确实非常快,而且稳定性高,节约了专业运维和服务器的手工配置。很多初创团队在生产环境中,需要部署稳定、高可用的mysql ,但又不得不考虑性价比的问题。
2. 如何部署生产级别的mysql
基于云原生的方式,部署将是未来的大势所趋。我们重点描述这部分。
-
环境制备
把3个云主机部署成为kubernetes集群,具体过程我们不去描述了,需要说明的是,云主机上的安全组,需要把很多端口放行,比如10250端口,mysql 的主从模式,从节点需要访问主节点,如果某些端口不开放,那么会导致slave 节点无法启动成功。 -
为每一台云主机购买一个数据盘
一般情况,你为每一个主机购买的数据盘,会自动挂载到主机上去,如果你是单独购买的,可能需要你点击一下挂载按钮。
接着你可以参考这个文档 去对这个数据盘进行分区,格式化,mount 到文件系统。这是基本的linux 知识,我们也不去过多的记录。值得一提的是,我们也可以使用LVM去管理,这样以后扩容就方便多了。另外,一定要修改
/etc/fstab
, 否则机器重启后,挂载会丢掉。[root@hecs-3488 mysql]#ls -l /dev/disk/by-id lrwxrwxrwx 1 root root 9 Feb 1 20:19 virtio-13a1e4ae-b959-4b8e-8 -> ../../vdc lrwxrwxrwx 1 root root 9 Feb 1 20:19 virtio-2b0f4756-8e48-4906-9 -> ../../vda lrwxrwxrwx 1 root root 10 Feb 1 20:19 virtio-2b0f4756-8e48-4906-9-part1 -> ../../vda1 lrwxrwxrwx 1 root root 9 Feb 1 20:19 virtio-4a2ec24f-2b3d-4dca-8 -> ../../vdb lrwxrwxrwx 1 root root 10 Feb 1 20:19 virtio-4a2ec24f-2b3d-4dca-8-part1 -> ../../vdb1
把下列内容追加到
/etc/fstab
/dev/disk/by-id/virtio-4a2ec24f-2b3d-4dca-8-part1 /data/ ext4 defaults 0 0
-
部署nfs-server
1、每台机器都需要安装nfs-utils,否则pod挂载pvc的时候会报超级块损坏 yum install -y nfs-utils 2、创建nfs共享目录 mkdir -p /data 3、修改nfs配置文件 echo "/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports 4、启动nfs服务 systemctl enable rpcbind && systemctl start rpcbind systemctl enable nfs-server && systemctl start nfs-server 5、检查配置是否生效 exportfs -r && exportfs
-
部署nfs-privisoner
我们使用nfs-subdir-external-provisioner
去自动管理pv 的创建,我们的pod 的volume 需要使用pvc 的template去挂载到pod内部使用,那么pvc自动创建后,nfs-subdir-external-provisioner
的controller 会watch到pvc的创建,根据它描述的storage class,自动创建pv,pv会根据nfs-subdir-external-provisioner
的nfs server配置,去创建使用nfs的存储。- 增加helm repo
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
- 部署slave 的nfs storage class controller
helm install nfs-subdir-external-provisioner-slave nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.0.159 --set nfs.path=/data/nfd-share --set storageClass.onDelete=retain --set storageClass.reclaimPolicy=Retain --set storageClass.name=nfs-slave
- 部署master 的nfs storage class controller
helm install nfs-subdir-external-provisioner-master nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.0.105 --set nfs.path=/data/nfd-share --set storageClass.onDelete=retain --set storageClass.reclaimPolicy=Retain --set storageClass.name=nfs-master
- 增加helm repo
-
check 一下SC
这样我们这个集群就有两套存储啦,都是NFS,但是使用的磁盘分到了两个主机上去,master 在192.168.0.105
slave 存储部署在192.168.0.159
。我们的mysql master 的磁盘将使用192.168.0.105
上的NFS存储,mysql secondary 的磁盘将使用192.168.0.159
上的NFS存储。[root@hecs-3488 mysql]# kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-master cluster.local/nfs-subdir-external-provisioner-master Retain Immediate true 73m nfs-slave cluster.local/nfs-subdir-external-provisioner-slave Retain Immediate true 70m
-
部署Mysql的chart。
-
增加repo
helm repo add bitnami https://charts.bitnami.com/bitnami
-
修改
values.yaml
为什么我们不通过helm install --set 去修改参数呢?因为我们的修改量实在太多了,修改values.yaml
,反而简单一些。helm pull bitnami/mysql tar -xf mysql-9.4.8.tgz cd mysql vi values.yaml
修改点:
- architecture: replication // 默认是standalone,也就是单例,没有高可用性。
- auth.rootPassword: “<你的root密码>” //设置一下,随便搞搞
- readinessProbe.initialDelaySeconds: 60 // 一律调成60,更容易成功
- livenessProbe.initialDelaySeconds: 60 // 一律调成60,更容易成功
- startupProbe.initialDelaySeconds: 60 // 一律调成60,更容易成功
- persistence.storageClass: “nfs-master” // 重点的设置,这样primary的mysql 实例才会使用nfs-master的存储。
- secondary的配置,只有persistence.storageClass: “nfs-slave”。
-
部署mysql chart
helm install mysql-master-slave . -f values.yaml -n mysql --create-namespace
-
check 一下:
[root@hecs-3488 mysql]# kubectl get po -n mysql NAME READY STATUS RESTARTS AGE mysql-master-slave-primary-0 1/1 Running 0 74m mysql-master-slave-secondary-0 1/1 Running 0 74m
-
看下nfs的使用
master 的nfs 目录[root@hecs-3488 mysql]# ls /data/nfd-share/ mysql-data-mysql-master-slave-primary-0-pvc-2801786d-df0d-4ecf-b462-328d5ea16b0d
slave 的nfs 目录
[root@hecs-a9f8-0001 ~]# ls /data/nfd-share/ mysql-data-mysql-master-slave-secondary-0-pvc-d86e6547-9d7c-4187-8d2c-805953be1d81
-
3. 从集群外看下mysql 使用
发现可以正常使用,且mysql 为主备分离,且主备,各自使用不同服务器的不同数据盘,保证了高可用,同时可以对mysql 做scale=0的处理,再次启动,会发现数据依然是存在的。
参考资料:
- http://www.lishuai.fun/2021/08/12/k8s-nfs-pv/
- https://blog.csdn.net/weixin_44455125/article/details/120853492
- https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
- https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/change-pv-reclaim-policy/
- https://www.cnblogs.com/evescn/p/16249207.html
- https://blog.csdn.net/qq_24210767/article/details/105130984
- https://www.cnblogs.com/sddai/p/10397386.html
- https://imroc.cc/kubernetes/troubleshooting/cases/cluster/kubectl-exec-or-logs-failed.html