目前 openbayes 的几乎所有组件都部署在 k8s 内部,但 mysql 作为核心的数据存储节点对其要求都蛮高的,对于目前的业务场景,其要求主要包含以下几点:

需要持久化存储,一旦数据丢失问题非常严重

对性能有要求,不然会拖垮依赖它的一切服务

需要一些额外的备份机制,可以快速的从一个备份做恢复

需要对应的监控体系

mysql 需要可以比较容易的通过各种客户端访问,方便不同的角色对数据做分析或者做 debug

*在规模比较大的时候可能会做读写分离

之所以希望将 mysql 部署到 k8s 内主要还是希望达到以下目的:

减少外部依赖,支持更广泛部署场景;目前对于一些环境是使用了云服务商所提供的数据库(aws / ucloud),然而并不是所有的情况都能这么做。

统一部署模式,降低部署门槛;对于无法使用云服务商的数据库的场景,通常需要独立在某一台机器上安装 mysql 但这个部署模式与 k8s 是分离的,相当于多了一部分手工部署的工作量,而且手动部署也很难满足以上的几点要求的,自动化越少,部署门槛就会越高。

下面介绍 presslabs/mysql-operator 如何满足这些要求,实现在一些环境中成功使用 k8s 内的 mysql 的。

基本介绍

在使用云服务商的数据库的时候我就在想,如果能有一套 k8s 的 operator 能够支持快速部署 / 数据库配置 / 周期性备份 / prometheus 指标暴露也不是难事呀,在做了简单的搜索后还真的发现了这么个东西 presslabs/mysql-operator ,满足了说所提及的这一切:

内置了 mysql 部署配置,简单修改配置可以实现将 mysql 的存储放置在 hostPath 或者指定的 storageClass 解决了持久化存储的问题

既然可以指定具体部署的存储,那么也能指定 mysql 部署的节点,性能的问题基本得到解决

内置 extraBackup 支持手动或者 cronjob 周期性备份数据库到指定的对象存储

部署起来的 mysql 自带 exporter 可以直接和 prometheus 对接,然后把数据通过 grafana 展示,监控 / 告警也就有了

通过配置额外的 nodePort 类型的 Service 可以将 mysql 服务暴露出来,外部访问的问题就解决了

这个 operator 本身就支持读写分离,不过我并没测试

https://github.com/presslabs/mysql-operator/blob/master/charts/mysql-operator/values.yaml 这是 helm charts 的 values.yaml 把这个文件下载到本地,按照具体环境做一定修改后执行以下命令即可部署 operator 了:

# 这里用的是 helm3

helm repo add presslabs https://presslabs.github.io/charts

helm install mysql presslabs/mysql-operator \

-f values.yaml \

-n infra --create-namespace

其中 values.yaml 需要修改的部分主要就是两部分:

镜像位置(image sidecarImage orchestrator.image),国内部署速度不太行,建议自行拉到访问比较好的国内节点

存储,默认 persistence.enabled: false 可以按照自己的情况做修改,这里只支持 storageClass 的方式

部署好之后才是第一步,即成功部署了 operator 本身,下面就是具体部署一个 mysql 了,在 https://github.com/presslabs/mysql-operator/tree/master/examples 有一个例子,可以看到 mysql 被定义为了一个叫做 MysqlCluster 的 CRD。主要需要修改的部分有以下:

secretName 见 https://github.com/presslabs/mysql-operator/blob/master/examples/example-cluster-secret.yaml 指初始化的一些数据,如 root 密码,数据库名称,用户名,用户密码

image / mysqlVersion mysql 的镜像,同样推荐修改为国内的镜像,具体版本也依照实际情况

backupSchedule 如果设置则是需要周期性备份,数据会按照该配置定期备份到指定的对象存储中,当然 backupSecretName 也需要配置正确才能使用

mysqlConf 对应 mysql.cnf 中的字段,依据自己需求配置

volumeSpec 数据持久化方式,和上文中 operator 的类似,但是更灵活,支持 hostPath

initFileExtraSQL 感觉这个 MysqlCluster 是希望用户每个数据库建立一个独立的资源,但是 openbayes 这里有一些附属数据库如果分开放置感觉有点没必要,所以这里就采用这个机制同时初始化了其他的数据库

initFileExtraSQL:

- "CREATE DATABASE IF NOT EXISTS ``"

- "DROP USER IF EXISTS @'%'"

- "CREATE USER @'%' IDENTIFIED BY ''"

- "GRANT ALL PRIVILEGES ON .* TO @'%'"

- "FLUSH PRIVILEGES"

注意这里有个奇怪的写法是需要先去 DROP USER… 至于为啥我并不知道,我只知道不这么做就是会报错…

备份 / 恢复

如上文所述,这个 MysqlCluster 支持自动的备份,当然也支持主动的备份,具体的文档在这里。

既然支持备份也支持恢复,具体的文档在这里。

这些步骤我都测试过了,确认可以走的通的。以及这个备份的功能已经非常体贴了:

支持手动备份通过 cron 控制

支持保存最近的 N 个版本

恢复只需要在初始 mysql 时填写 s3 路径即可

在备份到 s3 不成功可以看看具体的报错信息,它具体备份采用的是 rclone 这个工具。不成功基本就是两个方向:

s3 设置有问题,上传直接挂了

你所使用的对象存储可能不是 rclone 会完全支持的,这种情况比较少见,但是我确实踩到了,具体来讲就是 ucloud 之前缺乏某些操作的支持,但是目前已经支持了呢

监控

如上图所示,这是我直接将 https://grafana.com/grafana/dashboards/7362 这个仪表盘导入所看到的效果。

外部访问

增加一个额外的 NodePort 即可:

apiVersion: v1

kind: Service

metadata:

name: local-openbayes-mysql-nodeport-master

spec:

ports:

- name: mysql

port: 3306

protocol: TCP

targetPort: 3306

nodePort: 30016

selector:

app.kubernetes.io/managed-by: mysql.presslabs.org

app.kubernetes.io/name: mysql

mysql.presslabs.org/cluster:

role: master

type: NodePort

独立 io

在使用的过程中遇到一个特殊的情况,mysql 如果和其他的服务共用一个 storageClass 可能会出现 io 抢占的情况,导致 mysql 的延迟非常巨大。目前 k8s 还没有一个很好的办法解决这个问题。唯一想到的就是为 mysql 分配一套单独的 storageClass (比如 local storage path 的方案)。

k8s mysql operator_将 MySQL 通过 presslabs/mysql-operator 部署到 k8s 内部相关推荐

  1. k8s包管理器helm_eShopOnContainers 知多少[10]:部署到 K8S | AKS

    1. 引言 断断续续,感觉这个系列又要半途而废了.趁着假期,赶紧再更一篇,介绍下如何将eShopOnContainers部署到K8S上,进而实现大家常说的微服务上云. 2. 先了解下 Helm 读过我 ...

  2. k8s使用statefulset部署mysql一主多从集群_k8s部署mysql集群南

    部署原理 1.准备环境 服务器2核4G 139.198.38.94 139.198.41.101 139.198.31.125 需要提前准备好NFS挂载,此处用的是静态nfs #所有机器安装 yum ...

  3. mysql 5.7 xbackup_CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup

    前言 CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup ,记录一下大致的安装和配置过程. Percona XtraBackup 的备份工具支持热备份(即不必停止 M ...

  4. vba与MySQL交互_Excel、VBA与MySQL交互

    几次更新失败,我已经放弃在这里更新了,有需要可以到博客园看: ################################################################ 本文主要 ...

  5. mysql数据库建仓范式_存mysql个数

    MySQL学习笔记之数据类型详解 注:以下内容针对MySQL5.0及以上版本 MySQL的数据类型非常多,选择正确的数据类型对于获得高性能至关重要,本文是我结合网上看到的一些blog加上<高性能 ...

  6. mysql替换开头_如何在MySQL的字符串开头搜索和替换特定字符?

    为此,您可以使用INSERT().让我们首先创建一个表-mysql> create table DemoTable -> ( -> ZipCode varchar(200) -> ...

  7. mysql 集群操作系统_高性能MySQL集群详解(二)

    一.通过Keepalived搭建MySQL双主模式的高可用集群系统 1.MySQL Replication介绍: MySQL Replication是MySQL自身提供的一个主从复制功能,其实也就是一 ...

  8. 把本地mysql备份到服务器innodb_使用mysql备份工具innobackupex将本地数据 直接恢复 到远端服务器数据目录操作实例...

    innobackupex 支持所有mysql引擎数据备份恢复安装配置方法及原理介绍,访问下面链接 http://michaelkang.blog.51cto.com/1553154/1216826 测 ...

  9. mysql主从数据库含义_(转)Mysql数据库主从心得整理

    管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...

最新文章

  1. 学习ui设计的流程是什么
  2. ASP.NET的一套笔试题
  3. 前沿技术 | 自动机器学习综述
  4. 什么时候需要任务调度?
  5. VS code常用插件推荐(总结整理篇)
  6. [css] 如何在白天和黑夜自动切换页面的颜色?
  7. 小红书 “红”到翻车:你的骚操作闪了我的腰?
  8. Java初级笔记-第一章
  9. CAA创建自定义CATIA工具栏按钮和菜单
  10. 牛津3000释义词典_常见英语词典集锦
  11. python链式函数_python 链式
  12. 双稳态(bistable)与单稳态
  13. html中如何将图片3d转换,jpg格式图片如何可以转换成3DMax格式?
  14. [论文阅读] LCC-NLM(局部颜色校正, 非线性mask)
  15. 最短路径算法正确性和操作性闲杂谈-DijkstraFloyd算法
  16. RFID射频识别电子标签基础知识汇总
  17. 【安全系列】setoolkit钓鱼
  18. 排序(一)冒泡排序、冒泡改进——鸡尾酒排序、选择排序
  19. 持续交付体系在高德的实践历程
  20. linux 宏碁 删除分区,宏碁笔记本如何将磁盘C和磁盘D合并成一个分区

热门文章

  1. GPUtil是一个Python模块,使用nvidia-smi从NVIDA GPU获取GPU状态
  2. 在Yolov5 Yolov4 Yolov3 TensorRT 实现Implementation
  3. centos7 下搭建git服务器
  4. linux常用命令(转载)
  5. CodeForces 375D Tree and Queries
  6. kvm虚拟机vnc配置
  7. 金蝶K/3 BOS产品培训教案
  8. clickhouse 基础知识
  9. 下载最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错
  10. Jzoj4747 被粉碎的线段树