作者介绍
陈培新,参与国信证券基础平台研发工作(DevOps、微服务治理、Serverless)
从 0 到 1,国信金太阳引入 TiDB 图:国信金太阳数据服务架构 图:账单 1.0 单库单表实现方式 这种方式面临的问题是:业务上,用户希望查询更长时间的数据,比如五年,使用单表的话,这个需求是难以满足的。技术上,数据查询以及后续的更新压力大,难以扩展,有时候会出现数据更新出错,第二天用户来查询的时候,查到的数据就不准确了。为了应对这些业务和技术难点,国信在账单 2.0 版本使用 sharding-jdbc 来做分库分表。在引入这个技术的时候,我们也听说了 TiDB,考虑到证券业务对稳定性要求较高,当时对 TiDB 稳定性还有一定的担忧,所以选择了 sharding-jdbc。做了分库分表之后,可以支持 5 年帐单的查询,使用了 16 台 MySQL,总共分了 512 张表。数据中心与分库分表是如何进行同步的?数据中心还是和以前每天一样,先把数据写到临时表,转换服务会配置分库分表的规则,从临时表里面取数据,最后写到正式表里面。数据中心有个 ETL 工具,但是它不支持扩展,所以就没有直接写入到正式表。 图:账单 2.0 分库分表实现方式 大概跑了两年时间,我们发现了新问题,分库分表虽然可以满足业务需求,但在扩展性方面有很大的约束,这些约束包括:第一,字段扩展困难,我们分了 512 张表,如果要有新业务上来,需要新增一个字段,这个时候 DBA 就会很痛苦,需要到每个分表新增字段。第二,扩容极其麻烦,数据一开始预估不准确的话,后面分库分表的规则就一定要变,从一开始 512 张表要变到再乘以 2,变到一千多张表,DBA 迁移的工作非常繁杂,而且很容易出错。第三,同步还需要中间表,所以数据同步的时间也还是一样的慢,并且制约系统上线时间。第四,分表的定时创建跟清理也比较繁琐,每天会将一些日表删掉,比如五年前的表,然后还要去创建第二天的表,在开发的时候,始终是要使用这个定时器来做清理和创建。第五,运维方面,也要运维多个数据库。 图:账单 3.0 TiDB 分布式数据库实现方式 接下来谈谈一年多来 TiDB 相关的使用心得。从开发角度来看,首先是大数据量删除,一开始没有经验,还是按照以前老的套路,比如要删除指定某一天的数据,直接就是 DELETE SQL WHERE = “某一天”,当时是周六,运维告警显示 TiDB 的机器依次逐个地挂掉,经排查发现是 DELETE SQL 涉及的数据量太大了。后续把事务大小调到 10G,TiDB 机器的内存扩展到 64G,这部分是系统层面的扩展;另外一方面我们也在应用程序侧做对应改造,进行分批的删除。在有大数据删除的情况下,可考虑使用 Range 分区表,直接 truncate 或 drop 分区即可。 第二个经验是对新上 TiDB 的业务,尽量要使用 AUTO-RANDOM 作为主键,对那种持续大量的插入场景,很大情况下可以避免插入的热点。对于多机房数据同步,TiDB 需要主键或者唯一索引,无主键或者唯一索引会造成同步程序的 OOM。在表已有大量数据的时候,如果要加这个主键,整个过程也会比较麻烦。 三地高可用容灾架构的实现 一开始只在国信东莞主机房作为试点去做 TiDB 的部署,后续运维要求 TiDB 要做容灾部署相关的工作,应用要实现三地的高可用多活。之前每个机房的应用是访问自己本地的 TiDB ,每个季度会做灾备演练,验证东莞整个主机房故障之后,异地上海与同城福田灾备的可用性。 PingCAP 的老师一开始给了三个方案。第一个方案是最简单直白的,在三个机房都部署一套单独的 TiDB 集群。东莞机房做读写,用 TiCDC 或者 binlog 将对应的数据同步到其他两个机房的灾备集群。这个方案的优点是比较简单,做灾备演练的时候,如果东莞主机房挂了,其他两个机房的应用基本上不用做什么操作,还是可以继续使用。这个方案存在问题是副本数比较大,需要有 9 个副本,同步的时延可能也会大一点。 图:多机房方案对比 经过三个方案的对比,最后国信还是采用了最简单的 binlog 同步方案,每个机房部署一个 TiDB 集群,当然这也是根据业务特点来实现的。国信的业务基本上使用查询,不会存在多个机房同时写入,所以最后采用了这个最简单的方法。在多机房部署实现的过程中做了一些迁移导入的工作:一开始 TiDB 只在东莞机房部署,因为对于 TiDB 的使用不熟悉,有一些业务表是没有加主键或者没有唯一索引。福田机房搭建新的 TiDB 集群之后,我们发现在做两地集群同步的时候,同步器就直接 OOM 了,这是因为没有加主键或唯一索引导致的。当时有一张最大的表已经到 60 多亿了,如果直接在表上加主键或者唯一索引的话其实是不可能的。 服务可观察的探索 最后谈谈在金太阳服务可观察方面的探索。应用在使用了微服务架构之后,部署的节点会非常多,而且调用链整个过程也非常复杂,这个时候想定位一个问题就会很复杂,根据业界当前比较流行的 “服务可观察” 概念我们做了一个应用来辅助开发的问题定位。这个 “服务可观察应用” 主要是包含三个部分,一个是日志,第二个是指标,最后一个是跟踪链。我们针对日志部分做了增强,把系统的请求和响应日志通过 ETL 工具转换到 TiDB 里面,然后做了可视化相关的工作。 图:金太阳服务的可观察性
2023-07-18 PingCAP发布了 《时刻领先丨PingCAP 用户峰会 2023 圆满收官》的文章
2023-02-13 PingCAP发布了 《促进关键软件高层次人才培养:平凯星辰与华东师范大学签订联合博士培养合作协议》的文章
2023-01-10 PingCAP发布了 《同盾科技 x TiDB丨实时数据架构为风控智能决策保驾护航》的文章
2022-12-09 PingCAP发布了 《PingCAP 成为中国唯一入选 Forrester Wave 数据库厂商,被评为卓越表现者》的文章
2022-12-09 PingCAP发布了 《案例故事丨老虎国际 x TiDB ,降低架构复杂性,保障全球用户安全可靠投资》的文章