TiDB 在虎牙直播的应用与实践
作者介绍
黄华亮,虎牙直播数据库团队负责人&架构师,负责虎牙数据库维护和数据库团队的管理工作,推进高可用架构演进、数据库服务平台化、运维效率与运维质量提升、成本优化等,对数据库多业务场景架构设计、高并发解决方案、数据生态管控有着丰富的实践经验,对数据库库中间件、分布式数据库有一定的积累。
本文整理自虎牙直播数据库负责人黄华亮在 TUG 企业行——走进网易活动的演讲。本次的分享主要从业务背景、业务挑战、技术架构选型、业务场景应用与实践、常见的问题与未来规划 6 个部分分享。
业务背景
扩展性要求。虎牙直播在订单、私信、秩序、点播、支付等业务上,有不少 1T 以上的实例,这会导致数据扩展性可能产生一些问题。虎牙直播在历史上主要采用结合业务做 MySQL 分表的方式来解决数据存储的扩展性问题。 高可用要求。虎牙直播要求整个数据库的可用性达到 99.99%,为了达到如此高的可用性,虎牙直播做了数据库的同城多 AZ 容灾与异地容灾。 成本要求。虎牙直播希望在保持数据库稳定性的同时,能够不断地降低数据库成本。 性能要求。虎牙性能上有两个要求,一个是直播的在线业务,虎牙直播希望在游戏决赛、季赛等高并发的场景下,数据库能够有更好的性能。另外是 OLAP 侧,虎牙直播希望能够更高效地去满足各种复杂查询和实时应用的需求,即需要实现高性能 OLTP 服务业务,传统大数据架构已经很难满足实时数仓等 OLAP 业务对数据库的性能要求。 数据一致性要求。包括了支付等金融业务对数据强一致性的要求(包含异地容灾)。
业务挑战
业务挑战主要来自于三大点。
数据存储的扩展性
之前虎牙直播通过业务侧的拆分来解决这个问题,但是这种方法对业务存在一定的侵入性,同时面临着数据增长之后,需要做二次或多次拆分的问题,业务改造成本以及整体的运维成本就会变得相当高。虎牙直播也可以基于一定的规则做归档,但是这种方式只适用于虎牙直播一些特定的业务场景。
直播的高性能要求
在 OLTP 侧,虎牙直播希望可以降低直播的延迟 ,能够更高效地进行响应,以及面对一些突发流量的时候,能够快速地扩容,满足虎牙直播对于数据写入与读取的扩展性要求。同时,虎牙直播希望能够有一个一体化的 HTAP 的架构,能同时满足业务对 OLAP 的需求。
控制成本
为什么选择 TiDB
虎牙直播业务对于数据库的选型有以下几点考虑:
第一,这个数据库必须是成熟的产品。从 2017 年 TiDB 1.0 GA 发版到现在的 5.0 版本,TiDB 已经是一个成熟的、愈发完善的数据库。
第二,虎牙直播的数据存储以 MySQL 为主,而 TiDB 几乎 99% 兼容 MySQL 协议,迁移成本很低,业务的改造压力也比较小。
第三,虎牙直播存在扩展性需求,而 TiDB 的 3 层结构支持一键式在线扩容缩容,整个过程对应用完全透明且无影响。同时,TiDB 在业务上比较透明,对业务的感知度很小。
第四,成本优势。在实践中,TiDB 开启高压缩,采用默认的三副本情况下,存储成本也往往比采用双副本的 MySQL 更低;同时,因为 TiDB 的生态比较丰富,运维操作也比较简便,支持一键扩容、自动高可用、Online DDL 等,在大多数场景下有着使用成本的绝对优势。
第五,TiDB 可以保证数据的一致性。TiDB 用 Multi Raft 保证数据的强一致性,满足同城跨 AZ,异地多 AZ 容灾下的数据强一致。
最后一点,高性能。TiDB 的存储引擎使用了 LSM-Tree,它将所有的随机写变成了顺序写,可以满足高性能 OLTP 场景。同时,TiSpark+TiFlash+MPP 满足实时、高性能的 OLAP 场景。
业务场景应用与实践
分库分表应用
虎牙直播在 2019 年的八、九月份才开始使用第一个 TiDB 集群,当时使用的是 3.0 版本。最开始是在一些非核心业务上试点引入 TiDB,来解决虎牙直播的可扩展性问题以及满足虎牙直播对于 OLAP 业务的一些复杂查询的快速响应需求。
当时的业务特性是按天分表,同时按照一定的策略去保留数据,并且定期删除历史数据。同时,业务也有一些需要做数据统计分析的 OLAP 场景。面临的问题在于:
第一,离线数据的存储成本较高。
第二,虎牙直播的离线分析的时效性不高,整体的查询性能不强,不能很好地满足业务的需求。
在引入 TiDB 后,存储的成本降低了,第一个问题顺利解决。针对第二个问题,虎牙直播通过 MySQL 将上游数据同步到 TiDB,然后 TiDB 负责虎牙直播的 OLTP 的场景。同时,复制一份数据列式存储到 TiFlash 里面,通过这种方式满足了实时查询的需求。
这样做的目的,一是能够减少因为分库分表而增加的业务复杂度。二是虎牙直播现在在一套集群上面就可以实现 OLTP 与 OLAP 的混合应用场景,更加方便。
大数据离线应用
在尝到甜头之后,虎牙直播核心的大数据平台也开始使用 TiDB。
在此之前,由于一些老框架的存在,比如 Oracle 的 ETL 场景,一些表数据规模过亿,当分 6~7 张表 join 进行查询的时候,返回的数据行可以到百万级,部分查询甚至每次耗时超过一分钟。
从 MySQL 迁移到 TiDB 后,原先使用的 MySQL 平均耗时 14s,使用 TiDB 后平均耗时下降到 2s,查询的速度提升了七倍。
准实时 AP 应用
这样一来,便解决了虎牙直播在 AP 上的对于数据查询的性能要求。
MGR 替代方案
MGR 指多点写,由于多个节点的数据写入冲突导致的大量事务回滚,产生比较大的 TPS 和延时的抖动,所以只适合写入非常少,主要是读负载的场景。
受限于每个节点的数据处理能力,而单节点的能力又受限于服务器节点的计算资源以及硬件成本等,并不能持续增加其数据存储和处理能力。因此,当数据规模增大到一定程度之后,还是需要使用分布式数据库集群。
在直播打赏业务方面,虎牙直播对于数据有强制性要求。当前的业务架构是采用同城的三个集群,通过专线同步,实现异地容灾。然后在应用中接入 MGR 集群。通过 zk 集群,统一地把 MGR 集群配置推送到 zk 集群。在应用侧,虎牙直播有一个探测程序,每 5 秒探测一次,探测 zk 集群的配置有无发生变更。同时有一个推送配置,当 MGR 发生了主动切换,zk 也会主动将其推送给 Client,这种方式导致业务接入成本较高。MGR 虽然一定程度上能解决数据强一致问题,但是虎牙直播现在采用的是单点写入的方式,因为多点写可能会面临因 DDL、DML 冲突而导致的数据出错问题。
另外,虎牙直播的 MGR 集群还面临着需要分库分表进行拆分的数据扩展性问题,影响数据做 merge 统计。MGR 对整体的网络时延要求比较高,所以不异地部署统一的 MGR 集群,因为网络时延或者网络抖动等可能会导致 MGR 频繁切换和集群整体性能降低。
常见问题
案例:并发 DDL 堵住了后续所有 DDL 的 Bug
truncate partition:多个线程并发执行 truncate 同一张表,都通过校验,进入 DDL 队列,基于 FIFO (First In , First Out) 的原则,session 1 的 truncate 执行成功,这时候 partitionID 变了,然后 session 2 执行同样的 truncate 操作的时候就找不到这个 partitionID 了, session 2 的 DDL 被 block 住,后面的 DDL 也就全部被 block 住。 truncate table:与 truncate partition 同理,不同的地方是 partitionID 换成 tableID。
案例:TiKV 频繁 OOM
问题:使用 TiDB 3.0,业务中有定时的批量 insert 语句触发,Raft apply 线程短时间需要处理大量 raft 日志,apply log 过程速度过慢
版本:TiDB 3.0、4.0
优化措施:
设置合理的 block-cache。
升级到 4.x 版本。
案例:TiKV 节点网络带宽被打满
问题:无索引的大查询把 TiKV 机器网卡出口带宽跑满的场景
版本:TiDB 3.0、4.0
1)优化措施:优化慢查询。
2)防御措施:
慢查询很多是线上已经 running 状态,为了防止慢查询产生的一系列不良后果,可以限制单条 SQL 的最大内存消耗,限制单条 SQL 的最大执行时间,限制整个实例的最大使用内存,参数如下:
tidb_mem_quota_query 限制单个 SQL 的内存消耗
max_execution_time 限制单个 SQL 执行时间
max-memory 或 server-memory-quota 限制实例的总内存
1)限制单条 SQL 最大内存配置:
global: mem-quota-query: 209715200
oom-action: “cancel”
oom-use-tmp-storage=true
2)限制单条 SQL 最大执行时间配置:
set @@GLOBAL.max_execution_time=10000;
未来规划
畅想
在直播的业务场景下,虎牙直播希望能够有什么样的分布式数据库呢?
低成本
首先,TiDB 采用 raft 协议,多副本多复制。能否采取一些措施减少数据节点的成本?因为虎牙直播很多业务场景对于数据的一致性要求不是那么高,而对数据整体的可用性要求比较高。这样可以降低整体数据库的部署成本。 其次,数据库的数据流应该可以做到自动冷热分离,热数据放在内存里面,冷数据放到硬盘里面。未来虎牙直播如果在云上部署,存储成本就更低了。 第三,虎牙直播还希望 TiDB 和 TiFlash 能够相互独立。比如一些纯 AP 的业务可以直接放到 TiFlash,而不需要上游去依赖 TiDB,这样可以降低整体的成本。 最后,TiDB 还可以考虑支持主流公有云的容器化。
高性能
极致弹性
直播很多业务场景,比如赛事或者主播生日活动等情况下,可能会有一些预测之外的流量,虎牙直播希望数据库也可以支持整体的快速扩容。比如对于只读副本,能够快速复制多个副本支撑读流量的快速上升。另外,数据能够快速的迁移,快速扩容写入的能力也必不可少。
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 1 习近平拉美之行的三个“一” 7900211
- 2 微信或史诗级“瘦身” 内存有救了 7990575
- 3 俄神秘导弹首现战场 普京:无法拦截 7899183
- 4 中国主张成为G20峰会的一抹亮色 7761979
- 5 男子求助如何打开亡父遗留14年手机 7682941
- 6 中国对日本等国试行免签 7538293
- 7 女生半裸遭男保洁刷卡闯入 酒店回应 7412357
- 8 7万余件儿童羽绒服里没有真羽绒 7331828
- 9 70多辆小米SU7同一天撞墙撞柱 7201979
- 10 千年古镇“因网而变、因数而兴” 7123301