转转技术 .
转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。 各种干货实践,欢迎交流分享,如有问题可随时联系 waterystone ~
莫善
转转 DBA。 负责 TiDB,MongoDB,MySQL 运维及转转数据库平台开发。
转转是 PingCAP 最早的一批用户之一,见证了 TiDB 的发展,自身也沉淀了不少经验。
从 1.0 GA 开始测试,到 2.0 GA 正式投产,然后升级到了 2.1,后来又升级到 4.0.13,最后建设自动化平台。其实转转 DBA 团队初建以来就开始投入一定的资源进行平台建设,一步一步实现自动化运维,希望一切需求都能实现工单化、一切操作都能实现平台化,进而降低人力成本。
本文将分享转转 DBA 团队实现 TiDB 自动化的历程。从遇到问题开始,到解决问题,以及平台做成什么样,也是对过去工作的总结和梳理。
1 运维痛点
2 解决痛点
2.1 元数据管理
将所有节点信息保存到表里,定期采集节点状态及资源使用情况。
过去都是依靠 Ansible 的配置文件进行管理,管理视角基本是停留在集群都有哪些节点,连一台机器都有哪些实例都不清楚,更别谈资源管理了。
现在将所有组件保存到一个表中,定期采集组件服务状态,内存磁盘占有量等信息。这样就有了一个全局的视角进行管理,也很方便的查阅集群状态。
后续基于这份元数据进行项目成本核算。
还有一个收益就是,组件信息的采集,可以很好的控制单个 TiKV 的容量,不会再出现单个集群容量一直增长,然后触发机器的磁盘告警 DBA 才感知到。有了这个采集的数据后,可以设置一个 TiKV 容量上限,比如 500GB,达到这个阈值就发送告警给 DBA 准备扩容。这样能很好的避免因机器磁盘告警而接收大量告警信息(单机多实例),也能提供一个很好的缓冲时间让 DBA 来处理。
总结起来就是,能很好的将机器/集群/组件管理起来,能合理有效的进行资源调度,也为实现自动化提供了基础数据。
2.2 机器资源管理
将所有机器信息保存到表里,定期采集硬件资源使用情况。这么做能获得如下两点收益:
2.3 全面升级
将所有 2.1 集群升到 4.0.13。
为了更好的管理集群,在升级前还做了一些规范化。第一是端口规划,因为 TiDB 组件太多,一个集群至少需要 6 种组件,涉及到十多个端口,所以做了端口规划,端口采用 2+3 的格式,前两位表示组件名,后三位表示集群编号。即:前两位一样表示同一类组件,后三位一样表示同一个集群。这样就可以很好的实现规范化管理。
比如有一个 001 编号的集群,集群信息如下:
2.4 告警改造
支持短信、语音告警,并实现告警收敛、抑制,告警升级。大大降低告警条数(条数至少能降低 60%),节约告警资源。
收敛和抑制目的是降噪。
告警升级主要是为了降低告警成本,升级分如下几个维度:
3 实现自动化
分布式集群有很多优点,但是对 DBA 来说也增加了运维复杂度,有些集群几十上百个节点,全靠人工去管理运维无疑是很痛苦。
转转现在基本完成了自动化,收益也很明显,这部分主要是想分享一下注意事项或者遇到的问题,仅供参考。
3.1 需求工单化
这部分主要是在平台通过工单的方式实现了业务的日常的需求,降低了沟通成本,实现了业务需求审计,还能减少 DBA 的工作量。
目前支持如下工单类型。
工单类型
集群部署工单
在 4.0 版本中,部署一个新集群比较麻烦的是拓扑文件的生成,倒不是有多复杂,而是因为一个集群的组件太多,每种组件对硬件的要求又有些区别。
比如 Grafana,Alertmanager 这种不需要 IO,PD,TiKV,TiFlash 对 IO 又要求比较高,另外还需要根据服务的重要程度进行合理的规划,重要的服务单独部署或者尽可能的减少节点数,需要考虑的点参考维度有点多。
以上只是针对部署集群需要关注的点,还有一些额外的考虑点,或者说操作细节。总结起来如下:
新建集群
通过 sic 判断集群重要等级,预估 QPS,TPS 作为辅助参考项,最终根据评分为其分配合理的机器进行集群部署。
数据恢复工单
这类需求在工作中倒不是很多,但是一旦遇到就会比较紧急。实现这类工单后,不仅可以降低沟通成本,降低故障的影响时间,也能降低人力成本。
目前支持两个维度的数据恢复。
数据恢复
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(没有变更配置基本不会有什么问题)。
下线和维护操作需要注意如下几个事项:
节点管理
扩容
未指定地址的话就由系统默认分配合理的目标地址。
下线管理
下线要求是串行操作,即一个集群在同一个时间只能有一个节点被下线,等待下线后才能下线第二个节点。另外,如果是存储节点(TiKV,TiFlash,Pump),需要等待数据迁移完毕后,执行完集群调整(prune)操作才算下线完成。
下线
需要考虑一下异常节点的下线,即机器宕机不可恢复的情况,所以我们增加了一个强制下线的选项来处理此类异常场景。
告警管理
告警跟运维工作息息相关,一个好的告警管理平台不仅能提升运维的效率,还能提升工作舒适度及生活质量。
我们的告警管理平台现在功能比较简单,后续会慢慢丰富。
告警管理
静默时间最长不允许超过 24 小时,默认是 2 小时,这样可以避免因遗忘导致该告警项被长时间静默。
告警管理-告警列表
支持一键静默,即:正在告警的项全部静默。
如下是静默规则列表展示页,正在运行的静默规则支持删除及禁用,禁用状态的允许重新启用。
告警管理-静默规则列表
慢查询告警
这个功能是统计单位时间内慢查询条目增长量,当达到告警阈值就会触发告警,用户可以设置统计的时间范围,以及慢查询阈值,还有告警阈值。
慢查询告警-添加规则
集群的慢查询阈值大于用户定义的规则的慢查询最小阈值,会将集群的慢查询阈值设置为该阈值。如集群慢查询阈值是 300ms,用户定义告警阈值是 200ms,这时候会将集群的慢查询阈值设置为 200ms。
如下是规则列表展示页,支持规则禁用及删除,禁用后可以重新启用。
慢查询告警-规则展示页
3.3 其他辅助功能
进程监控
进程监控
因 线上机器 基本都是单机多实例,有时 候会出现因为某个实例而影响了整个机器的性能,在没有进程级别的监控下,对我们排查定位问题十分痛苦,为解决这一个痛点,我们开发了进程维度的监控系统,这样可以很好的协助运维人员排查定位机器资源跑满等问题。
进程级别的资源监控,包括但是不限于 CPU, 内存, 磁盘 IO, 网络流量,功能还在继续丰富。具体实现可以参考这个文章: Linux 环境下针对进程维度的监控实现
进程 监控
会记录每个进程的资源使用情况,其中网络数据是做了限制,只有达到阈值才会采集,所以会出现空白页情况。另外网络传输数据会记录源端到目的端信息。
趋势监控
随着时间的推移,业务数据也在不断的增长。那么问题来了,这个增长是否符合预期?按照这个增量,磁盘空间能支持多长时间?为了解决这两个问题,我们采取了趋势分析的方案,提前监控,分析增长趋势,对于增长异常的集群会和业务进行沟通确认,对于磁盘空间临近告警线会提前迁移。
进程监控
4 写在最后
本文介绍了 TiDB 在转转公司的发展历程,从调研测试到投产使用,从命令行运维到自动化平台管理,将业务日常需求基本实现了工单化,DBA 日常管理维护的操作基本都实现了平台化。
一切自动化的前提是先实现规范化。
我们一步一步走过来,遇到了很多问题,也解决了很多问题,但各自环境不同,需求也不同,还可能碰上其他未知的问题,本文所有内容仅供参考。