盖娅广告匹配系统(GaeaAD)用于支撑盖娅互娱全平台实时广告投放系统,需要将广告数据和游戏 SDK 上报的信息进行近实时匹配,本质上来说需要实时的根据各个渠道的广告投放与相应渠道带来的游戏玩家数据进行计算,实现广告转化效果分钟级别的展现及优化。

初期的 MySQL 存储方案

在系统设计之初,基于对数据量的预估以及简化实现方案考虑,我们选用了高可用的 MySQL RDS 存储方案,当时的匹配逻辑主要通过 SQL 语句来实现,包含了很多联表查询和聚合操作。当数据量在千万级别左右,系统运行良好,基本响应还在一分钟内。

遭遇瓶颈,寻找解决方案

然而随着业务的发展,越来越多游戏的接入,盖娅广告系统系统接收数据很快突破千万/日,高峰期每次参与匹配的数据量更是需要翻几个番,数据库成为了业务的瓶颈。由于此时,整个技术架构出现了一些问题:

  1. 单次匹配耗时已从原本的 10 秒左右增加到 2 分钟以上,最慢的聚合查询甚至达到 20 分钟,时效性受到严重挑战。而且 MySQL 的问题是查询的时间随着数据量的增长而增长,以至于数据量越大的情况下查询越慢。

  2. 随着历史数据的积累,单表数据很快达到亿级别,此时单表的读写压力已经接近极限。

  3. 由于第一点提到的查询性能问题以及单机的容量限制,需要定时删除数据,对于一些时间跨度较长的业务查询需求没法满足。

根据数据量的增长情况来看,分布式数据库会是很好的解决方案。首先考虑的是业务的垂直及水平拆分或者基于 MySQL 的数据库中间件方案和一些主流的 NoSQL 方案。

但是仔细评估后,最先排除掉的是业务水平拆分的方案,因为业务逻辑中包含大量的关联查询和子查询,如果拆表后这些查询逻辑就没有办法透明的兼容,而且是比较核心的业务系统,时间精力的关系也不允许整体做大的重构。中间件的问题和分库分表的问题类似,虽然解决了大容量存储和实时写入的问题,但是查询的灵活度受限,而且多个 MySQL 实例的维护成本也需要考虑。

第二个方案就是采用 NoSQL,因为此系统需要接收业务端并发的实时写入和实时查询,所以使用类似 Greenplum,Hive 或者 SparkSQL 这样的系统不太合适,因为这几个系统并不是针对实时写入设计的, MongoDB 的问题是文档型的查询访问接口对业务的修改太大,而且 MongoDB 是否能满足在这么大数据量下高效的聚合分析可能是一个问题。

所以很明显,我们当时的诉求就是能有一款数据库既能像 MySQL 一样便于使用,最好能让业务几乎不用做任何修改,又能满足分布式的存储需求,还要保证很高的复杂查询性能。

当时调研了一下社区的分布式数据库解决方案,找到了 TiDB 这个项目,因为协议层兼容 MySQL,而且对于复杂查询的支持不错,业务代码完全不用修改直接就能使用,使迁移使用成本降到极低。

技术转身,使用 TiDB

在部署测试的过程中,我们使用 TiDB 提供的 Syncer 工具将 TiDB 作为 MySQL Slave 接在原业务的 MySQL 主库后边观察,确保读写的兼容性以及稳定性,经过一段时间观察后,确认读写没有任何问题,业务层的读请求切换至 TiDB,随后把写的流量也切换至 TiDB 集群,完成平滑的上线。

GaeaAD 系统从 2016 年 10 月上线以来,已经稳定运行了一季度多,结合实际的使用体验,我们总结了 TiDB 带来的收益,主要有以下几点:

  1. 用 3 个节点组成的 TiDB 集群替换了原先的高可用 MySQL RDS 后,同样数据量级下,单次匹配平均耗时从 2 分钟以上降到了 30 秒左右,后续随着 TiDB 工程师的持续优化,达到了10 秒左右。另外,我们发现,TiDB 在数据规模越大的情况下,对比 MySQL 的优势就越明显,应该是 TiDB 自研的分布式 SQL 优化器带来的优势。不过在数据量比较轻量的情况下,因内部通信成本,优势相比 MySQL 并不明显。

TiDB 与 MySQL 在不同数据量下的查询时间对比

  1. TiDB 支持自动 Sharding,业务端不用切表操作,TiDB 也不需要像传统的数据库中间件产品设定 Sharding key 或者分区表什么的,底层的存储会自动根据数据的分布,均匀的分散在集群中,存储空间和性能可以通过增加机器实现快速的水平扩展,极大地降低了运维成本。

  2. TiDB 支持在线不中断的滚动升级,至今直接在线升级已有 10 余次左右,没出现过一起导致线上服务中断的情况,在可用性上体验不错。
    4、TiDB 支持和 MySQL 的互备,这个功能很好的解决了我们业务迁移时候的过渡问题。

当前我们正在着手把 storm 集群上的 BI 系统的实时计算业务的数据存储系统从 MongoDB 替换成 TiDB(因 MongoDB 的使用门槛相对较高,运维成本大,查询方式不如传统的 SQL 灵活),后续也计划把实时性要求高、数据存储量大且存储周期较长的业务都迁移到 TiDB 上来,看上去是一个比较合适的场景。

  • TiDB 工程师点评

盖娅的业务使用 TiDB 做了如下优化:

  1. 支持更多表达式下推,充分利用 TiKV 多实例的计算资源,加快计算速度;同时也尽可能将不需要用到的数据过滤掉,减小网络传输。

  2. TiDB 默认支持 HashJoin,将算子尽可能并行化,能够利用整个集群的计算资源。

  3. TiDB 采用流水线的方式读取数据,并且优化过 IndexScan 算子,降低整个流程的启动时间。

作者简介:刘玄,盖娅互娱数据平台高级开发工程师,主要负责实时数据业务和数据流方向。毕业于湖南大学软件工程系,曾任百度高级运维工程师,负责大搜建库运维。

日均数据量千万级,MySQL、TiDB 两种存储方案的落地对比相关推荐

  1. Mysql的两种存储引擎以及区别

    一.Mysql的两种存储引擎 1.MyISAM: ①不支持事务,但是整个操作是原子性的(事务具备四种特性:原子性.一致性.隔离性.持久性) ②不支持外键,支持表锁,每次所住的是整张表     MyIS ...

  2. mysql千万级数据怎么删除,MySQL 快速删除大量数据(千万级别)的几种实践方案详解...

    这篇文章主要介绍了MySQL 快速删除大量数据(千万级别)的几种实践方案详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 笔者 ...

  3. mysql的两种存储方法_mysql的两种存储引擎

    背景 最近在使用spring-data-jpa操作mysql,在使用jpa的自动建表功能之后,处理多对多关系@ManyToMany的时候,spring-data-jpa会给中间表的两个字段都加上外键引 ...

  4. python医药数据_采集万方医药方向的期刊+文章+作者信息(数据量千万级)

    最近将万方数据的爬取代码进行了重构,速度大概有10w每小时吧,因为属于公司项目,代码暂时就不开源了,所以在这里先说说思路和一些注意事项吧,顺带吐槽一下万方. 先上图: 其实逻辑也蛮简单的,医学类的期刊 ...

  5. 数据库面试题【二、MYSQL的两种存储引擎区别(事务、锁级别等等)】

    引擎 特性 MYISAM 不支持外键,表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描 INNODB 支持外键,行锁,查表总行数时,全表扫描

  6. mysql存储引擎的区别_Mysql的两种存储引擎以及区别

    一.Mysql的两种存储引擎 1.MyISAM: ①不支持事务,但是整个操作是原子性的(事务具备四种特性:原子性.一致性.隔离性.持久性) ②不支持外键,支持表锁,每次所住的是整张表 MyISAM的表 ...

  7. mysql like 多个条件_千万级MySQL数据库这样建索引可以让你的数据库飞起来.........

    创建索引常用规则 1.表的主键.外键必须有索引: 2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段 ...

  8. Mysql使用binlog恢复数据解决误操作问题的两种方法

    Mysql使用binlog恢复数据解决误操作问题的两种方法 参考文章: (1)Mysql使用binlog恢复数据解决误操作问题的两种方法 (2)https://www.cnblogs.com/Data ...

  9. mysql数据存储方式_数据存储在mysql的两种方式

    数据存储在mysql的两种方式 发布时间:2020-05-12 16:16:25 来源:亿速云 阅读:250 作者:三月 下文主要给大家带来数据存储在mysql的两种方式,希望这些内容能够带给大家实际 ...

最新文章

  1. React接入Sentry.js
  2. node 压缩图片_1Mb压缩成100k,图片无损压缩我选择它
  3. exchange server 2003 错误处理
  4. HealthKit开发快速入门教程之HealthKit开发概述简介
  5. python爬虫框架排行榜-8个最高效的Python爬虫框架,你用过几个?
  6. ProxySQL 故障
  7. CSS_伪元素_伪类
  8. 继承属性public private
  9. RocketMQ 错误:The broker does not support consumer to filter message by SQL92
  10. VBS的疑惑,它们不考虑效率吗?
  11. pyqt 取鼠标处文字_顶级玩家首选 赛睿QcK Edge鼠标垫体验评测
  12. Wirkshark表达式
  13. 树莓派_配置交叉编译环境
  14. [MATLBA]imresize函数的用法
  15. c++排序函数_Excel的排名函数rank,不得不说好用
  16. tableau学生版注册流程
  17. premiere pr 裁剪视频音频
  18. av_rescale_q
  19. Dalvik字节码和Smali基本语法
  20. GRUB的menu.lst的写法

热门文章

  1. OpenCV3学习(11.6) ORB特征检测器及BRIEF描述符
  2. 7-64 计算平均成绩 (15 分)
  3. python设计---空域增强之图片去噪(中值滤波、均值滤波、高斯滤波、双边滤波)
  4. 微信 账户升级服务器地址,微信支付商户平台账户升级后有哪些新功能呢?
  5. router锚点和html锚点,react-router 环境使用锚点的方法
  6. 2019.7.17刷题统计
  7. 只读数据文件损坏恢复
  8. 如何查看 mysql 的视图?
  9. idou老师教你学Istio 07: 如何用istio实现请求超时管理
  10. [BZOJ 4571][Scoi2016]美味(主席树)