TiDB 在 Ping++ 金融聚合支付业务中的实践

Ping++ 介绍

Ping++ 是国内领先的支付解决方案 SaaS 服务商。自 2014 年正式推出聚合支付产品,Ping++ 便凭借“7行代码接入支付”的极致产品体验获得了广大企业客户的认可。

如今,Ping++ 在持续拓展泛支付领域的服务范围,旗下拥有聚合支付、账户系统、商户系统三大核心产品,已累计为近 25000 家企业客户解决支付难题,遍布零售、电商、企业服务、O2O、游戏、直播、教育、旅游、交通、金融、房产等等 70 多个细分领域。

Ping++ 连续两年入选毕马威中国领先金融科技 50 强,并于 2017 成功上榜 CB Insights 全球 Fintech 250 强。从支付接入、交易处理、业务分析到业务运营,Ping++ 以定制化全流程的解决方案来帮助企业应对在商业变现环节可能面临的诸多问题。

TiDB 在 Ping++ 的应用场景 - 数据仓库整合优化

Ping++ 数据支撑系统主要由流计算类、报表统计类、日志类、数据挖掘类组成。其中报表统计类对应的数据仓库系统,承载着数亿交易数据的实时汇总、分析统计、流水下载等重要业务:

随着业务和需求的扩展,数仓系统历经了多次发展迭代过程:

  1. 由于业务需求中关联维度大部分是灵活多变的,所以起初直接沿用了关系型数据库 RDS 作为数据支撑,数据由自研的数据订阅平台从 OLTP 系统订阅而来。
  2. 随着业务扩大,过大的单表已不足以支撑复杂的查询场景,因此引入了两个方案同时提供数据服务:ADS,阿里云的 OLAP 解决方案,用来解决复杂关系型多维分析场景。ES,用分布式解决海量数据的搜索场景。
  3. 以上两个方案基本满足业务需求,但是都仍存在一些问题:

    • ADS:一是数据服务稳定性,阿里云官方会不定期进行版本升级升级过程会导致数据数小时滞后,实时业务根本无法保证。二是扩容成本,ADS 为按计算核数付费,如果扩容就必须购买对应的核数,成本不是那么灵活可控。
    • ES:单业务搜索能力较强,但是不适合对复杂多变的场景查询。且研发运维代价相对较高,没有关系型数据库兼容各类新业务的优势。

所以需要做出进一步的迭代整合,我们属于金融数据类业务,重要性安全性不能忽视、性能也得要有保障,经过我们漫长的调研过程,最终,由 PingCAP 研发的 TiDB 数据库成为我们的目标选型。

TiDB 具备的以下核心特征是我们选择其作为实时数仓的主要原因:

  • 高度兼容 MysqL 语法;
  • 水平弹性扩展能力强;
  • 海量数据的处理性能
  • 故障自恢复的高可用服务;
  • 金融安全级别的架构体系。

并追踪形成了以下数据支撑系统架构:

新的方案给我们的业务和管理带来了以下的提升和改变:

  • 兼容:整合了现有多个数据源,对新业务上线可快速响应;
  • 性能:提供了可靠的交易分析场景性能
  • 稳定:更高的稳定性,方便集群运维;
  • 成本:资源成本和运维成本都有所降低。

TiDB 架构解析及上线情况

TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 Newsql 数据库。从下图 Google Spanner 的理念模型可以看出,其设想出数据库系统把数据分片并分布到多个物理 Zone 中、由 Placement Driver 进行数据片调度、借助 TrueTime 服务实现原子模式变更事务,从而对外 Clients 可以提供一致性的事务服务。因此,一个真正全球性的 OLTP & OLAP 数据库系统是可以实现的。

我们再通过下图分析 TiDB 整体架构:

可以看出 TiDB 是 Spanner 理念的一个完美实践,一个 TiDB 集群由 TiDB、PD、TiKV 三个组件构成。

  • TiKV Server:负责数据存储,是一个提供事务的分布式 Key-Value 存储引擎;
  • PD Server:负责管理调度,如数据和 TiKV 位置的路由信息维护、TiKV 数据均衡等;
  • TiDB Server:负责 sql 逻辑,通过 PD 寻址到实际数据的 TiKV 位置,进行 sql 操作。

生产集群部署情况:

现已稳定运行数月,对应的复杂报表分析性能得到了大幅提升,替换 ADS、ES 后降低了大量运维成本。

TiDB 在 Ping++ 的未来规划

  1. TiSpark 的体验

TiSpark 是将 Spark sql 直接运行在分布式存储引擎 TiKV 上的 OLAP 解决方案。下一步将结合 TiSpark 评估更加复杂、更高性能要求的场景中。

  1. OLTP 场景

目前数仓 TiDB 的数据是由订阅平台订阅 RDS、DRDS 数据而来,系统复杂度较高。TiDB 具备了出色的分布式事务能力,完全达到了 HTAP 的级别。

TiKV 基于 Raft 协议做复制,保证多副本数据的一致性,可以秒杀当前主流的 MyCat、DRDS 分布式架构。且数据库的可用性更高,比如我们对生产 TiDB 集群所有主机升级过磁盘(Case记录),涉及到各个节点的数据迁移、重启,但做到了相关业务零感知,且操作简单,过程可控,这在传统数据库架构里是无法轻易实现的。

我们计划让 TiDB 逐渐承载一些 OLTP 业务。

对 TiDB 的建议及官方回复

  1. DDL 优化:目前 TiDB 实现了无阻塞的 online DDL,但在实际使用中发现,DDL 时生成大量 index KV,会引起当前主机负载上升,会对当前集群增加一定的性能风险。其实大部分情况下对大表 DDL 并不是很频繁,且时效要求并不是特别强烈,考虑安全性。建议优化点:

    • 是否可以通过将源码中固定数值的 defaultTaskHandleCnt、defaultWorkers 变量做成配置项解决
    • 是否可以像 pt-osc 工具的一样增加 DDL 过程中暂停功能
  2. DML 优化:业务端难免会有使用不当的 sql 出现,如导致全表扫描,这种情况可能会使整个集群性能会受到影响,对于这种情况,是否能增加一个自我保护机制,如资源隔离、熔断之类的策略。

针对以上问题,我们也咨询了 TiDB 官方技术人员,官方的回复如下:

  • 正在优化 Add Index 操作的流程,降低 Add Index 操作的优先级,优先保证在线业务的操作稳定进行。
  • 计划在 1.2 版本中增加动态调节 Add Index 操作并发度的功能
  • 计划在后续版本中增加 DDL 暂停功能
  • 对于全表扫描,认采用低优先级,尽量减少对于点查的影响。后续计划引入 User 级别的优先级,将不同用户的 Query 的优先级分开,减少离线业务对在线业务的影响。

最后,特此感谢 PingCAP 所有团队成员对 Ping++ 上线 TiDB 各方面的支持

✎ 作者:宋涛 Ping++ DBA

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图:提供一种方法顺序访问一个聚合对象中的每个元素,而又不想暴露该对象的内部表示。应用:STL标准库迭代器实现、Java集合类型迭代器等模式结构:心得:迭代器模式的目的是在不获知集合对象内部细节的同时能对集合元素进行遍历操作
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(BlockingIO):即传统的IO模型。(2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的N
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定义一系列算法,把他们封装起来,并且使他们可以相互替换,使算法可以独立于使用它的客户而变化。应用:排序的比较方法、封装针对类的不同的算法、消除条件判断、寄存器分配算法等。模式结构:心得:对对象(Context)的处理操作可
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下定义作用于这些元素的新操作。应用:作用于编译器语法树的语义分析算法。模式结构:心得:访问者模式是要解决对对象添加新的操作和功能时候,如何尽可能不修改对象的类的一种方
命令模式(Command)命令模式(Command)[Action/Transaction]意图:将一个请求封装为一个对象,从而可用不同的请求对客户参数化。对请求排队或记录请求日志,以及支持可撤消的操作。应用:用户操作日志、撤销恢复操作。模式结构:心得:命令对象的抽象接口(Command)提供的两个
生成器模式(Builder)生成器模式(Builder)意图:将一个对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。 应用:编译器词法分析器指导生成抽象语法树、构造迷宫等。模式结构:心得:和工厂模式不同的是,Builder模式需要详细的指导产品的生产。指导者(Director)使用C
设计模式学习心得《设计模式:可复用面向对象软件的基础》一书以更贴近读者思维的角度描述了GOF的23个设计模式。按照书中介绍的每个设计模式的内容,结合网上搜集的资料,我将对设计模式的学习心得总结出来。网络上关于设计模式的资料和文章汗牛充栋,有些文章对设计模式介绍生动形象。但是我相信“一千个读者,一千个
工厂方法模式(Factory Method)工厂方法模式(Factory Method)[Virtual Constructor]意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实力化延迟到子类。应用:多文档应用管理不同类型的文档。模式结构:心得:面对同一继承体系(Produc
单例模式(Singleton)单例模式(Singleton)意图:保证一个类只有一个实例,并提供一个访问它的全局访问点。应用:Session或者控件的唯一示例等。模式结构:心得:单例模式应该是设计模式中最简单的结构了,它的目的很简单,就是保证自身的实例只有一份。实现这种目的的方式有很多,在Java中
装饰者模式(Decorator)装饰者模式(Decorator)[Wrapper]意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。应用:给GUI组件添加功能等。模式结构:心得:装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口
抽象工厂模式(Abstract Factory)抽象工厂模式(Abstract Factory)[Kit]意图:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。应用:用户界面工具包。模式结构:心得:工厂方法把生产产品的方式封装起来了,但是一个工厂只能生产一类对象,当一个工厂需要生
桥接模式(Bridge)桥接模式(Bridge)[Handle/Body]意图:将抽象部分与它的实现部分分离,使他们都可以独立的变化。应用:不同系统平台的Windows界面。模式结构:心得:用户所见类体系结构(Window派生)提供了一系列用户的高层操作的接口,但是这些接口的实现是基于具体的底层实现
适配器模式(Adapter)适配器模式(Adapter)[Wrapper]意图:将类的一个接口转换成用户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。应用:将图形类接口适配到用户界面组件类中。模式结构:心得:适配器模式一般应用在具有相似接口可复用的条件下。目标接口(Targ
组合模式(Composition)组合模式(Composition)意图:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。应用:组合图形、文件目录、GUI容器等。模式结构:心得: 用户(Client)通过抽象类(Component)提供的公用接口统一
原型模式(Prototype)原型模式(Prototype)意图:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。应用:Java/C#中的Clonable和IClonable接口等。模式结构:心得:原型模式本质上就是对象的拷贝,使用对象拷贝代替对象创建的原因有很多。比如对象的初始化构
什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。