TiDB 在 58 集团的应用与实践

Easter79
• 阅读 562

作者介绍:刘春雷,58 集团高级 DBA,负责 MySQL 和 TiDB 的运维工作,TUG Ambassador。

58 集团业务种类繁多,目前包括的业务有 58 同城、赶集网、安居客、58 金融公司、中华英才网、驾校一点通等,数据库种类包括 MySQL、Redis、MongoDB、ES、TiDB。我们自己构建了“58 云 DB 平台”,整合了所有数据库的一体化运维。

本文将重点从运维的角度,介绍 TiDB 在 58 集团应用实践及后续计划。

一、TiDB 在 58 集团的使用概况

我们目前使用 TiDB 的服务器为 50+ 台,服务器的配置为 24 核的 CPU,128G 内存,用的是宝存的闪存卡。部署 TiKV 实例 88 个,集群共 7 套,每个业务一套集群,涉及到 TiDB 多个版本。由于是单集群多个库,目前库的数量大概是 21 个左右。磁盘目前数据量并不算大,在 10T 左右。涵盖的业务线大概目前有 7 条,包括 58 招聘、TEG、安居客、用户增长、信息安全、金融公司还有车业务,后续还会有比较多的业务推进。

二、业务需求及解决方案

TiDB 在 58 集团的应用与实践

图 1 业务及需求

业务需求目前有 4 点:

  • 有大容量、需要长期保留的数据

    目前 MySQL 都是单机存储,物理机容量有限,大约是 3T 的单机容量,由于磁盘空间瓶颈,MySQL 扩容比较麻烦。

  • 保证业务高可用

    目前我们在 MySQL 上做的是主从复制+ MHA,这个方案有一个问题是,当主库挂掉的时候,需要切换主从,就会影响一定时间的写入,这对于业务来说影响比较大。

  • 需要更高的读写性能

    MySQL 目前都是单点写入,也就是主库写入,如果要读的话,就需要通过从域名到从库来进行读操作,读延时比较高,同时读流量增加会进一步加大延迟高的问题。

  • 分库分表很痛苦

    在数据量特别大的情况下,就需要分库分表,分库分表大家都比较痛苦,因为聚合比较困难,业务侧开发同事也要自己维护库表的对应路由信息。

上面这几点在 TiDB 上都被很好的解决了,比如 TiDB 可以水平伸缩,如果计算能力不够的话,直接加节点就可以了,而且 TiDB 有多副本,可以保证数据安全及高可用。另外,TiDB Server 没有状态,支持多点读写。TiDB 无需分库分表,操作比较简单,也不用定期清理数据。

三、TiDB 环境建设

TiDB 的环境建设包括开发工具进行慢 SQL 的分析,完善监控系统,并把 TiDB 接入到“58 云 DB 平台”,收集数据、做可视化报表等等。

1. 架构

TiDB 在 58 集团的应用与实践

图 2 TiDB 部署架构

TiDB 在 58 集团应用的架构如上图,主要分为管理机、云平台、监控、TiDB 集群等四个模块:

  • 管理机

    主要是负责环境部署、监控程序、拓扑查询后、 SQL 的分析、报表程序、TiDB 集群的状态检查工具。

  • 58 云 DB 平台

    平台主要功能有元信息维护、工单处理、集群信息的具体展示、监控概览,还有一些自助查询的接入,比如开发利用自助查询查看各自业务的 TiDB 集群情况。此外还有运营报表、TiDB 集群申请等功能。

  • 监控

    包括实例监控、服务器监控和报警。

  • 具体的 TiDB 集群

    主要分为读写 DNS 和只读 DNS,分别下接读写 TGW 和只读 TGW(TGW 是腾讯的 Tencent GateWay),通过读写账号或者只读账号,路由到具体的 TiDB 集群上。

2. TiDB 生态工具

我们最近开发了以下几个运维工具。

(1) 拓扑查询工具:qtidb

用于查看一个集群的具体拓扑情况。

(2) SQL 分析工具:tidb_slow_query

TiDB 2.X 版本的慢 SQL 收集分析相比起来复杂一些,还不支持 pt-query-degist 这个工具(在最新的 2.1 及 3.0 版本中已支持),所以我们就着手写了一个 SQL 分析工具,直接分析慢 SQL 的一个日志文件,将结果汇总展示(这个问题在 TiDB 3.0 中已经已经很好的解决了,直接从 SLOW_QUERY 这张表提取结果,直接进行汇总展示)。

TiDB 在 58 集团的应用与实践

图 3 慢 SQL 分析工具

这个针对 TiDB 2.X 版本的慢 SQL 分析工具,主要是判断慢日志的采集区间,把所有的 SQL 格式化、逻辑化,把每类 SQL 的类型、具体信息采集出来,然后再把此类逻辑 SQL 的具体 SQL 放在一个具体的文件上,然后再去展示它的具体情况,如下图所示。

TiDB 在 58 集团的应用与实践

图 4 慢SQL 分析结果举例

主要信息包括比如排序情况、库名、账号、平均执行时间、执行次数、具体逻辑 SQL 等。

(3) 状态检查工具:tidb_check

我们会临时查看某个集群的状态,比如宕机检查等等。这是跟监控类似的工具,防止集群繁忙时的状态误报情况。因为我们当前的监控是通过 Prometheus 来获取数据的,但 Prometheus 是单点,如果 Prometheus 挂了,或者在 TiDB 集群特别繁忙的时候,可能从 Prometheus 采集数据延迟高,然后大家判断 TiDB 集群可能挂掉了,这时我们就会用 tidb_check 查看 TiDB 集群的真实状态。

TiDB 在 58 集团的应用与实践

图 5 TiDB 状态检查工具

主要实现方式是根据元信息来生成一个实例的拓扑的文件,我们查看集群的所有的拓扑之后再去从 Prometheus 获取数据然后汇总,最后把结果推送到 Zabbix 进行报警服务(目前我们用 Zabbix 做统一监控、报警平台,后面暂时没有用官方推荐的 Altermanager),然后再入库进行展示。其实集群状态误报的问题也可以从另外一个角度来解决,从各个组件的一个接口去获取集群的一个状态,防止 Prometheus 单点或其他的问题导致误报,这个功能目前也在开发中。

(4) 报表信息收集工具:tidb_report

报表信息收集工具也是通过 Prometheus 的一个接口来获取数据,获取当前的数据库和表的情况,到具体的集群上面去查,在 TiDB 3.0 版本下也会查一些 Slow Query 的表,汇总慢 SQL 的情况。

(5) 监控自动化工具:tidb_monitor

监控我们是通过 tidb_monitor 这个工具,从 Prometheus 来获取各个节点的监控数据,逻辑化之后推到 Zabbix,我们的监控平台,然后利用 Zabbix 进行趋势图展示和报警。

3. 平台化

TiDB 在 58 集团的应用与实践

图 6 运维管理平台架构

在平台化方面,我们把 TiDB 接入到了“58 云 DB 平台”,利用开源 inception 来处理 DDL/DML 工单。平台分为管理端和用户端,管理端就是 DBA 用来做元信息维护、工单处理、运营报表、监控概览等。用户端方面,业务会在上面申请 TiDB 集群、DDL/DML 工单,账号管理,查看集群的信息及监控情况,他们还可以自助查询库中的数据。

TiDB 在 58 集团的应用与实践

图 7 运维管理平台展示(1/2)

TiDB 在 58 集团的应用与实践

图 8 运维管理平台展示(2/2)

TiDB 运维管理方面主要是集群的信息展示、查看集群的监控,或者添加 TiDB/TiKV/PD 节点。另外我们也可以批量添加实例,选好机器、配好角色,然后指定开发负责人,就可以直接添加了。

4. 可视化报表

TiDB 在 58 集团的应用与实践

图 9 可视化报表分类

可视化报表方面的工作是将 Prometheus 或者服务器的 Zabbix 的监控数据汇总放在平台上,提供给开发人员和 DBA 查看,主要维度包括服务器负载情况、CPU 内存、磁盘、网络、IO 等。集群方面是通过 Prometheus 的接口获取该集群当前使用量和总容量情况,库、表方面就是通过定期采集观察库的数据增长情况。

四、业务及 TiDB 使用情况

TiDB 在 58 集团的应用与实践

图 10 目前使用 TiDB 的业务

目前,58 集团使用 TiDB 的业务主要有 TEG 业务、安居客(日志类)、用户增长业务(58 咨询、通讯录数据保存)、信息安全(验真中心)、金融公司(金融实时数据仓库底层存储)、车业务(二手车话单分配) 等,其中应用最多的是 TEG 业务。

TEG 的业务主要包含 WList、WTable 管理后台、搜索指数等,这些都是我们自研数据库的管理端,目前写入量比较大,数据量在 6T 左右,数据增长 500G/月 左右,近半年 TEG 业务损坏了 8 块闪存卡,但是都没有影响业务,让我们充分感受到了 TiDB 高可用的优势。

TiDB 在 58 集团的应用与实践

图 11 TiDB 数据库总量增长趋势

目前 TiDB 在 58 集团内部应用总量增长趋势是很快的,从 2018 年中开始接入 TiDB,到目前 TiKV 实例是达到 88 个,库的增长是达到 22 个左右,尤其是今年第二季度开始发力增长。

五、后续计划

我们后续计划将服务管理平台、PMC 订单流水等 6 个业务,共 18 套 MySQL 集群全部迁移到 TiDB,总计磁盘量 30T,数据量 2000 亿。其中最重要的是 PMC 订单流水这个库,它有 8 套 MySQL 集群都是分库,每套集群磁盘量 2T,迁移 TiDB 的过程应该会有很大的挑战。

TiDB 在 58 集团的应用与实践

图 12 后续计划使用 TiDB 的业务

在运维方面,我们已经着手准备版本升级,可能会全部迁到 TiDB 3.0 版本,目前已经升级了一套,还是非常平稳的。至于监控完善,刚刚已经提到过,之后监控工具将通过多个组件接口来获取数据,防止单点问题导致误报。在报表功能方面,我们也在持续开发完善,比如包括 3.0 版本下的慢 SQL 查询的优化等。另外,因为有数仓类的业务,所以我们也考虑使用 TiSpark 和 TiFlash 提升系统性能。最后,我们也在做自动化部署、扩缩容、故障处理方面的开发。

本文整理自刘春雷老师在 TiDB TechDay 2019 成都站上的演讲。

原文阅读https://pingcap.com/cases-cn/user-case-58/

更多案例阅读https://pingcap.com/cases-cn/

TiDB 在 58 集团的应用与实践

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k