买单侠数据库架构之路

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 在2017杭州云栖大会阿里云HTAP技术专场上,上海秦苍信息科技有限公司DBA负责人赵怀刚为大家分享了HTPA型数据库产品在现实中的落地应用以及企业级数据库架构设计中的HTPA的应用。
摘要:在2017杭州云栖大会阿里云HTAP技术专场上,上海秦苍信息科技有限公司DBA负责人赵怀刚为大家分享了HTPA型数据库产品在现实中的落地应用以及企业级数据库架构设计中的HTPA的应用。

本文内容根据嘉宾演讲视频以及PPT整理而成。

本次分享的主题是买单侠数据库架构之路。秦苍科技是一家互联网消费金融公司,我们所有的产品基本都是托管在阿里云上的,在自己的系统中大概应用了20多种阿里云数据库产品。基于阿里云平台,秦苍科技的数据库架构与传统RDS数据运维相比存在着本质的区别。接下来着重介绍一下在产品公司业务快速发展的情况下,系统数据库架构的演变历程。

本次分享的主题主要分为以下四个部分:
一、关于秦苍科技
二、在业务的快速发展中遇到的问题
三、数据库架构演变过程和案例分析
四、基于云数据库运维的思考

一、关于秦苍科技

如图所示的是秦苍科技的两个产品,最左边叫做买单侠,主要针对的是年轻蓝领客户群体,主要提供一些消费场景下的分期金融服务。右边这个产品主要目标用户群体是年轻的女性白领,主要为她们提供一些医疗美容的消费分期金融服务。目前秦苍科技公司的用户数大概为400多万,每个月新增大概20万用户,每天日活用户大概是在百万左右。秦苍科技目前做单的模式并没有完全放在线上,还是偏传统一点,会与线下的手机门店、医院、电动车销售商等这些商家合作,通过线下入口而不是直接通过APP进行操作,所以可以说秦苍科技的商业模式还是比较偏传统的。
be48f52344d6b916c7fb6a9210fa99fc2534e345
如图所示的是秦苍科技的技术栈,主要是用的后台技术是基于Spring Cloud的微服务架构,部署则采用的是Docker技术,当然用的也是阿里云的容器服务。
5531ace651b0f48151b4fd9b443d16dc5f69420c
秦苍科技公司成立于2014年3月,到现在大概经历了三年半的时间,目前大概遍布了全国的300个城市。系统最开始的数据库是单体架构的,所有东西都放到一起。而现在数据库有将近200个,并且对于数据库也做了拆分,目前线上的数据量已经达到了3 TB。    
63f467e758f9a8e75d407388db8b3a6235501921
目前所使用的数据库架构主要采用了阿里云RDS。秦苍科技所处的是一个互金行业,所以会从一些第三方数据源那里拿数据,并与资方做交互。这些数据的变更可能比较频繁,需要依赖于第三方。对于这些数据而言,我们采取MongoDB进行存储,缓存层采用阿里云的Redis,总体而言都是采用阿里云RDS服务。  
5b928c8867c6b5366490c07c4a1e3d72179e6cf9
互金行业核心就是风控,秦苍科技自研了一个风控模型,这个模型叫做抱团算法,接下来大概简单介绍一下它的实现。什么是抱团呢?比如你的身边有十个朋友,如果十个朋友当中有八个朋友信用都存在问题,或者之前发生过借贷关系,但信用不是太好,就会认为你这个人有可能信用上存在问题。这个风控模型的后台采用的是neo4j图数据库集群,目前RDS的规模大概在150个MySQL、20多个MongoDB以及20个Redis。刚开始的时候采取.Net + SQL server构建的,后来把数据从SQL server迁移到了MySQL,这是因为在使用SQL server的过程当中遇到很多问题,SQL server目前不支持只读实例,在扩展性和灵活性上对业务造成了很大困扰。因为数据中心需要做数据分析,要从线上取数据,这样OLTP以及一些分析的提取都耦合不到一起。

二、在业务的快速发展中遇到的问题

数据库架构演变的过程当中遇到了很多问题,所以秦苍科技的所有的技术全部选择都是在阿里云上的,包括了对于数据库的选择。使用阿里云RDS比较直接的好处就是它可以开箱即用并且可以弹性扩容。随着业务量的增加,可以轻松地升级,比如硬件上的升级,以及外围辅助的升级,还可以非常方便地实现数据迁移,后来阿里云还提供了DTS服务,可以轻松实现异构数据迁移。最初因为设计的问题,所有的数据是放在同一个实例库下,所以当出现比较高的并发时就会导致实例的CPU爆掉,进而导致数据库服务不可用。这就是所面临的问题,也是这两年时间一直在做的事情——迁移、解耦和拆分。
7b8854276971824bd25d84dded39d47b92d6775f
在这个过程中,我们遇到了异构数据迁移的问题。另外随着公司业务的发展,规模的不断变大,在整个数据库运维当中出现了效率上的问题,主要是现在有大量的SQL审核工作要做,而且有频繁的生产发布,而每次发布都要等到比较晚的时间比如业务的低谷期来发布。还有一些高频的数据查询和变更需求。主要是研发同学需要去定位Bug要获取一些数据,以上这些就是之前面临的一些问题。在开始数据规模比较小的时候使用的是比较粗暴的做法也就是人肉支撑。当发展到现在的量级,现在有3个研发中心,300多个研发同学,而DBA只有四个人,需要从DevOps角度考虑如何去支撑这么多的用户。  

三、数据库架构演变过程和案例分析

如图所示是秦苍科技最早数据库的架构设计,是一个比较简单的单体架构,all in one,所有数据全部放在一个库里,可能有好几百张表。而且随着数据量的增加,OLTP都达到千万级,对于数据可用性就没法保障了。随着业务的发展,后台服务要进行微服务化架构,进行服务改造。数据库应该尽量配合后台进行微服务化的改造,这是需要思考的问题。如何进行微服务拆分呢?后来数据库团队也是在不断地摸索和思考这个问题,最后总结出拆分的大致思路,就是采取分组分层的方法,对于整个数据库进行架构的调整。
7e351865a6b1f31faf3cb1cdee7bd3e5ddb5aec1
分层就是根据业务的需求特征进行分类划分主题域,这有点像数仓分析建模的概念。我们会将数据库分成不同的层次,比如可以根据需求特征分为业务、平台等层次。分组就是对主题域数据进行进一步抽象和归纳,可以抽象出来很多的逻辑组,并将逻辑组再根据具体的功能模块进一步做拆分,这可能会包含多个实例或者多个库。而针对一些业务量特别大的场景,也有使用阿里云DRDS实现水平的分表分库方案。

在分组分层时,为了节省资源和方便管理,我们做了一个小技巧,就是把不同的数据库暂时放在同一个实例上,但数据库的账号却是完全隔离的,这个账号只拥有访问某些数据库的权限。刚开始时业务量比较小,所以基于成本的考虑会放到一起。随着业务量的增加,如果出现性能问题,就可以基于阿里云DTS数据迁移服务,把数据拆分开迁入到性能比较好的实例上去。
d3d1cf32291b325b5ab2ab5e704809e2da2f108b
基于上面分组分层的思想,出现了一个中间的过渡架构,这个架构也没有什么特别的,主要跟之前单体架构相比多了一个缓存层。之前的SQL Server不支持读写分离,全部迁入到MySQL之后就做了读写分离,来满足业务上读负载的瓶颈。再看一下如下图所示的现在的架构。根据业务的重要性,把整个系统分为两类,核心系统和外围系统。核心系统就是做单的系统,相当于大家到淘宝买东西,用户从商品选择到最后下单,整个流程走完是一个订单核心的系统。剩下的非做单系统,也就是大外围的系统。后台架构采用了分布式的微服务架构,服务的拆分粒度也比较细,但是这样也会遇到一些问题。
9b524cfe3e3d9d76dbe6cb217eadf412e84b4b4b
现在线上做单数据调用的服务,也会被用于分析的运营支撑系统调用,取用户订单相关信息要调多个服务,才能满足运营或分析的需求。这样,做单系统和运营支撑系统访问,数据层是耦合到一起的。于是,又找了一个折中的方法。这个折中的方法,就是选择HybirdDB,它就相当于一个大数据资源池,于是增加了Hybird DB作为数据的交换平台,主要提供核心系统和外围系统数据交换,内部叫做数据交换平台。
974eebf5b6301580fb5bd488f3fcd9906cc79fe9
数据交换平台会把所有线上数据进行汇总,这样一些外围系统或者非实时请求就可以通过访问数据交换平台获取数据,这样其实对于数据交换平台提出了很大的要求:首先这个平台需要足够的大,因为现在线上数据也有3 TB,RDS实例本身没法支撑到这么大的数据量。第二,要能够很好地进行水平拆分和扩展。此外,还要完全兼容MySQL的协议。于是我们选择了HybirdDB,它解决了大的数据资源池问题。
ee1ceae8e384c57f9bf6bea4a817fcf364b40c07

我们同时引入了阿里运数据管理的工具——DMS,主要解决了线上实时数据的查询问题,能够做到安全的管控。另外对大数据平台计算之后的数据也做了集中的管控,可以为线上提供一些数据支撑。


微服务分布式架构演变过程中少不了数据迁移,数据迁移必然会涉及到对老模型分析、新模型设计以及新老模型之间的映射和转码等问题,所以迁移之前要做好充分准备。首先要制定迁移总体方案,包括迁移准备、实施步骤、关键点控制、应急预案等。我们借助阿里云DRDS中间件实现对核心表的水平拆分,图中的虚线部分是预案,因为属于核心的系统,这里不能有太多停机时间,需要保证数据同步。在上线过程当中,借助阿里云DTS数据迁移和订阅服务大大降低了停机时间并实现了应急预案。

如图所示的是数据库的自动化部署。SQL脚本的部署借鉴了系统发布的思路,首先要有个思维上的转变,把SQL当做是代码的一部分来运维,即:SQL as code;研发设计好数据库后,会提交一个SQL request到gitlab代码仓库,DBA收到请求后做脚本的审核,通过后会把SQL代码merge到release分支(只能DBA merge),未通过的SQL DBA会备注审核建议后驳回到研发进行调整,调整后继续走刚才审核流程。数据库发布我们采用的是flyway,在部署服务时,首先会检测本次上线发布是否有数据库的变更,如果有的话就去执行,没有就跳过。如果在执行过程当中报错或者有问题,就会通知运维进行处理,但是这种机率很小,99%以上都会成功。目前阿里云DMS实现了一些自主化审核的功能,基于定义好的规范、规则进行自动化的审核,这样就可以把上面对人依赖的点解决掉。
defbc59fcfac2701bae8b48d11cf30151081998c
如图所示的是我们的监控,主要分为两个部分:对于基础资源的监控和数据的监控。基础资源的监控,是借助阿里云的监控实现的。阿里云的云监控支持短信、邮件等方式,但是不支持电话报警,所以我们又开发了自己一套电话报警机制。数据监控我们主要借助Zabbix对数据库的业务数据进行探测,如果发现异常之后会上报到电话报警平台,其也是一个第三方监控平台,它会电话通知到第一责任人。而且这个电话报警支持报警升级,如果接听人没有处理,就会打电话给负责人,使问题得到解决。上面两种监控都属于事中监控,事前监控现在比较传统主要靠DBA主动优化和巡检提前发现并解决。因为RDS会提供丰富的API,目前所有数据都可以通过API获取到,把这些数据丢到HybirdDB里进一步做分析,进行主动监控,目前我们正在尝试。
384df84f0deb7b0faa56f076c597c51a8c31f795

四、基于云数据库运维的思考


最后一部分是基于云数据库运维的思考。其实将所有的东西放在阿里云上使我们的工作发生了本质变化。第一个是工作前置化成为可能,使DBA向DA转变成为了可能,从之前数据库运维管理到数据的应用。向数据生命周期管理的方向靠拢是目前一个工作重心,系统有生命周期,数据一样也应该有生命周期。数据的生命周期从最初的设计到发布、维护,再到下线。而现在好多数据在设计时没有考虑它的生命周期,数据很难产生最大价值,如果把一个比较小的系统设计成高并发或者高可用的方案,会造成额外的运维和经济成本。

8a3d3980e1b1e942d129792bdc3392ff11cc7c0a

我们对整个DBA行业做了分类,大概分为运维DBA、应用DBA以及业务DBA。每个角色的工作重点各不一样,运维DBA更加偏重于数据库的安装和配置、HA高可用、备份容灾以及升级扩容等,这些已经被云做掉了;应用DBA是我们当前所处的阶段,主要偏重于数据库相关技术选型、容量规划、性能优化和运维自动化等,其实阿里云也在将该部分工作实现自动化和智能化,包括CloudDBA、DMS、DTS等外围增值服务,推动我们从应用DBA转向业务DBA。目前我们也在向这方面去靠拢和思考,后面的工作重心会更多地放在数据库的架构以及数据的应用上,让数据产生更多的价值,为业务提供数据支持。

ffbe0e38437dab52359b4b6a4e07263d5aa520e7
下图是秦苍科技的技术公众号,上面会定期公布一些技术文章,感兴趣的同学可以关注一下。
5f41b061afe39c238c15b73aacff5c2cef776679
相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
相关文章
|
3月前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
3月前
|
设计模式 缓存 关系型数据库
探索微服务架构中的数据库设计挑战
微服务架构因其模块化和高扩展性被广泛应用于现代软件开发。然而,这种架构模式也带来了数据库设计上的独特挑战。本文探讨了在微服务架构中实现数据库设计时面临的问题,如数据一致性、服务间的数据共享和分布式事务处理。通过分析实际案例和提出解决方案,旨在为开发人员提供有效的数据库设计策略,以应对微服务架构下的复杂性。
|
3月前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
24天前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
25天前
|
缓存 关系型数据库 MySQL
高并发架构系列:数据库主从同步的 3 种方案
本文详解高并发场景下数据库主从同步的三种解决方案:数据主从同步、数据库半同步复制、数据库中间件同步和缓存记录写key同步,旨在帮助解决数据一致性问题。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
高并发架构系列:数据库主从同步的 3 种方案
|
17天前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
20天前
|
消息中间件 数据库 云计算
微服务架构下的数据库事务管理策略####
在微服务架构中,传统的单体应用被拆分为多个独立的服务单元,每个服务维护自己的数据库实例。这种设计提高了系统的可扩展性和灵活性,但同时也带来了分布式环境下事务管理的复杂性。本文探讨了微服务架构下数据库事务的挑战,并深入分析了几种主流的事务管理策略,包括Saga模式、两阶段提交(2PC)以及基于消息的最终一致性方案,旨在为开发者提供一套适应不同业务场景的事务处理框架。 ####
|
20天前
|
设计模式 存储 缓存
微服务架构下的数据库设计策略
本文探讨了在微服务架构中进行数据库设计时,如何平衡数据的一致性、独立性与系统整体性能之间的关系。文章首先介绍了微服务架构的基本概念及其对数据库设计的影响,随后深入分析了三种主流的数据库设计模式——集中式、去中心化和混合模式,并结合实际案例讨论了它们的适用场景与优缺点。此外,还提出了一系列最佳实践建议,旨在帮助开发者更好地应对微服务环境下的数据管理挑战。
|
16天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
14天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####