建设 TiDB 自动化平台:转转 DBA 团队实践

news2024/11/15 9:48:50

转转技术 .
转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。 各种干货实践,欢迎交流分享,如有问题可随时联系 waterystone ~
莫善
转转 DBA。 负责 TiDB,MongoDB,MySQL 运维及转转数据库平台开发。

转转是 PingCAP 最早的一批用户之一,见证了 TiDB 的发展,自身也沉淀了不少经验。
从 1.0 GA 开始测试,到 2.0 GA 正式投产,然后升级到了 2.1,后来又升级到 4.0.13,最后建设自动化平台。其实转转 DBA 团队初建以来就开始投入一定的资源进行平台建设,一步一步实现自动化运维,希望一切需求都能实现工单化、一切操作都能实现平台化,进而降低人力成本。
本文将分享转转 DBA 团队实现 TiDB 自动化的历程。从遇到问题开始,到解决问题,以及平台做成什么样,也是对过去工作的总结和梳理。

1 运维痛点

  • 转转现有集群 30 多套,早期都是 2.1.[5,7,8,17] 版本,近 500 个 TiKV 节点,总共差不多一百台机器供 TiKV 使用,集群新建、扩容、迁移都需要人工找机器。也因为缺少一个上帝的视角去管理集群,没法做到资源的合理分配,导致日常工作中有很大一部分时间都是在做迁移,都是重复工作,效率很低。
  • 2.1 版本的运维工作都是基于 Ansible 进行。如扩容、下线、启停、修改配置等日常操作,有时候会碰到 Ansible 执行超时的情况。批量操作集群时,根本不知道到哪个节点了,这情况经常能遇到,在 reload 集群配置文件的时候遇到的概率就非常大,要多崩溃有多崩溃。
  • 2.1 版本的 TiDB 自身有很多问题,执行计划失效、读写热点问题(不能快速定位问题)、TiDB 大查询 OOM、乐观事务、监控不完善、以及已知/未知的问题,就连集群状态都无法快速获取,当然备份也很痛苦,这对运维人员的工作加大了难度,也提升了人力成本。
    4.0 使用悲观事务需要满足一定的要求,具体请参考官方文档。
  • 机器资源使用不平衡,存在部分机器内存剩余较多但是磁盘不足,还有部分机器内存不足,但是磁盘剩余很多。导致的结果是老板觉得机器投入已经很大,但是 DBA 实际使用中发现机器还是不够用。
  • 告警噪音比较多,存在重复告警,互相冲刷问题,严重浪费告警资源,对排查问题也带来很不友好的体验。

2 解决痛点

2.1 元数据管理

将所有节点信息保存到表里,定期采集节点状态及资源使用情况。
过去都是依靠 Ansible 的配置文件进行管理,管理视角基本是停留在集群都有哪些节点,连一台机器都有哪些实例都不清楚,更别谈资源管理了。
现在将所有组件保存到一个表中,定期采集组件服务状态,内存磁盘占有量等信息。这样就有了一个全局的视角进行管理,也很方便的查阅集群状态。
后续基于这份元数据进行项目成本核算。
还有一个收益就是,组件信息的采集,可以很好的控制单个 TiKV 的容量,不会再出现单个集群容量一直增长,然后触发机器的磁盘告警 DBA 才感知到。有了这个采集的数据后,可以设置一个 TiKV 容量上限,比如 500GB,达到这个阈值就发送告警给 DBA 准备扩容。这样能很好的避免因机器磁盘告警而接收大量告警信息(单机多实例),也能提供一个很好的缓冲时间让 DBA 来处理。
总结起来就是,能很好的将机器/集群/组件管理起来,能合理有效的进行资源调度,也为实现自动化提供了基础数据。

2.2 机器资源管理

将所有机器信息保存到表里,定期采集硬件资源使用情况。这么做能获得如下两点收益:

  • 第一是对已有环境进行 rebalance。有了元数据信息,就可以很好的展开 rebalance 工作了。最终收益很明显,既提高了资源利用率,还降低了 15% 的机器资源。
  • 第二是能合理有效的进行资源调度,为实现自动化提供了基础数据。(同元数据管理)
    元数据管理和机器资源管理,这两部分工作既降低了成本也提升了工作效率同时也是监控的兜底策略,会基于这两个数据表进行监控:
    (1)进程是否正常。
    (2)机器是否正常。

2.3 全面升级

将所有 2.1 集群升到 4.0.13。
为了更好的管理集群,在升级前还做了一些规范化。第一是端口规划,因为 TiDB 组件太多,一个集群至少需要 6 种组件,涉及到十多个端口,所以做了端口规划,端口采用 2+3 的格式,前两位表示组件名,后三位表示集群编号。即:前两位一样表示同一类组件,后三位一样表示同一个集群。这样就可以很好的实现规范化管理。
比如有一个 001 编号的集群,集群信息如下:

在这里插入图片描述

  • 我们每个集群的监控告警都是独立的组件,原因是在使用 Alertmanager 过程中发现有时候 A 集群的告警信息的 instance 的值是 B 集群的 instance,为了避免出现这种问题,我们每个集群的监控告警组件都是独立的。
  • 另外我们会提供 5 个域名,分别对应到 TiDB 对外服务,Dashboard,Grafana,Prometheus,Alertmanager。仅需要提供集群编号,就可以快速获取各组件的端口号及域名,看到部署目录就可以知道是哪个集群的哪个组件。
  • 需要注意的是,如果将 Dashboard 暴露给业务使用(业务很喜欢访问慢查询平台),建议是创建独立的账户,因该平台强制要求使用 root,所以可以针对 PD 组件的几个机器单独创建 root 账号,这个 root 的密码跟 DBA 使用的 root 进行区别。可以避免管理员账户泄露的问题,但是带来新的问题就是账户管理变得复杂了。
    全部完成升级后。整体性能提升 30%-50%,解决了抽数带来的影响,升级以后暂时没有收到因抽数导致影响到业务的反馈,在升级前几乎每两个月都会有至少一次因为抽数导致业务受影响。

2.4 告警改造

支持短信、语音告警,并实现告警收敛、抑制,告警升级。大大降低告警条数(条数至少能降低 60%),节约告警资源。
收敛和抑制目的是降噪。
告警升级主要是为了降低告警成本,升级分如下几个维度:

  • 第一:介质升级。邮件 --> 企业微信 --> 短信 --> 电话(同一个告警项发送超过 3 次就向上升级一个介质,具体可以根据需求定义)。
  • 第二:接收人升级。一级 --> 二级 --> leader。
  • 第三:按照时间升级。工作时间通过邮件/企业微信发送告警,工作时间之外通过短信/电话发送告警。
    详情请看这篇文章: 基于 Alertmanager 告警系统的改造

3 实现自动化

分布式集群有很多优点,但是对 DBA 来说也增加了运维复杂度,有些集群几十上百个节点,全靠人工去管理运维无疑是很痛苦。
转转现在基本完成了自动化,收益也很明显,这部分主要是想分享一下注意事项或者遇到的问题,仅供参考。

3.1 需求工单化

这部分主要是在平台通过工单的方式实现了业务的日常的需求,降低了沟通成本,实现了业务需求审计,还能减少 DBA 的工作量。
目前支持如下工单类型。

在这里插入图片描述

工单类型
集群部署工单
在 4.0 版本中,部署一个新集群比较麻烦的是拓扑文件的生成,倒不是有多复杂,而是因为一个集群的组件太多,每种组件对硬件的要求又有些区别。
比如 Grafana,Alertmanager 这种不需要 IO,PD,TiKV,TiFlash 对 IO 又要求比较高,另外还需要根据服务的重要程度进行合理的规划,重要的服务单独部署或者尽可能的减少节点数,需要考虑的点参考维度有点多。
以上只是针对部署集群需要关注的点,还有一些额外的考虑点,或者说操作细节。总结起来如下:

  • 为各个角色选择合适的机器,完成拓扑文件,然后部署集群。
  • 初始化集群,创建业务用户,业务域名。
  • 配置 Grafana,Prometheus,Alertmanager,Dashboard 等平台,创建必要的用户,以及 Grafana,Dashboard 权限控制,以及功能验证测试等。
  • 集群信息入库,将必要的信息同步到业务侧。
    所以实现工单化,不仅轻松解决资源调度问题,提升机器资源利用率,还可以大大提升效率,避免操作出错或者遗漏。尤其是功能验证,万一业务上线以后才发现问题,影响面就比较大了。

在这里插入图片描述

新建集群
通过 sic 判断集群重要等级,预估 QPS,TPS 作为辅助参考项,最终根据评分为其分配合理的机器进行集群部署。
数据恢复工单
这类需求在工作中倒不是很多,但是一旦遇到就会比较紧急。实现这类工单后,不仅可以降低沟通成本,降低故障的影响时间,也能降低人力成本。
目前支持两个维度的数据恢复。

  • 一种是基于快照,如果恢复需求的时间点在 GC 时间之内的,就直接通过快照进行数据恢复,所以这类需求恢复速度较快。
  • 一种是基于备份文件,如果恢复的时间点位不在 GC 时间之内的,就只能选择最接近该时间点的备份文件来恢复了。
    目前这两类维度都支持整库(一个工单仅限单库),单表或者多表。基于快照的还支持带特定条件,基于备份文件的不支持带条件。所以相对来说基于快照的复杂一些,特别是多表需要恢复到某一个时间点,且是带条件恢复(单表部分数据)。
    比如一个订单,涉及多个表,需要将多个表某些订单号的数据恢复到特定时间点。
    由此可见,基于快照的恢复是比较灵活的,用户可以选单库,或者单表,还可以选择多表,由于我们并不知道用户需要恢复几张表,所以带查询条件的逻辑应该是动态的,即当用户选择了某个表,就会弹出改表的查询条件输入框,有几个表就有几个输入框,根据提示输入到对应的表即可,如下图所示。

在这里插入图片描述

数据恢复
TiCDC 工单
转转公司有一种特殊业务需求,需要将业务的数据抽取到大数据平台,主要是给业务提供经营数据分析、用户行为和画像资产沉淀以及一些趋势预测。
如果是 MySQL 直接做一个专门提供数据抽取的从库就行了,但是 TiDB 不行,虽然可以暴露一个 TiDB 节点给大数据进行数据抽取,但是本质上还是对同一组 TiKV 进行操作,所以抽数操作很容易引起业务的抖动。
现在我们提供了两种方案给业务进行选择,优先可以选择 TiCDC,如果 TiCDC 不能满足的情况下可以使用 TiFlash。

在这里插入图片描述

TiCDC
对于已经存在 cdc 任务,只需更新配置即可,另外需要注意下游如果是 kafka 的话,数据包的大小,要求跟 kafka 的最大值配置一致,否则可能会报错,尤其是 TiDB 端扩大表结构的场景。
对我们来说,TiCDC 需求真的太需要实现工单化了。那些需要抽数的业务,几乎新增一个表就需要更新 TiCDC 的任务,之前都是邮件沟通,如今实现工单后,对业务,对大数据团队,又或者是 DBA 都是十分方便的,降低了三方的沟通成本,提升工作效率。
TiFlash 工单
需求同 TiCDC 工单。

在这里插入图片描述

TiFlash
从成本上考虑,TiCDC 不需要额外的存储空间,所以更优,也更受欢迎。但是存在一定的风险,比如 TiCDC 到下游的同步链路出现问题(上游 TiDB 业务进行调整可能会导致同步中断),那么下游就会无法获取增量数据。
TiFlash 则不会有这个问题,但是需要牺牲一定的存储空间,业务成本会有所提升,需要业务自己去权衡。

3.2 操作平台化

这部分主要是在平台通过页面操作实现了日常的管理,降低了运维成本,实现了操作审计,还能避免一定的人为操作失误。
节点管理
这部分涉及节点的启动、关闭、重启、下线、维护等。节点启停、重启流程比较简单,这里不做过多介绍。

在这里插入图片描述

节点管理
只有当节点处于关闭状态才会有启动选项。另外需要注意的是,重启操作已经改成 reload,这样对业务的影响相对小一些。前提是要评估好 restart 是否等价于 reload(没有变更配置基本不会有什么问题)。
下线和维护操作需要注意如下几个事项:

在这里插入图片描述

节点管理

  • 下线的目标节点是否是该角色的最后一个节点,或者是否满足 raft 协议的最低要求,如果是则不能直接下线,需要人工介入。
  • 维护操作主要是需要联动一下告警静默,因为维护操作本身是计划内操作,对于不必要的告警可以提前规避掉。
    对于 PD,TiKV 等组件对数量是有要求的,PD,TiKV 最少要求两个,所以当集群只剩两个节点的时候是不允许下线的,需要 DBA 介入操作,当然还有 DM-worker,TiFlash 等组件也是有最低数量要求,需要根据实际情况进行判断。
    扩容管理
    扩容分两种情况,一种是主动扩容,一种是自动扩容。这个小结是介绍主动扩容,至于自动扩容后文会介绍。
    扩容功能比较灵活,支持多角色同时扩容,节点个数可配置,目标地址也可配置,如下图所示:

在这里插入图片描述

扩容
未指定地址的话就由系统默认分配合理的目标地址。
下线管理
下线要求是串行操作,即一个集群在同一个时间只能有一个节点被下线,等待下线后才能下线第二个节点。另外,如果是存储节点(TiKV,TiFlash,Pump),需要等待数据迁移完毕后,执行完集群调整(prune)操作才算下线完成。

在这里插入图片描述

下线
需要考虑一下异常节点的下线,即机器宕机不可恢复的情况,所以我们增加了一个强制下线的选项来处理此类异常场景。
告警管理
告警跟运维工作息息相关,一个好的告警管理平台不仅能提升运维的效率,还能提升工作舒适度及生活质量。
我们的告警管理平台现在功能比较简单,后续会慢慢丰富。

  • 支持预先配置告警静默,比如将对某个集群进行维护,可以先将该集群的告警进行静默。

在这里插入图片描述

告警管理
静默时间最长不允许超过 24 小时,默认是 2 小时,这样可以避免因遗忘导致该告警项被长时间静默。

  • 支持针对已经告警的项进行静默。这部分逻辑是将所有告警项展示出来,供用户选择。
    如下是正在告警列表展示页

在这里插入图片描述

告警管理-告警列表
支持一键静默,即:正在告警的项全部静默。
如下是静默规则列表展示页,正在运行的静默规则支持删除及禁用,禁用状态的允许重新启用。

在这里插入图片描述

告警管理-静默规则列表
慢查询告警
这个功能是统计单位时间内慢查询条目增长量,当达到告警阈值就会触发告警,用户可以设置统计的时间范围,以及慢查询阈值,还有告警阈值。
在这里插入图片描述

慢查询告警-添加规则
集群的慢查询阈值大于用户定义的规则的慢查询最小阈值,会将集群的慢查询阈值设置为该阈值。如集群慢查询阈值是 300ms,用户定义告警阈值是 200ms,这时候会将集群的慢查询阈值设置为 200ms。
如下是规则列表展示页,支持规则禁用及删除,禁用后可以重新启用。

在这里插入图片描述

慢查询告警-规则展示页

3.3 其他辅助功能

进程监控

在这里插入图片描述

进程监控
因 线上机器 基本都是单机多实例,有时 候会出现因为某个实例而影响了整个机器的性能,在没有进程级别的监控下,对我们排查定位问题十分痛苦,为解决这一个痛点,我们开发了进程维度的监控系统,这样可以很好的协助运维人员排查定位机器资源跑满等问题。
进程级别的资源监控,包括但是不限于 CPU, 内存, 磁盘 IO, 网络流量,功能还在继续丰富。具体实现可以参考这个文章: Linux 环境下针对进程维度的监控实现
在这里插入图片描述

进程 监控
会记录每个进程的资源使用情况,其中网络数据是做了限制,只有达到阈值才会采集,所以会出现空白页情况。另外网络传输数据会记录源端到目的端信息。
趋势监控
随着时间的推移,业务数据也在不断的增长。那么问题来了,这个增长是否符合预期?按照这个增量,磁盘空间能支持多长时间?为了解决这两个问题,我们采取了趋势分析的方案,提前监控,分析增长趋势,对于增长异常的集群会和业务进行沟通确认,对于磁盘空间临近告警线会提前迁移。

在这里插入图片描述

进程监控

  • 增量告警,当数据目录在三日内连续单日增长超过 20GB,每个月增量超过 200GB 就会发送告警给业务,请业务进行确认。
  • 全量告警,当数据目录达到告警阈值就给 DBA 发送告警。
    自动运维
  • 自适应迁移
    当机器准备达到内存告警阈值,磁盘告警阈值,就自动迁移。
  • 自适应扩容
    当单个 TiKV 容量达到 800GB 就自动进行扩容。
    不管是自适应迁移还是扩容,都可以减少 DBA 的工作量,也能在一定程度上减少告警量。对于扩容,既控制了单个 TiKV 的大小,对于系统性能也会有一定的提升。
    单节点 TiKV 太大,不利于管理。在节点下线的场景下会拉长数据迁移的时间,在节点离线的场景下,会拉长生成新副本的时间。

4 写在最后

本文介绍了 TiDB 在转转公司的发展历程,从调研测试到投产使用,从命令行运维到自动化平台管理,将业务日常需求基本实现了工单化,DBA 日常管理维护的操作基本都实现了平台化。
一切自动化的前提是先实现规范化。

我们一步一步走过来,遇到了很多问题,也解决了很多问题,但各自环境不同,需求也不同,还可能碰上其他未知的问题,本文所有内容仅供参考。

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

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

相关文章

Python调用MMDetection实现AI抠图去背景

这篇文章的内容是以 《使用MMDetection进行目标检测、实例和全景分割》 为基础,需要安装好 MMDetection 的运行环境,同时完成目标检测、实例分割和全景分割的功能实践,之后再看下面的内容。 想要实现AI抠图去背景的需求,我们需要…

linux高级命令之互斥锁

互斥锁学习目标能够知道互斥锁的作用1.互斥锁的概念互斥锁: 对共享数据进行锁定,保证同一时刻只能有一个线程去操作。注意:互斥锁是多个线程一起去抢,抢到锁的线程先执行,没有抢到锁的线程需要等待,等互斥锁使用完释放后&#xff…

2023-JavaWeb最新整理面试题-TCP、Tomcat、Servlet、JSP等

Java基础面试题 一、JavaWeb专题 1.HTTP响应码有哪些 1、1xx(临时响应) 2、2xx(成功) 3、3xx(重定向):表示要完成请求需要进一步操作 4、4xx(错误):表示请…

MySQL锁之深入死锁分析

文章目录1 死锁产生原因分析1.1 产生原因1.2 产生示例1.2.1 案例一1.2.2 案例二1.2.3 案例三1.2.4 案例四1.2.5 案例五1.2.6 案例六1.3 死锁预防策略1.4 剖析死锁的成因1.5 解除死锁的占用1.5.1 死锁分析1.5.2 死锁解决1 死锁产生原因分析 点击此处了解MySQL各种锁分析 1.1 产…

为什么计算机需要操作系统?(一文详解~)

我们从三个方面来简单聊聊为什么计算机系统操作系统这个话题。 资源分配器 如果你的CPU上只需要运行一个程序,那么你的确不需要操作系统。 可是,一旦你的CPU上需要再运行一个程序,那么马上就会面临一个问题:两个程序开始竞争资源…

山东大学教授团畅谈ChatGPT革命座谈会,探讨ChatGPT发展趋势

2月18日,由山东大学多院系教授学者组成的山东大学教授团在济南福瑞达自贸创新产业园举行了“畅谈ChatGPT革命”座谈会,诸位教授学者就ChatGPT出现的影响进行了探讨。产业园首席顾问李铁岗教授向大家介绍产业园区山东大学经济学院教授、济南福瑞达自贸创新…

2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(二)

前言 资源放CSDN上面过不了审核,都快结束了都没过审真的麻了,订阅专栏的同学直接加我微信直接发你。我只打造优质专栏。专注建模四年,博主参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使…

音视频基础之音频编码原理简介

一:隐蔽信号 数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一套双声道数字音频若取样频率为44.1KHz,每样值按16bit量化,则其码率为: 244.1kHz16bit1.411Mbit/s 如此大的带宽将给信号…

linux系统编程2--网络编程socket知识

在linux系统编程中网络编程是使用socket(套接字),socket这个词可以表示很多概念:在TCP/IP协议中,“IP地址TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址端口号”就称为socket。在TCP协议中&#…

(考研湖科大教书匠计算机网络)第五章传输层-第八节2:TCP连接管理实践部分

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 此部分为补充内容,主要使用Java实现TCP和UDP通信 一:UDP通信 (1)Java数据报套接字通信模型 Java UDP通信模型&#xff…

算法笔记(十)—— 哈希函数和哈希表

认识哈希函数和哈希表的实现 哈希函数 哈希函数:输入域无穷,输出域(哈希值)相对有限 哈希函数:相同的输入一定会返回相同的输出值 由于输入域的无限和输出域的有限,不同的输入可能会返回相同的输出&…

配置Tomcat性能优化

配置Tomcat性能优化 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! &#x1f4…

常用类(五)System类

(1)System类常见方法和案例: (1)exit:退出当前程序 我们设计的代码如下所示: package com.ypl.System_;public class System_ {public static void main(String[] args) {//exit: 退出当前程序System.out.println("ok1"…

详解C++的类型转换

文章目录前言一、C语言中的类型转换二、为什么C需要四种转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast四、RTTI总结前言 在C语言的类型转换有一个非常大的坑,有好多悄悄地转换,有时候把我们转换的就蒙了,因为C要兼容C语言,所以C就…

docker容器单机网络

前言 通过文章 容器的本质可知,容器只是一个进程,而容器所能看到的网络栈,是隔离在自己的 Network Namespace 中。docker 容器单机网络支持四种网络模式,也都是基于 Network Namespace 实现的。本文主要是介绍这四种模式的使用方…

四、actions处理异步行为和调用

四、actions处理异步行为和调用 action:装方法的一个对象。 使用场景:在Vuex运行的环节中,有异步操作——>就必须经过action mutations不能进行异步操作。 最常用的案例:异步请求获取数据 使用方式: 组件中使用a…

移动WEB开发一、基础知识

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…

git ssh配置

ssh配置 执行以下命令进行配置 git config --global user.name “这里换上你的用户名” git config --global user.email “这里换上你的邮箱” 执行以下命令生成秘钥: ssh-keygen -t rsa -C “这里换上你的邮箱” 执行命令后需要进行3次或4次确认。直接全部回车就…

基于 ChatGPT 3.5 和 Bing 搜索引擎的会话式搜索引擎 Perplexity 初体验

一、背景 最近 ChatGPT 非常火爆,但是基础版经常访问失败,于是乎想找一些替代品。 搜到了一个 基于 ChatGPT 3.5 和 Bing 搜索的会话式搜索引擎 Perplexity 体验了下非常不错,值得推荐。 二、联系和区别 2.1 联系 官网在外媒社交媒体上…

三、NetworkX工具包实战3——特征工程【CS224W】(Datawhale组队学习)

开源内容:https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频:https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页:https://web.stanford.edu/class/cs224w NetworkX…