对mysql的总结与反思_一次DB故障引起的反思和MySQL Operator选型

ce7647222cc8dd646fd5c3541f893f33.png

前言

在一次数据库故障后,我们发现业务库会根据业务的等级会划分多个 MySQL 实例,许多业务库会同时属于一个 MySQL 实例,当一个库引发问题后整个实例的状态是不可控的。从而导致这个实例上的所有业务不稳定甚至造成中断。

故障反思

微服务架构

7a41cf532b8d6c138344a5419e0ba959.png

微服务架构在公司已经采用并坚持了近十年,我们也从传统的 VM 部署架构转身至当下的“容器+K8S”,无论是软件架构还是部署架构,我们都朝着高可用,可伸缩,快速迭代的目标演进。

通过上述技术,我们将应用的可用性提升到了一个新的高度,不幸的是我们还是遇见了故障。

木桶效应

3b432fe868d8816d557e1c9f1ee256f5.png

木桶效应是讲一只水桶能装多少水取决于它最短的那块木板。一只木桶想盛满水,必须每块木板都一样平齐且无破损,如果这只桶的木板中有一块不齐或者某块木板下面有破洞,这只桶就无法盛满水。

墨菲定律

墨菲定律不是一种心理学效应,是一种数学推理。

如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。根本内容是:如果事情有变坏的可能,不管这种可能性有多小,它总会发生。

总结

任何事情都有发生的概率,当短板缺陷暴露后会造成毁灭性打击。

找到短板

可以看到,我们这次故障是因为一个业务库发生了问题,从而影响了这个业务库所在数据库实例上的所有业务库。
为什么不是那个业务库的具体问题呢?我们永远无法避免一个库永远不会出现问题,但我们应该要尽量保障在单个库故障的时候其它的库和业务尽量不被影响。

现代软件架构中可以发现,我们的应用架构一般是朝微服务架构的演讲,但我们的基础设施、中间件层(数据库、MQ 等)确迟迟没有进行“微”化。

我的方案

核心数据库按现状进行管理,由 DBA 进行悉心照顾。
边缘数据库则进行拆库、隔离。

“微数据库”?

通过上诉的问题,我们可以做的一件事情是拆分数据库,将各个业务库拆分出不同的实例。通过资源限制策略(VM、容器?)将数据库所使用的资源进行隔离。
这样当一个库引起故障(节点故障,CPU 跑满、IO 跑满、内存溢出)时只要整体计算资源足够,其它业务库就不会有影响。

如何“微数据库”?

经过这次事件后,我得出的结论是拆库,降低故障影响面,但如何拆库呢?
从最低保障来说,我们至少要保障 1 节点故障的可用度,也就是说一个数据库实例至少有一个从库,也就说 2 个数据库实例(2 个计算节点)。
如果按传统的方式来管理,一个业务一个库(2 个实例、2 个节点)按照公司上百个数据库来带来的硬件成本和维护成本是巨大的。

业务现状

公司虽然业务繁杂,有着非常多业务线和其衍生出的软件工程,但核心业务其实非常少,核心库就更少了。

容器 + K8S

好在我们在 2018 年后全部步入了“容器+K8S 模式”,有着丰富的容器和 K8S 使用和运维经验,我们开启了数据库容器化的探索。

方案选型

如果使用容器 + K8S 进行数据库运维,目前有两种方案可以选:

  1. 直接使用 StatefulSet 运行 MySQL 镜像
  2. 使用 MySQL Operator 进行管理(Operator 是 K8S 中的一种对外提供扩展的能力)

我们选择了方案 2。
原因是 Operator 维护成本更低,更为简单。缺点是不如直接使用 StatefulSet 灵活,但对于非数据库专业人员来说,绝大多数情况 MySQL Operator 会比我们考虑的更周到。

MySQL Operator 选型

关于 MySQL Operator,选择性其实很少,目前看来还能进行选择的只有两个,一个是 oracle 工作人员开源的,还有一个是社区的,两个项目整体活跃度都不高。

先说结论:我们选择了 presslabs/mysql-operator。 为什么我们没用选用以 oracle 官方明义发布的 operator 呢?
主要是因为官方的库除了数据上活跃一些,其实它并不活跃,而且比较老旧,也只支持 MySQL 8.0+,现状大多数 MySQL 应该还是在 5.7+。
下面可以看下具体的分析。

oracle/mysql-operator

https://github.com/oracle/mysql-operator

项目情况:
652 star
303 issues (64 open)
151 commits

特点

  1. 使用 oracle 官方发布的 MGR 高可用架构
  2. 自动、按需备份
  3. 自动故障检测和恢复
  4. 从备份还原

不足

  1. 版本老旧 不支持 k8s 1.16+的版本,因为使用了过时的 k8s api,在较新的 k8s 集群上现状需要修改源码。我们在调研的时候也修改了源码以支持新版本的 k8s。
  2. 只支持 MySQL8.0+版本
  3. 不够活跃,最后有用的提交在一年前
  4. 是 oracle 工作人员利用空闲时间维护的
  5. 备份不支持备份到 pv,只能备份到谷歌云、S3 兼容的环境上

presslabs/mysql-operator

https://github.com/presslabs/mysql-operator

项目情况:
289 star
245 issues (74 open)
568 commits

特点

  1. 使用 Orchestrator 完成高可用(github 在用开源的项目)
  2. 自动、按需备份
  3. 自动故障检测和恢复
  4. 从备份还原
  5. 集成 mysql prometheus 指标导出
  6. Orchestrator 有提供 WebUI,可以方便的进行集群管理
  7. 支持异步、半同步、同步复制

不足

  1. 非官方支持
  2. 目前不支持 MySQL8+
  3. 不支持 Helm3 方式安装(这个我们有找到解决方案)
  4. 备份不支持备份到 pv,只能备份到谷歌云、Azure 或 S3 兼容的环境上
  5. 最多支持双主

思考

为什么数据库等基础设施很少运行在容器中?

这个问题我有在很多线上社群和线下跟很多人讨论过,中间也产生过非常激烈的探讨。

支持运行在容器中

  1. 容器是未来的趋势
  2. 容器带来的性能损耗是有限的,绝大多数数据库不需要那么极端的性能

反对运行在容器中

  1. 容器不稳定
  2. 容器性能低
  3. 容器的未知性可能会造成不可逆的故障(数据丢失等)
  4. 数据持久化有问题

我的看法

数据库容器化是趋势,是必然的,只是当下并不能全部容器化。
这边涉及到的内容会比较多,如果有不太了解的可以搜索引擎一下。
首先这个问题有几个解读:

  1. 数据库就单只 MySQL 吗?
  2. 数据库能不能放进 K8S?
  3. K8S 跟容器的关系?
  4. 容器就是 Docker 吗?
  5. 数据库能不能用 Docker 运行?
  6. MySQL 能不能用容器运行?
  7. MySQL 能不能用 Docker 运行?

数据库就单只 MySQL 吗?

这个答案当然是否定的,Redis、MongoDB、Etcd、MySQL、Oracle、SQLServer 等都算作数据库。

数据库能不能放进 K8S?

需要讨论的本质是容器与数据库,跟 K8S 并没有关系,如果抱着这个问题大家可以直接排除,不用带入 K8S。

K8S 跟容器的关系?

K8S 是调度平台,容器的运行跟他没任何关系,当 K8S 不可用容器不会发生任何变化,除非容器内的程序自己改变自己的状态(异常退出等)。

容器就是 Docker 吗?

否,容器当下最热的实现是 Docker(在细分里面还有 containerd 等不细分了,这边就指通过 cgroups 技术实现的容器解决方案),还有像 Kata、gVisor 这样非 cgroups 技术的实现。简单来说一个容器可以是一个极度精简后的虚拟机

数据库能不能用 Docker 运行?

有些可以有些不行,Redis 等通过 Docker 运行业界已经有很多大厂案例了,Oracle 肯定是不能容器化的了。

MySQL 能不能用容器运行?

上面说了,容器不单只 cgroups 技术的实现,这个问题大家可以理解成 MySQL 能不能运行在虚拟机中?如果你们现有的 MySQL 运行在裸金属物理机上才需要考虑,否则那么一定是可以的。

MySQL 能不能用 Docker 运行?

其实这个才是大家最常见的理解方式,MySQL 能否运行在以 cgroups 技术实现的容器中。
阿里很早就开始将 cgroups 运用在 MySQL 中了。
Docker 封装了 cgroups 的复杂度,提供了实际使用所需的许多内容,我觉得是可以使用 Docker 运行的。

常见误区

  1. 在 K8S 中数据持久化非常麻烦,Pod 重启数据会丢失,除非使用共享存储,但共享存储性能又很低。
    K8S 中可以将 Pod 中的路径直接映射到本地磁盘,同时还可以使用 PV、PVC 的概念,Local Persistent Volume。相当于直接读写 Node 所在的磁盘。
  2. 容器中会丢失数据 以 cgroups 实现的容器技术,其实还是 Node 上的一个进程,权限和待遇跟其他进程并没有太多区别,如果丢失数据那么普通进程也会存在这样的问题,大多数数据丢失并不是容器的锅,而是架构或使用不当引起的。

确实存在的问题

  1. 性能下降
    容器性能下降主要来源于网络 IO。
    磁盘、内存、CPU 等损失几乎没有。
    网络 IO 造成的性能损失幅度还会跟 CNI 选型有关,现在基于 3 层网络转发的 CNI 插件(Calico、Flannel host-gw 等)来说损失度非常有限。
    任何包装和封装都会对性能造成影响,这边大家需要评估的是这些损失的性能有没有造成很大影响?对比于带来的优势来说值不值得?
  2. 不稳定
    任何新的尝试都没有人能保证 100%没有问题,现阶段确实没有人敢将数据库放入容器中在核心业务中使用(在边缘业务中也有许多公司尝试)

数据库容器化总结

我觉得可以尝试边缘业务的数据库进行容器化,这也是未来的趋势。
核心数据库(公司命脉)除非你有很大的把握,否则不要去动。

其实可以发现除传统数据库外,新起的分布式数据库都将 K8S、容器当成一等公民(TiDB 等)

写在最后

由于篇幅原因,将 “presslabs/mysql-operator” 部署和使用的内容放到后续的文章中,将会涉及 Local Persistent Volume 等内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 三星 拍照,安卓里面拍照最好的三个品牌,OPPO华为三星怎么选

原标题:安卓里面拍照最好的三个品牌,OPPO华为三星怎么选几乎每一个节日都能被国内的商家抓住并且成功的策划为一次次的「购物节」,双十一、双十二等无一例外,3月7日这个从中国高校里衍生出来的「女生」节如今也成为了「女神节」。…

FPGA(3)--VHDL及原理图--4位全加器

文章目录一、实验目的二、实验内容三、实验设计五、实验思考与总结一、实验目的 掌握例化语句的使用方法,掌握使用程序文本和原理图结合方法设计电路,掌握利用包含算术操作符的重载函数的使用。 二、实验内容 首先用VHDL语言设计1位全加器&#xff0c…

Vertx编程风格:您的反应式Web Companion REST API解释了

Vertx提供了许多在轻量级环境中进行编程的选项,例如node.js。 但是,对于新用户来说,选择采用哪种方法来创建REST API几乎不会造成混淆。 在vertx中编程时可以采用不同的模型。 下面通过易于理解的图表对其进行说明。 PS – vertx编程的核心…

过去式加ed的发音_小学英语动词过去式归类总结

小学英语动词过去式归类总结  一、动词过去式的规则变化 1. 一般情况下,动词词尾加-ed 如:work ---worked, play---played, want----wanted, act----acted 2. 以不发音的 -e 结尾动词,动词词尾加 -d 把动词原形最后的e去掉&#xff0…

FPGA(4)--VHDL--4位D触发器

一、实验目的 掌握利用VHDL语言,进行基本时序元件的设计。 二、实验内容 利用VHDL语言设计含异步复位(RST)及使能端(EN)的4位D触发器,其中输入D及输出Q均为4位(STD_LOGIC_VECTOR)…

鸿蒙10 5G手机,继鸿蒙后麒麟V10问世 5G时代国产操作系统将起飞

(记者 陈洲)从工信部获悉,中国电子近日在广州发布了银河麒麟操作系统 V10。该系统打通了手机、平板、PC 等多个终端,可谓为5G时代量身定做。其独创的 kydroid 技术,可将安卓应用无缝迁移到国产平台上。银河麒麟V10是继华为鸿蒙OS后&#xff0…

模糊查询关键字不区分大小写_SQL简单查询

SQL书写规则:1)以英文分号结尾(;) eg. select 姓名,性别 from student;2)不区分关键字的大小写。就像Excel里面sum可以大写可以小写。同理,SQL中select不区分大小写。3)列名不能加单引号,列名中间不能有空格。4)所有符号都要是英文…

FPGA(5)--VHDL--10十进制计数器及7段显示译码器

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 一、实验目的 掌握一般性计数器的VHDL设计方法,熟悉程序文本和原理图…

鸿蒙系统笔记本产业链,华为P40或用鸿蒙 华为产业链概念股一览

众所周知,华为已经推出了全新的鸿蒙系统,这正式证明了华为越挫越勇的精神,余承东已经对外透露,要是在无法使用谷歌服务的情况下,明年推出的华为P40或用鸿蒙系统,值得关注的是,这是时候&#xff…

apache log4j_Apache log4j是领先的日志记录框架

apache log4j根据 零周转的调查中, Apache log4j是领先的Java日志记录框架。 这实际上是一个非常有趣的调查。 它显示SLF4J最常用作伐木外墙,占61%。 但是,它似乎最常与Apache Log4j一起使用,52%的调查参…

FPGA(6)--7段显示译码器的加法计数器

文章目录一、实验目的二、实验内容三、实验设计与结果四、实验思考与小结一、实验目的 在上次加法计数器仿真实验的基础上,掌握端口的引脚配置、实验箱的接线及程序的下载、调试等。 二、实验内容 1.在上次实验的基础上,编译、仿真可以进行0-99加法计…

oracle中取反_mysql 取反

云数据库 MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于应用程序开发,无需为数据库运维烦恼价格低至¥0.24/小时起,买1年83折云数据库…

android随机匹配,基于进程调度的Android真随机数和设备特征生成方法的研究

摘要:密钥是保证Android设备安全的重要组件之一,密钥的生成与使用均需要用到随机数,生成高质量的随机数需要高熵值的随机源。另一方面,移动广告等业务对不同的Android设备提供个性化服务时,需要对智能终端进行识别,因此需要采集设备特征,而识别设备需要低熵值的信息…

FPGA(7)--有限状态机--交通灯

一、实验目的 掌握有限状态机的编程和使用方法。 二、实验内容 设计一个十字路口交通灯控制器,东西(b)、南北(a)方向有红灯、黄灯、绿灯,持续时间分别为45、5、40秒,仿真验证其功能。 三、实验设计与结果 1.整体设计思路:根…

Spring Cloud配置–外部化应用程序配置

本教程是关于Spring Cloud Config的,这里我们将研究如何在不同的应用程序中针对不同的环境(例如开发人员,本地,产品等)使用Spring Cloud Config来管理和存储分布式外部配置属性。开发一个简单的云应用程序以使用云配置…

输入法问题_「图」KB4515384再爆新问题:OOBE时中文输入法阻止创建本地账户

KB4515384可谓是近期BUG数量最多的累积更新了,继开始菜单出现严重错误、音频故障、网络适配器问题、PIN登陆系统无法使用之后,在支持文档中微软承认了在初次设置(OOBE)过程中,使用某些语言将会阻止用户创建本地账户。微软在支持文档中表示&am…

cas后端返回html直接跳转,CAS验证成功后不能跳转到登陆成功的主页面解决办法...

CAS验证成功后不能跳转到登陆成功的主页面现在部署了CAS,有一个应用,下载输入应用的URL可以正确跳转到CAS服务的登陆界面,登陆验证通过后页面却跳转到了应用的登陆界面,不能直接进入登陆成功的主页面!应用的web.xml如下CASFilterorg.jasig.cas.client.au…

FPGA(0)--quartusⅡ安装

微信公众号:创享日记 发送:quartus 获取软件安装包等 (假设光盘驱动器号为 E, 所有软件安装到 D 分区) 1.运行e:\QuartusII9.0 \ isetup.exe,直接点击“next”,一直到完成安装 2.设安装路径和目录为&#…

中文转化成拼音_五笔已经淘汰,拼音到达瓶颈,百度重拳出击,全新输入方式来袭!...

不知道大家发现没有,中文输入法的发展历程,其实就是通过建立云词库,改进词汇,发展AI技术来改善拼音输入法的识别率,进而取代五笔输入法的过程。拼音取代五笔,根本原因是易用好学,只要会讲普通话…

计算机二级web题目(1)--web基础

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 1[单迭题] 下列关于Internet和Web的说法中,正确的是(B). A .Web就是Internet别称…