K8S部署主从Mysql集群(版本8.0) 部署方式使用StatefulSet

一、镜像版本

该镜像使用的mysql数据库和备份软件版本

mysql使用官方8.0.18
xtrabackup使用的是rpm软件trabackup:8.0.9  
制作xtrabackup镜像
Dockerfile 配置如下:

FROM centos:7

ADD percona-xtrabackup-80-8.0.9-1.el7.x86_64.rpm /

RUN rpm --rebuilddb && \
    yum -y install wget hostname mariadb && \
    yum -y install nmap-ncat.x86_64 && \
    yum -y localinstall percona-xtrabackup-80-8.0.9-1.el7.x86_64.rpm
RUN rm -rf percona-xtrabackup-80-8.0.9-1.el7.x86_64.rpm

EXPOSE 3307

xtrabackup备份工具下载 :Download Percona XtraBackup 8.0

工具准备好之后构建自己的私有镜像。

二、MySQL集群搭建

2.1、集群要求

  • 搭建一个一主 N 从的 MySQL 集群;
  • 从节点可以水平扩展;
  • 所有的写操作,都只能在主节点(Master)上执行;
  • 所有的读操作可以在所有节点上执行;

2.2、物理机环境搭建集群

下面,我们看一张MySQL主从复制的原理图:

K8S部署主从Mysql集群(版本8.0) 部署方式使用StatefulSet_第1张图片

上面的原理图告诉我们,部署这样一个一主多从的 MySQL 集群,关键在于配置 Master 节点和 Slave 节点的复制和同步。

下面我们用自然语言描述在物理机上部署这样的集群的关键步骤;

1、配置并安装好 Master 节点的 MySQL;
2、通过XtraBackup将Master节点的数据备份到指定目录;
3、将第2步备份出来的目录,连同备份信息文件,拷贝到Slave的 /var/lib/mysql下,然后执行 CHANGE MASTER TO指令;
4、启动 Slave 节点,执行 START SLAVE指令;
5、在这个集群中添加更多的Slave节点;

2.3 Kubernetes 上搭建一主多从的 MySQL 集群

2.3.1 难点

不同于物理机,在 Kubernetes 上搭建一主多从的 MySQL 集群,结合容器的技术特色,我们思考以下需要解决的困难点:

  • Master 节点和 Slave 节点需要有不同的配置文件;
  • Master 节点和 Slave 节点需要能够传输备份信息文件;
  • 第一次启动 Slave 节点,需要执行一些初始化SQL操作;

 2.3.2 使用cephfs做持久化存储

准备外部ceph存储,部署好ceph-csi,以及storageclass的存储名部署nacos需要用到

  ceph存储:ceph v15.2.13版本[octopus]分布式集群部署
  ceph-csi部署:K8S使用ceph-csi持久化存储之cephfs部署验证快照
 

2.3.3 ConfigMap 为 Master/Slave 节点分配不同的配置文件

根据开头介绍的ConfigMap概念可知,使用 ConfigMap 可以很好解决 MySQL集群中 Master 和 Slave 节点配置文件不一致的问题。ConfigMap 的配置信息如下:

[root@master mysql]# cat configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
data:
  master.cnf: |
    # Master配置
    [mysqld]
    log-bin
  slave.cnf: |
    # Slave配置
    [mysqld]
    super-read-only

这里我们定义了 master.cnf 和 slave.cnf 两个MySQL的配置文件。

  • master.cnf 开启了 log-bin,即: 使用二进制日志文件的方式进行主从复制。
  • slave.cnf 开启了 super-read-only,表示从节点拒绝除了主节点的数据同步操作之外的所有写操作,即它对用户是只读的。

创建ConfigMap和查看状态

[root@master mysql]# kubectl apply -f configmap.yaml
configmap/mysql created

[root@master mysql]# kubectl get configmap -n mysql
NAME    DATA   AGE
mysql   2      31d

2.3.4 Secret 为 集群配置密码

[root@master mysql]# cat secret.yaml
---
# Secret 为 mysql集群配置密码
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
  namespace: mysql
  labels:
    app: mysql
type: Opaque
data:
  password: dVVOMzgjJXBx # echo -n 'uUN38#%pq' |base64

创建并查看secret

[root@master mysql]# kubectl create -f secret.yaml
secret/mysql-secret created

[root@master mysql]# kubectl get secret -n mysql
NA

你可能感兴趣的:(k8s文档,mysql,数据库)