加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 系统 > 正文

基于K8S的StatefulSet布局MySQL集群

发布时间:2021-11-06 10:48:14 所属栏目:系统 来源:互联网
导读:采用NFS存储卷的方式 持久化存储mysql数据目录 需求: 展示如何使用 StatefulSet 控制器运行一个有状态的应用程序。此例是多副本的 MySQL 数据库。 示例应用的拓扑结构有一个主服务器和多个副本,使用异步的基于行(Row-Based) 的数据复制。 基于K8S的Statef
采用NFS存储卷的方式 持久化存储mysql数据目录
 
需求:
 
展示如何使用 StatefulSet 控制器运行一个有状态的应用程序。此例是多副本的 MySQL 数据库。 示例应用的拓扑结构有一个主服务器和多个副本,使用异步的基于行(Row-Based) 的数据复制。
 
基于K8S的StatefulSet部署MySQL集群
搭建一个“主从复制”(Maser-Slave Replication)的 MySQL 集群
存在一个主节点【master】,有多个从节点【slave】
从节点可以水平拓展
所有的写操作,只能在主节点上执行
读操作可以在所有节点上执行
一、部署NFS服务器
#服务器安装nfs服务,提供nfs存储功能
1、安装nfs-utils
yum install nfs-utils (centos)
或者  apt-get install nfs-kernel-server (ubuntu)
 
2、启动服务
systemctl enable nfs-server
systemctl start nfs-server
 
3、创建共享目录完成共享配置
mkdir /home/nfs   #创建共享目录
 
4、编辑共享配置
vim /etc/exports                                            
#语法格式:    共享文件路径     客户机地址(权限)     #这里的客户机地址可以是IP,网段,域名,也可以是任意*
/home/nfs  *(rw,async,no_root_squash)
#服务器安装nfs服务,提供nfs存储功能
1、安装nfs-utils
yum install nfs-utils (centos)
或者  apt-get install nfs-kernel-server (ubuntu)
 
2、启动服务
systemctl enable nfs-server
systemctl start nfs-server
 
3、创建共享目录完成共享配置
mkdir /home/nfs   #创建共享目录
 
4、编辑共享配置
vim /etc/exports                                            
#语法格式:    共享文件路径     客户机地址(权限)     #这里的客户机地址可以是IP,网段,域名,也可以是任意*
/home/nfs  *(rw,async,no_root_squash)
服务自检命令  
exportfs -arv
 
 
5、重启服务
systemctl restart nfs-server
 
 
6、本机查看nfs 共享目录
#showmount -e 服务器IP地址 (如果提示命令不存在,则需要yum install showmount)
 
showmount -e 127.0.0.1
/home/nfs *
 
 
 
7、客户端模拟挂载[所有k8s的节点都需要安装客户端]
创建deployment.yaml 文件
 
官方默认的镜像地址,国内可能无法下载,可以使用 image:
 "
部署
 
root@k8s-master1:pvc # kubectl apply -f .
 
 
#查看存储卷
root@k8s-master1:pvc # kubectl  get sc
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  25h
三、编写mysql 相关yaml文件
MySQL 示例部署包含一个 ConfigMap、两个 Service 与一个 StatefulSet。
 

说明:
 
在这里,我们定义了 master.cnf 和 slave.cnf 两个 MySQL 的配置文件
 
master.cnf 开启了log-bin,可以使用二进制日志文件的方式进行主从复制.
slave.cnf 开启了 super-read-only ,表示从节点只接受主节点的数据同步的所有写的操作,拒绝其他的写入操作,对于用户来说就是只读的
master.cnf 和 slave.cnf 已配置文件的形式挂载到容器的目录中
Service:
app: mysql
说明:
 
clusterIP: None,使用无头服务 Headless Service(相比普通Service只是将spec.clusterIP定义为None,也就是没有clusterIP,直接使用endport 来通信)来维护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。还需要在StatefulSet添加serviceName: “mysql”字段指定StatefulSet控制器
 
另外statefulset控制器网络标识,体现在主机名和Pod A记录:
 
• 主机名:<statefulset名称>-<编号>
 
 storage: 0.5Gi
说明:
 
使用xtrbackup 工具进行容器初始化数据的备份,https://www.toutiao.com/i6999565563710292484
使用linux 自带的ncat 工具进行容器初始化数据的拷贝[使用ncat指令,远程地从前一个节点拷贝数据到本地] https://www.cnblogs.com/chengd/p/7565280.html
使用mysql的binlog 主从复制 来保证主从之间的数据一致
利用pod的主机名的序号来判断当前节点为主节点还是从节点,再根据对于节点拷贝不同的配置文件到指定位置
使用mysqladmin的ping 作为数据库的健康检测方式
使用nfs存储的 PV 动态供给(StorageClass),持久化mysql的数据文件
四、部署并测试

 
 
#动态追踪查看Pod的状态:
root@k8s-master1:~/kubernetes/mysql# kubectl get pods -l app=mysql --watch
NAME      READY   STATUS    RESTARTS   AGE
mysql-0   2/2     Running   0          3h12m
mysql-1   2/2     Running   0          3h11m
mysql-2   2/2     Running   0          3h10m
可以看到,StatefulSet 启动成功后,将会有三个 Pod 运行。
 
接下来,我们可以尝试向这个 MySQL 集群发起请求,执行一些 SQL 操作来验证它是否正常:
OF
如上所示,我们通过启动一个容器,使用 MySQL client 执行了创建数据库和表、以及插入数据的操作。需要注意的是,我们连接的 MySQL 的地址必须是 mysql-0.mysql(即:Master 节点的 DNS A 记录, 因为POD 之间通过DNS A 记录互相通信)只有 Master 节点才能处理写操作。
 
而通过连接 mysql-read 这个 Service,我们就可以用 SQL 进行读操作,如下所示:

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读