在易国捕捉易逝洞察力的混合数据库

2018-06-22 Yiguo.com 互联网

工业:电子商务

作者:罗瑞星(大数据高级工程师)

Yiguo.com是一个生鲜农产品电商平台,服务近500万用户和1000多家企业客户。自2005年成立以来,我们一直致力于为普通消费者提供新鲜的食品,并越来越受欢迎。随着用户基础和数据的快速增长,我们需要一个高性能、水平可扩展的实时数据库系统,能够同时支持这两种功能联机事务处理(OLTP)联机分析处理(OLAP)工作负荷大,才能做出及时、准确的决策,提高我们对用户的服务质量。

结合TiDBTiSpark,我们得到了一个水平可伸缩、强一致性和高可用性的数据处理平台,它几乎实时地支持快速增长的数据集上的OLTP和OLAP工作负载。通过采用TiDB和TiSpark,我们的应用程序现在有了新的竞争优势,可以比以往更快地提供更好的服务。

我们的痛苦点

以前,我们的数据分析系统是建立在Hadoop生态系统和SQL Server之上的。一开始,我们在SQL Server上运行了一个近乎实时的系统,由我们的开发人员通过编写和维护相应的存储过程来实现。因为数据量不是很大,所以SQL Server就足够满足我们的需求了。随着我们的业务和用户群的增长,数据量也增长到了SQL Server无法处理的程度,以提供及时和准确的决策。我们现有的系统成为了一个瓶颈,我们必须寻找新的解决方案。

我们对新系统的要求是:

  • 同时满足OLAP和OLTP的基本要求;
  • 与我们现有的应用程序无缝集成,因此数据迁移开销很低,学习曲线也不会太陡;
  • 与现有的基于hadoop的系统接口良好。

我们的评估过程

根据我们的需求,我们评估了三个选项——Greenplum、Apache Kudu和TiDB/TiSpark。我们决定使用TiDB/TiSpark,原因如下:

  • Greenplum是一个大规模并行处理基于PostgreSQL的平台。它通常用于并发事务数量不是很高的脱机分析场景。然而,对于OLTP场景,我们的初步测试表明,与TiDB相比,它的并发写性能较差。
  • Apache捻角羚是一个为Hadoop平台开发的柱状存储管理器,广泛用于实时分析。但是,Kudu不支持二级索引,这对于我们有效地访问除了主键以外的属性的数据非常重要。
  • 作为混合事务/分析处理(HTAP)数据库,TiDB消除了在不同数据库和仓库之间不断移动数据以支持事务性或分析性工作负载的必要性。因此,它支持基于实时交易数据而不是事后分析的实时业务分析,并立即将原始数据转换为及时决策的见解。
  • TiSpark充分利用Apache Spark平台和TiDB的优势,提供HTAP功能,为在线交易和分析提供一站式解决方案。
  • TiDB / TiSpark开源社区正在蓬勃发展,这增强了我们在做决定时对该解决方案未来的健康和实力的信心。

与TiDB和TiSpark一起前进

TiDB是一个开源的分布式HTAP数据库,灵感来自谷歌扳手/F1.它具有以下核心特点:

  • 兼容MySQL协议;
  • 水平可伸缩性;
  • 跨多个数据中心的分布式ACID事务;
  • 强一致性保证;
  • 自动故障转移和高可用性。

TiSpark是一个薄层,用于在TiDB/之上运行Apache SparkTiKV以加速复杂的OLAP查询。它利用Spark的性能提升,并将其与TiDB集群的其余组件结合,为在线事务和分析提供一站式解决方案。

TiDB在其生态系统中也有大量的其他工具,如用于快速部署的Ansible脚本,用于从MySQL无缝迁移的Syncer,用于迁移异构数据的Wormhole,以及用于收集Binlog文件的TiDB Binlog工具。

实现概述

2017年10月中旬,经过精心设计和严格测试,我们将实时分析系统移植到生产中的TiDB/TiSpark。

我们新系统的架构如下:

TiDB/TiSpark实时数据仓库平台

TiDB/TiSpark实时数据仓库平台

该平台的工作方式如下:

  1. 现有SQL server中的事务数据通过Flume、Kafka和Spark Streaming实时的被引入到TiDB中,而MySQL中的数据则通过binlog和TiDB Syncer(一种可以实时读取MySQL数据的数据同步工具)写入到TiDB中。

  2. 在TiDB项目中,我们有几个组件:

    1. TiDB集群包括无状态TiDB实例作为无状态SQL层,处理用户的SQL查询,访问存储层中的数据,并返回相应的结果。在我们的例子中,TiDB集群用于增强我们的商业智能工具,以便对几百万行数据集进行实时分析计算,分析任务每5-10分钟执行一次。
    2. TiKV集群,由TiKV实例,是数据驻留的分布式事务性Key-Value存储。无论数据来自SQL Server还是MySQL,最终都会存储在TiKV中。它使用复制协议,保证数据一致性和容灾。
    3. TiSpark位于TiKV之上,支持我们的数据科学家在现有Hadoop系统中进行实时分析或离线日常分析。

在该架构中,TiDB/TiSpark作为一个混合数据库,具有以下优点:

  1. 实时数据仓库。上游OLTP数据使用TiDB实时写入,下游OLAP应用使用TiDB/TiSpark实时分析。这使得我们的数据科学家能够基于更最新和事务一致的数据做出更快的决定。

  2. 加速的单一数据仓库T + 1这意味着每天向分析系统倾倒数据T为交易日期,和+1是指1在事务日期之后的第二天)异步和提取,转换和加载)处理。

    1. 的数据T + 1可以使用TiSpark直接从TiDB中提取分析,这比使用Datax和Sqoop从传统关系数据库读取数据要快得多。
    2. 在TiDB/TiSpark之前,我们必须维护独立的数据仓库,ETL过程非常耗时。现在,ETL过程变得简单了。提取工具只需要支持TiDB,而不需要支持多个数据源,极大地方便了业务应用,降低了维护成本。
  3. TiDB与MySQL的兼容性大大降低了迁移成本。来自MySQL的事务性数据可以通过Syncer (TiDB生态系统中的一个工具)流向TiDB。此外,我们可以重用MySQL社区中的许多现有工具,而不必对现有应用程序做太多更改。

  4. TiDB的自动故障转移和高可用性特性有助于保证整个系统的稳定性和可用性。

  5. TiDB的设计实现了数据分布的均匀和动态平衡。我们可以使用TiDB作为热数据的备份数据库,也可以在将来直接将热数据迁移到TiDB。

结果

我们使用TiSpark对中国最大的网购节“光棍节”的整个数据集进行了复杂的数据分析。与SQL Server相比,我们看到使用TiSpark的性能提高了4倍。例如,我们有一个复杂的SQL查询,它将12个表与几个超过100万行的表连接在一起。这个查询在TiSpark上只花了8分钟,而在SQL Server上则需要30多分钟。

我们基于TiDB/TiSpark的实时数据仓库平台的成功让我们相信,未来我们将有更多的服务迁移到TiDB。这个统一的实时混合数据库使我们能够利用数据的力量,专注于为用户创造价值。

教训

我们向TiDB/TiSpark的迁移并非没有挑战。以下是一些经验教训:

  1. 强烈推荐使用TiDB Ansible进行部署、升级和操作。在测试环境中,我们使用二进制包手动部署TiDB。这很容易,但TiDB在2017年10月发布了1.0版本后,升级就变得麻烦了。在咨询了TiDB支持团队后,我们使用TiDB Ansible脚本重新部署了1.0版本,升级变得容易多了。同时,TiDB的Ansible脚本默认安装Prometheus和Grafana监控组件。TiDB提供了许多优秀的Grafana模板,这使得监控和配置更加简单。

  2. 为了获得最佳性能,强烈建议使用带有ssd的机器。最初,我们在集群中使用机械硬盘。后来,我们意识到不稳定的写工作负载引起的延迟对性能有很大的影响。我们联系了TiDB支持团队,确认了TiDB架构主要是为SSD的存储性能而设计的,所以我们将硬盘换成了SSD/NVMe,写性能得到了明显的提升。

  3. 对于数百万行以上的复杂查询,TiSpark的性能要比TiDB好得多。在一开始,我们只是使用TiDB进行复杂的查询,但是一些复杂脚本的性能并不比SQL Server有任何优势。在为并行计算调优了一些参数之后,例如tidb_distsql_scan_concurrencytidb_index_serial_scan_concurrency,tidb_index_join_batch_size在美国,过去需要15分钟的分析任务只需要一半的时间。但这仍然不能完全满足我们的需要。所以我们转向了TiSpark,结果证明它非常适合我们的场景。

  4. 集群的在线调度和离线调度不能同时进行。每次ETL脚本启动一些Spark参数时,都非常耗时。我们计划在未来使用Spark Streaming作为调度工具。Spark Streaming记录每次执行后的时间戳,只需要监控时间戳的变化,避免了多次初始化所消耗的时间。使用Spark监视,我们还可以清楚地看到任务的延迟和其他一些状态。

结论

TiDB和TiSpark一起为OLTP和OLAP工作负载提供了一个可伸缩的解决方案。TiDB和TiSpark已经被许多公司采用,并在许多应用场景中运行良好。此外,TiDB和TiSpark还为我们的工程团队降低了运营开销和维护成本。TiDB项目具有巨大的潜力,我们希望它在全球得到更多的采用,并成为每个公司基础设施的关键部分。

本文最初发表于Datanami

准备好开始使用TiDB了吗?