mysql下载starting the server
AWS EKS运行有状态应用Mysql8.0集(读写分离)
编写:袁泽龙  时间:2022.3.23
阅读本文时,我认为你已经具备kubernets基础,已经创建好了AWS EKS集,并且能够使用kubectl管理集。
1、概述
一般我们采用mysq作为数据库时,常用的是mysql5.x或mysql8.x版本。
数据库实例类型有单机版、高可用版、读写分离集版。 前两种都比较容易实现。
今天我们来实现mysql8.0.26版本的读写分离,并且同步复制时采用密码方式。
为了更好地适应生产环境,以及后续的便利性,我们需要用到namespace(ns)、Configmap(cm),Secret,Service(svc),StatefulSet(sts)。
首先,描述一下我们想要部署的“有状态应用”。
1.是一个“主从复制”(Maser-Slave Replication)的 MySQL 集;
2.有 1 个主节点(Master);有多个从节点(Slave);从节点需要能水平扩展;
3.所有的写操作,只能在主节点上执行;读操作可以在所有节点上执行。
这个主从模式的 MySQL 集非常典型。我们通过一张图来表示。
2、存储
如果是自建kubernetes集,你不懂golang开发的话,很难编写出CSI存储插件,存储类型可能会是你非常头疼的事情,但我们采用AWS EKS,这会让我们非常省心,因为AWS EKS已经帮我们做好了storageClass。采用storageClass,能够自动创建相应的pv和pvc,非常方便。
运行有状态应用Mysql,我们需要用到块存储,即AWS EBS。
AWS EBS存储类型有:io1,gp2,gp3,sc1,st1。默认值:gp2。
通过如下命令,可以查看AWS EKS帮我们做好的storageClass。默认只有gp2类型的,我们可以直接使用。
$ kubectl get storageclass  #或 $kubectl get sc
#会输出如下内容
NAME              PROVISIONER                AGE
gp2 (default)  kubernetes.io/aws-ebs  37m
这个storageClass非常容易实现,它是由gp2-storage-class.yaml这个文件生成的,内容如下:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp2
annotations:    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  fsType: ext4
如果,你想用其它类型的StorageClass,可以将配置文件中的type,更改为其它,如gp3。通过如下命令,即可创建。
$ kubectl create -f gp2-storage-class.yaml
3、命名空间namespace
配置文件中,如果没有指定namespace,默认会自动使用default,在生产环境中,最好是单独创建个命名空间,创建方法
mysql-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: mysql
接下来使用如下命令创建namespace
$kubectl create -f mysql-ns.yaml
记得在secret、statufulset文件中,加上如下一行。
metadata
  namespace: mysql
4、密钥Secret
我们将数据库的帐号密码存在Secret中。
Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码的安全隐患。这个转码操作也很简单,比如:
$ echo -n 'root' |base64
cm9vdA==
$ echo -n '123456' |base64
MTIzNDU2
然后使用如下文件如 mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: prod-db-secret
  namespace: mysql
type: Opaque
data:
  password: MTIzNDU2
  username: cm9vdA==
接下来,我们尝试一下创建这个 Secret:
$ kubectl create -f mysql-secret.yaml
5、配置ConfigMap
可能以前我们习惯在Deployment或Statufulset中写配置文件,我建议生产环境中,配置文件采用configmap。
做mysql读写分离时,Master 节点和 Slave 节点需要有不同的配置文件。
内容如下mysql-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
data:
  masterf: |
    [mysqld]
    log-bin
 
  slavef: |
    [mysqld]   
    super-read-only
    relay_log_info_repository=table
    master_info_repository=table
    relay_log_recovery = 1
接下来,我们尝试一下创建这个 configmap:
$ kubectl create -f mysql-configmap.yaml
如果你的程序是之前一直是在mysql5.7上运行,你可能会用到如下configMap

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。