我们选择HTAP数据库而不是MySQL进行水平扩展和复杂查询

2020-09-15 00:26:08

BIGO成立于2014年,是一家总部位于新加坡的快速增长的社交网络公司。基于我们强大的音频和视频处理、全球实时传输和内容分发网络(CDN)技术,BIGO推出了BIGO Live(视频直播)、Like(短格式视频)和IMO(视频会议)等产品。BIGO现在每月拥有近4亿活跃用户,我们的产品和服务覆盖150多个国家和地区。

我们业务的快速增长与我们的基础设施和软件的贡献是分不开的。随着应用程序数据的快速增长,我们尝试了PhxSQL、MySQL和Pika来管理我们的数据,但它们在水平可伸缩性或复杂查询方面的弱点让我们失望。

多亏了TiDB,一个开源的、与MySQL兼容的、具有很强一致性的水平可伸缩数据库,我们能够更好地处理我们的数据。在这篇文章中,我们将讨论我们如何从TiDB中获益,以及它在TiDB 4.0中的新特性。

在使用TiDB之前,我们尝试了PhxSQL、MySQL和Pika,但它们都有以下缺点:

我们寻找新的解决方案,发现TiDB是一个开源的、分布式的、混合事务/分析处理(HTAP)数据库,是一个很好的选择。我们采用TiDB是因为它具有以下优势:

它与MySQL协议兼容。要将生产应用程序迁移到TiDB,我们只需修改少量代码。

它适用于各种需要大规模数据的强一致性和高可用性的使用案例。

它支持水平缩放。TiDB的架构将计算与存储分离,使我们能够根据需要在线单独横向扩展或扩展计算或存储容量。

TiDB是一个开源的分布式SQL数据库,提供水平可伸缩性、高可用性和实时HTAP。2020年5月,TiDB发布了4.0 GA版本,标志着其历史上的一个里程碑。

今年早些时候,我们开始使用TiDB4.0测试版。我们创建了一个测试集群,它将与最新开发版本的TiDB一起迭代。因此,我们在TiDB 4.0GA发布后不久就将其升级到了该版本。

我们迈出了大胆的一步,在生产环境中部署了两个TiDB集群,主要用于分析处理。

其中一个用于分析网络监控指标。这个集群的数据量增长很快,它的SQL语句大多是分析性的。应用程序也需要快速响应。

另一个部署为大数据系统的下游存储。TiDB集群中的数据经过大数据工具处理后,提供在线实时服务。单张表的数据量很大。

在TiDB 4.0中,TiUP用于集群部署,Pump和Dainer用于基于binlog跨大陆复制数据,TiFlash用于实时数据分析。我们在我们的系统中广泛使用了这些TiDB4.0组件。

新版本的数据库可能会给现有系统带来不稳定。但是,经过慎重和彻底的考虑,我们决定升级到TiDB 4.0。主要因素是我们的应用程序需求和对高效数据库维护的需要。

当应用团队提出新的要求时,作为DBA,我们总是尽最大努力满足他们的需求。

应用程序开发人员过去常常抱怨TiDB的字符集排序没有像预期的那样工作。他们是对的。在4.0之前,TiDB在排序时无法识别字母大小写。它以相同的方式处理大写和小写。多亏了4.0,TiDB现在通过字符集和排序规则支持区分大小写。

在TiDB 4.0中,电商和金融平台的重要功能--悲观交易模式普遍可用。有了TiDB 4.0,应用程序不再需要过多关注不一致或数据冲突。

TiUP是一个包管理器,它使我们能够只使用一行TiUP命令来部署和维护TiDB。它使管理TiDB组件变得简单而灵活。

此外,我们可以使用TiUP查看整个群集的状态。我们不必前往每个群集并单独查看其状态。

TiDB 4.0的另一个好功能是备份和还原(BR)。BR是用于分布式备份和恢复TiDB群集数据的命令行工具。与mydump或loader相比,BR更适合大数据量的集群。

在TiDB 4.0之前,我们只能通过mydump per或通过创建磁盘快照来执行备份和恢复,这使得DBA很难维护数据库。虽然我们想用TiDB试用我们的核心应用程序,但由于缺乏完整的备份和恢复功能,我们无法这样做。

有了BR,我们将在更多的应用程序中使用TiDB,并且更加自信地使用这个分布式数据库。

如果你问我TiDB4.0中我最喜欢的功能是什么,答案绝对是TiFlash。TiFlash是使TiDB成为真正的HTAP数据库的组件。

TiDB有两个存储引擎:行存储TiKV和列存储TiFlash。TiFlash是TiKV的柱状扩展,它按照RAFT一致性算法从TiKV复制数据。

我们通常将请求分为两类:联机事务处理(OLTP)和联机分析处理(OLAP)。我们可以想当然地认为,来自实时在线应用程序的请求是OLTP工作负载,而大数据分析的摘要是OLAP工作负载。但情况真的是这样吗?在实际使用场景中,为了满足业务需求,很多在线应用都会对实时报表进行查询。

仅使用大数据工具,处理这些查询可能需要T+1甚至T+N天。这根本不是实时的。现有的解决方案之一是查询OLTP存储。其他解决方案包括修改索引、将相同的数据复制到不同的存储或将相同的数据写入不同的表。这些解决方案要么效率低下,要么麻烦。TiFlash给了我们一个新的选择:添加一个柱状副本来实现实时分析。

上图是来自实时应用程序的大型SQL语句。它长达100多行,包含许多表和group by子句、一些条件和一个SUM聚合函数。通常,请求在在线MySQL数据库或以TiKV为唯一引擎的TiDB数据库中处理,可能需要几分钟甚至几个小时才能完成。但是使用柱状存储引擎TiFlash,我们成功地将处理时间减少到只有50秒。此外,由于TiFlash中的数据是从TiKV复制的,并且它们的一致性由RAFT保证,因此TiFlash查询不仅运行速度快,而且还返回一致的实时结果。

TiDB还可以与我们现有的大数据系统相结合。它提供TiSpark,这是为在TiDB之上运行Apache Spark而构建的层。我们可以使用TiSpark访问存储层,包括TiKV和TiFlash。

在TiDB4.0GA中,TiFlash引入了两个新参数,使其可以下推更多运算符并合并更多区域请求。(区域是TiDB存储引擎中数据存储的基本单位。)。通过配置这些参数,我们可以显著提高性能。在我们的测试中,TiFlash将性能提高了100%,查询时间从25秒下降到11~12秒。这意味着在线数据几乎是实时分析的。与TiFlash相比,我们的大数据系统的提取、转换、加载(ETL)处理要经过一条漫长的数据管道。如果没有双向数据验证,这可能会导致数据不一致甚至数据丢失。现在,我们所有的应用程序都倾向于选择TiFlash,而不是传统的大数据解决方案。

总之,我们的每个在线应用程序的TiDB4.0集群至少有一个TiFlash副本。即使TiFlash副本出现故障,我们仍可以向TiKV下推请求。对于DBA来说,数据库稳定性是重中之重,而TiFlash可确保数据库持续工作-即使在困难的情况下也是如此。这是我们选择TiDB4.0和TiFlash的一个重要原因。

TiDB4.0提供了许多我们尚未探索的可能性。在本节中,我将谈论我们如何规划使用TiDB 4.0的下一步。

由于我们的业务遍布多个大陆,因此我们的应用程序经常需要处理多源复制。以前,我们使用Pump和Dainer来实现复制,但是当从多个源写入数据时,我们还必须对写入的数据进行重复数据消除。

在这种情况下,泵和排水器不是理想的解决方案。它们存在部署和可用性问题,消耗太多资源,并产生不需要的binlog。在TiDB 4.0中,我们将尝试使用TiCDC这一变更数据捕获工具,以便在多个TiDB群集和各种数据源之间复制数据。我们还将自行开发一些功能,例如冲突解决和数据合并。

许多应用程序使用TiKV和TiFlash作为存储引擎,而TiDB服务器是无状态服务。大多数应用程序都集成了这种无状态服务,并使用类似代理的服务将请求转发到不同的TiDB服务器,以实现负载均衡。这样的建筑不是很优雅。当代理与容器连接时,集群可以通过容器或通过其他方式进行弹性调度。在这种情况下,代理可能无法足够快地检测到后端更改。

放置驱动程序(PD)解决了这个问题,因为它提供了基于etcd的接口。我们可以在这些接口中找到可用的TiDB节点。当群集弹性横向扩展时(例如在高峰时段),它可以快速横向扩展无状态TiDB节点。然后,PD可以快速发现TiDB服务器,我们可以从客户端找到服务,并将增加的流量路由到该服务器。

通过这种方式,横向扩展的服务可以在短时间内上线,而且我们不需要更改太多的应用程序代码。如果我们以旧的方式这样做,横向扩展的数据库必须注册服务,然后在代理中再次注册,这可能会延迟整个过程。

TiDB Dashboard是一个带有内置小部件的图形界面,让用户可以轻松地诊断、监控和管理集群。在单个界面中,用户可以检查分布式群集的运行时状态并管理该群集,包括:

作为一名DBA,我有时会与应用程序开发人员发生冲突。开发人员可能会坚持说,他们没有提出任何请求,也没有看到任何更改,因此,数据没有热点。在TiDB4.0之前,我们没有办法证明或反驳这样的说法。现在有了TiDB Dashboard,我们可以清楚地看到数据库工作负载是什么样子。

例如,以小部件Key Visualizer为例。它是一款可视化诊断工具,让用户可以随时间观察他们的TiDB群集的读写卷,并以热图的形式显示数据。

Y轴表示键范围,键范围与表和索引之间存在映射。

颜色表示关键点范围的读取量或写入量。颜色越亮,读取或写入卷越高。

Key Visualizer在用户中很受欢迎。我们听说,一位用户甚至用Key Visualizer制作了一个表情热图来取乐:

使用Key Visualizer,我们可以观察某个关键字范围的工作负载。因此,当应用程序团队声称他们的数据没有热点时,DBA可以向他们展示热点图并进行解释。毕竟,应用程序可能不知道集群工作负载和趋势。这个完整的工作负载快照为我们带来了很多洞察力。

当然,TiDB Dashboard还有其他好处。它可以准确监控慢速查询,使我们能够搜索所有实例的日志,甚至只需单击一下,就可以将剖析数据显示为火焰图形。有了这个功能强大的工具,我们可以更好地排查集群异常,保证数据库的稳定运行。

我们开始使用TiDB已经一年多了。它的MySQL兼容性、强大的一致性和易于使用的特性在各种情况下都为我们提供了帮助,并交付了我们预期的高质量结果。

我们期待着TiDB未来的创新,我们将继续与该项目密切合作,促进我们全球业务的增长。