做者介绍:康文权,立刻消费金融总帐高级研发工程师。数据库
李银龙,原腾讯云运维工程师,立刻消费金融容器云 TiDB 负责人,西南区 TUG Leader。安全
立刻消费金融于 2015 年 6 月营业,截止到 2020 年 1 月,历经 4 年多风雨,总注册用户数 8000 万,活跃用户数 2500 万,累计放贷 2900 多亿元人民币。公司于 2018 年 6 月增资到 40 亿,成为内资第一大的消费金融公司。服务器
在业务爆发式增加的 4 年多里,立刻消费金融的数据库经历了从单表数十 GB 到数百 GB 的过程,单表的数据量正在往 TB 级别演进。基于数据量的升级变迁,咱们的数据库也经历了 2 次架构迭代,并在探索网络
第三代数据库架构:架构
截止目前帐务系统的核心表累计数据量已达到单表 15 亿行以上,还在高速增加中。监管要求金融行业历史数据至少保留 5 年以上。这给数据库系统带来了巨大挑战:并发
根据立刻金融的经验,MySQL 单表在 5000 万行之内时,性能较好,单表超过 5000万行后,数据库性能、可维护性都会极剧降低。当咱们的核心帐务系统数据库单表超过 100GB 后(截止 2018 年 10 月该表累计已达到 528GB),经技术架构团队、业务需求团队联合调研后,选择了 sharding-jdbc 做为分库分表的技术方案。运维
此方案的优势很是明显,列举以下:异步
可是,此方案的缺点也很是明显:分布式
对超过帐务系统的 528GB 大表分库表成 16 张表以后,每张表有 33GB,仍然是大表。咱们采用了 gh-ost 工具进行加字段 DDL 操做,可是,业务仍然会有轻微感知。所以,必需要将大表的 DDL 操做放到凌晨来作,对业务的 7*24 小时服务有较大限制。高并发
MySQL 的集群基于 Binlog 主从异步复制来作,切集群主从角色以 instance 为单位,很是僵化。一旦主库出现故障,须要人工重建 MySQL 集群主从关系(也能够把人工操做落地成程序,好比 MHA 方案),截止目前(2020 年 1 月)原生 MySQL 仍然没有成熟可靠基于 Binlog 异步复制的 HA 方案。基于 Binlog 异步复制的 MySQL 主从架构实现金融级高可用有其本质困难。
基于立刻金融第二代数据库架构的核心痛点,咱们须要探索新的数据库技术方案来应对业务爆发式增加所带来的挑战,为业务提供更好的数据库服务支撑。
恰逢 NewSQL 愈渐火热,引发了咱们的极大关注。NewSQL 技术有以下显著特色:
在帐务系统研发团队、公共平台研发团队、DBA 团队等联合推进下,咱们开始对 NewSQL 技术进行调研选型。
在 GitHub的活跃度及社区贡献者方面,TiDB 与 CockcoachDB(CRDB) 都是国际化的全球开源级项目,是 NewSQL 行业中的表明性产品。
因为立刻金融的应用绝大部分对 MySQL 依赖较高,在协议兼容性方面,咱们毫无疑问地将 MySQL 兼容性列为必选项。
TiDB 从项目发起之初就将 MySQL 协议兼容性列为最 basic 的战略目标之一。而 CRDB 在项目发起之初,考虑的是兼容 PostgreSQL 协议。
基于此,咱们优先选择了 TiDB 技术产品。
立刻消费金融帐务系统归档项目是公司第一个持续实践 TiDB 的项目,也是第一个对 NewSQL 技术提出迫切需求的项目,上线后 TiDB 架构以下:
上游分库分表的 8 套 MySQL 集群经过 DM 聚合到一套 TiDB 里,TiDB 对外提供历史归档大表查询服务。
应用架构关键机制:
经过熔断机制可确保万一 TiDB 出现异常时,能快速恢复业务,确保业务的可用性。
帐务 TiDB 集群天天业务高峰期将会承载约 1.3 万 QPS 的请求量(以下图所示),在作活动期间,请求量能冲击到近 3 万 QPS。
通过接近 1 年的不断优化提高,TiDB 集群表现愈来愈稳定,大部分请求能在 50ms 内返回:
研发同事对 TiDB 的 Latency 与 TPS 的性能表现比较满意。
在 2019 年 4 月,帐务系统 TiDB 项目已将 MySQL 数据库 2018 年之前的历史数据删除。极大地下降了帐务系统 8 套 MySQL 数据库集群的 IO 压力。这部分历史数据仅保存在 TiDB 集群内,对业务提供实时查询支持。
立刻消费金融总帐项目是公司第一个彻底运行在 TiDB 的项目,也是第一个从项目上线之初就放弃 MySQL,坚决不移选择 TiDB 的项目。
总帐项目部分模块关键流程示意图以下:
立刻消费金融总帐项目是公司第一个彻底运行在 TiDB 的项目,也是第一个从项目上线之初就放弃 MySQL,坚决不移选择 TiDB 的项目。
总帐项目部分模块关键流程示意图以下:
TiDB 是分布式 NewSQL,计算与存储分离,且计算节点与存储节点都具有水平扩展能力,特别适用于总帐项目的大数据量、大吞吐量、高并发量场景。
项目上线已稳定运行半年左右,目前集群规模以下:
总帐项目目前完成了第二期开发,随着项目的继续发展,将来第三期的 ngls 正式接入后,数据量与并发量将再次成倍增加。
总帐项目上线后,跑批期间 QPS 以下:
跑批期间的 SQL 响应时间以下:
跑批期间的 TiKV CPU 使用率以下:
跑批期间事务量与性能以下:
TiDB 是一个新潮的 NewSQL 数据库。想要将 TiDB 运用到生产环境,解决 MySQL 数据库面临的历史难题(而不是把问题搞得更大),并非一件简单的事情。
时至今日(2020 年 1 月 14 日),TiDB 已经在数千家企业有实践经验,其中不乏大型银行核心系统 TiDB 实践经验。且 TiDB 3.0 GA 以后,TiDB 在性能、稳定性方面比起以前版本都有了很大的提高。
这意味着已经有数千家企业在向 PingCAP 官方反馈 TiDB 的各类问题并持续获得修复。在这样的背景下,TiDB 能在生产环境中稳定运行并持续为企业创造价值已经是毋庸置疑。
对于企业而言,当前的关注焦点可能再也不是 TiDB 是否稳定可靠,而是怎么才能快速获取到 TiDB 的最佳实践经验,将其归入企业基础技术栈以内。
那么,如何才能快速实践 TiDB,积累到第一手经验,使企业尽快享受到 TiDB 带来的福利呢?
建议从两个方面切入:
从咱们过去近两年实践经验看,TiDB 是否能在生产环境运行稳定,硬件规划是相当重要的先决条件之一。其中,硬件规划最重要的环节包括两个:
tidb-server 优化经验
tidb-server 可能发生性能异常的地方主要是 CBO 统计信息失效问题与索引设计不合理问题。这两个点并不是 TiDB 独有的问题,MySQL、Oracle 等也有相似的问题。对于前者,建议对关键表定时作 analyze,以确保统计信息准确性。而索引相关的问题,根据常见的数据库优化技巧处理便可。从 3.0 版本开始,TiDB 支持 SQL 查询计划管理功能(SQL Plan Management),对这类问题提供了另外一套解决方案。
tikv-server 优化经验
TiKV 第一个最多见的问题是内存消耗过多被 OOM kill 的问题。TiDB 3.0 之后对 TiKV 内存配置作了优化,官方推荐将 block-cache-size 配置成 TiKV 实例占据总内存的 40%,咱们在实践中发现,40% 的参数值在数据库压力极大的状况下仍然可能会出现 OOM 现象,须要基于 40% 继续往下调整才能找到与业务场景真正匹配的参数值。
TiKV 另一个问题是乐观锁适配问题。Oracle、MySQL 采用悲观锁模型,事务在作变动以前须要获取到行锁,而后才能作变动,若是没有获取到行锁,则会排队等待。而 TiDB则相反,采用乐观锁模型,先更新记录,在提交事务时,再作锁冲突检测,若是冲突了,则后提交事务的会话会报错 Write Conflict 错误引发应用程序异常。这个错误须要从 2 个方向进行处理。在 TiDB 3.0 版本下,默认关闭了事务提交重试功能,须要手工设置 tidb_disable_txn_auto_retry 参数,才能打开事务失败重试功能。另外,TiDB 的乐观锁模型决定了其不擅长处理事务冲突较大的场景,好比典型的“计数器”功能,这类场景最好将技术器功能放到第三方软件来实现会比较合适(好比 Redis)。另外,从 3.0 版本开始,TiDB 已经开始支持悲观锁功能,这个功能预计在 4.0 GA,咱们也开始了这一块的测试工做。
DM 实践经验
到目前为止(2020 年 1 月 14 日),DM 仍然没有发布高可用机制版本,官方正在紧锣密鼓实现高可用机制,咱们建议将 TiDB 用作归档场景做为实践 TiDB 的起点,而不将其做为最终的目标。实践 TiDB 的目标是将 TiDB 做为对前台应用提供 OLTP 服务的数据库。
使用 DM 的关键是有效规避 MySQL 到 TiDB 同步的异常问题,使同步能持续稳定运行。对于刚接触 TiDB 的同窗而言,建议从最简化的方式使用 DM:
TiDB 热点数据优化实践经验
TiDB 根据表主键 ID 作 range 分区,将数据拆分到各个不一样的 region 内。当某个 region 的数据量达到最大 size 限制后,将会进行分裂。感性来看,一旦某个 region 分裂成两个 region 后,读写压力也会拆分到两个不一样的 region。可是,假设一种场景,当咱们不断对一张表进行 insert 操做,并且这张表是自增主键。那么,应用插入的数据永远会落在该表 range 范围最大的 region,永远处于“添油战术”的状态,最大 range 范围的 region 所在的 TiKV 实例一直处于高负载,整个 TiKV 集群的压力没法均摊下去,出现瓶颈。
这类场景在跑批应用中比较常见。咱们的优化实践建议以下:
经过以上两种机制能确保批量 insert 操做的写压力随机分摊到各个 region 中去,提高整个集群的吞吐量。
关于 Cloud TiDB 技术方向引子
坊间传言咱们是国内第一家将全部 TiDB 都运行在 Kubernetes 容器云上的(金融)企业。咱们地处西南,平日疏于与业界优秀数据库同行交流心得,是否第一不得而知,但咱们的 TiDB 确实都运行在 Kubernetes 容器云上。
将 TiDB 所有运行到容器云上主要是为了提高软件部署密度,充分利用服务器硬件资源,为往后大规模部署 TiDB 集群打下基础。
根据咱们的实践经验,基于物理服务器部署 TiDB 集群,至少 6 台物理服务器( pd-server 与 tidb-server 混合部署)起才能部署好一套生产环境 ready 的集群。
当咱们将 TiDB 所有迁移到容器云平台后,最小 TiDB 集群资源从 6 台服务器下降成了 2 pods tidb-server、3 pods pd-server、3 pods tikv-server,硬件成本下降为原来的 30% 左右。
到目前为止,咱们对 TiDB 技术的储备已经持续了近 2 年时间。咱们积累了帐务归档、总帐跑批等大数据量、高并发量的 TiDB 实践经验。咱们还将全部 TiDB 运行到了 Kubernetes 容器云平台之上,使数据库真正得到了 Cloud-native 能力。
将来,咱们将探索更多适用于 TiDB 的核心业务场景,提高 TiDB 在公司内基础技术栈的覆盖面,尤为对 TiDB 即将正式推出的 True HATP 功能充满了期待。咱们将继续深度使用 TiDB,使其为消费金融行业赋能增效增效,共同创造更深远的社会价值。