透析商业银行在云时代下的数据库需求与选型

2024-03-11 08:10

本文主要是介绍透析商业银行在云时代下的数据库需求与选型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

伴随着云计算、分布式技术的逐步落地,近十年来数据库的形态也发生了很大变化,各类数据库如雨后春笋般不断涌现。从架构形态和应用功能的角度来区分,本文将这些新兴的数据库分为三类:分布式、NoSQL及云原生数据库。

 

过去关系型数据库滥用的时代已经逐渐结束,分布式、NoSQL及云原生数据库的出现,也带来了如SQL已死、NoSQL或NewSQL取代SQL的等各类声音。但以目前的发展趋势来看,将来更大可能性是会出现多种数据库共存的情况,各个数据库奋战在最适合的场景下。

 

因此,只有先对这些数据库有了深入的理解,才能更好地选择对应的场景。尤其在商业银行场景下,如何通过这些数据库来更好地实现业务诉求,相信是很多银行仍在持续探索的方向。

 

分布式数据库

 

2000年左右,以Teradata为代表的MPP架构的数据库在数据仓库系统逐步推广;2013年NewSQL一词的提出,标志着分布式数据库开始进军OLTP负载的领域。随着NewSQL不断发展成熟,出现了Spanner、TiDB等主要代表性的产品。

 

分布式数据库主要是将数据分布在多个物理节点上,通过网络传输的方式对多个物理节点进行协调,以横向扩展的方式突破了单机数据库在容量上的限制。但随之而来也出现了新的问题:如何保证节点间的数据一致性?如何保证多节点对外的事务一致性?如何跨节点实现join、聚合、自定义函数、存储过程等原有的SQL操作?

 

分布式数据库本质而言还是单机数据库的扩展,如果把单机数据库拆开来看(如图1所示),数据库的核心组件主要分为服务层(提供SQL接口,也称SQL引擎层)、引擎层(实现事务的ACID,也称为存储引擎层)及存储层(实现数据结构及物理存储)。

 

图1

 

存储层解决节点间数据一致性问题

 

 

横向扩展为了降低成本,通常会采用廉价的硬件,并且由于节点间需要通过网络传输,硬件的不可靠以及网络的不可靠也标志分布式数据库本身就处于一个不可靠的物理环境,需要通过额外的手段提升可靠性。

 

目前主流的实现方式都是通过将数据写入到多个副本中,来确保数据的安全,由于网络传输的先后顺序,节点间收到数据同步请求也不一致,如果等待全部节点都同步写入成功,又会对性能有较大的影响。

 

目前数据库产品通常采用Raft、Paxos等算法或变种来实现节点间数据一致性,节点间的数据传输通常包含应用数据、元数据及事务日志。

 

引擎层保证对外的事务一致性

 

 

分布式数据库中不止需要考虑节点内部事务的一致性,更需要考虑全局事务,主流的工业实现在性能以及复杂度权衡,目前基本采用二阶段提交(2PC)来实现。但二阶段提交的缺陷在于:

 

在不同的分布式应用架构下,实现一个分布式事务要考虑的问题并不完全一样,比如对多资源的协调、事务的跨服务传播等,实现机制也是复杂多变。此外,针对全局时钟及序列的实现也是数据库产品的主要关注点。

 

服务层实现跨节点的SQL操作

 

 

SQL可以按算子处理先后顺序为扫描、关联、汇总三个阶段,基本上所有SQL语句都包含了扫描阶段,部分SQL包含了关联(join)或汇总阶段。

 

对于只进行扫描的SQL(就是SET/PUT某个表的一条或多条记录),这种SQL操作比较简单,在分布式数据库中此类SQL的性能关键点往往过滤条件中在于是否包含分布键,以及节点间的数据是否存在严重偏移。

 

包含关联逻辑的SQL语句在分布式数据库场景下,需重点考虑SQL是否会引起跨节点的数据传输,是否能够将过滤和join逻辑下推到本地节点处理,通常会对性能产生极大的影响。聚合操作的SQL通常为group by、order by、having、limit等子句以及聚合函数,数据库在读取数据之后,需要对结果数据在协调节点进行聚合,因此对于协调节点的内存开销较重,协调节点需要能够处理大数据量的内存轮换。对于以上两类的SQL语句,常见的优化方法包含创建本地表、join下推、排序下推、过滤下推等方式。

 

整体来说,分布式数据库的优势在于突破了单机数据库的容量限制,多节点可以实现高并发;而劣势在于,SQL的兼容性较差,落地过程伴随着应用程序改造,并且由于二阶段提交的问题,会导致额外的运维成本。

 

NoSQL数据库

 

2010年左右,MongoDB、Redis、Neo4j、HBase等各类非关系型数据库的涌现引发了大家对NoSQL的思考,当时也不断有NoSQL会替代关系型数据库的声音。随着近十年来的发展,NoSQL数据库在细分领域表现得非常优异,常见的NoSQL主要包含以下几类:

 

  • key-value数据库:一种以键值对存储数据的一种数据库,目前主要代表为Redis。Redis支持存储的value类型包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove、取交集并集和差集等更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

 

  • 文档数据库:面向集合的数据库,无需进行结构定义(简单来讲就是不用创建表就可以使用),以MongoDB为代表。所谓“面向集合”(Collection-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collection)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。

 

 

  • 图数据库:随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了一张庞大而复杂的关系网,传统数据库很难处理关系运算,以neo4j、ArangoDB等为代表的图数据库满足了此类需求,将结构化数据存储在网络(从数学角度叫做图)上而不是表中。

 

  • 列簇数据库:大数据的兴起也带动了列簇数据库的发展,主要代表为HBase和Cassandra。列簇数据库将数据存储在列族中,而列簇里的行则把许多列数据与本行的“行键”关联起来。行是列的集合,由相似行构成的集合就是列族。列族数据库的各行不一定要具备完全相同的列,并且可以随意向其中某行加入一列。

 

目前而言,NoSQL主要是活跃在擅长的细分领域,但由于架构、成熟度等诸多因素,其在事务的支持上还需进一步完善,并且对于SQL支持度不高,也导致了研发人员额外的开发成本,未来会向哪些方向发展有待观望。

 

云原生数据库

 

2015年,全球市场份额最大的云厂商AWS发布了云原生的数据库产品Aurora,提出了log is database的新一代数据库理念,也从性能及可靠性上与RDS形成了差异化。

 

随后各个云厂商也推出了Aurze SQL Database、PolarDB以及CynosDB等云原生数据库。在将计算和存储等节点分离之后,各模块的性能和弹性就可以各自提升,具备应对大规模存储的能力。

 

以Aurura为例,通过log is database的设计哲学,将数据的更改变为只写日志,即write-once,极大地降低了数据库的写入操作。同时为了更好地适应云计算,他们认为应该将数据库系统这个“盒子”打开,在不同的层面进行扩展。

 

Aurora将恢复子系统委托给底层可靠的存储系统,依赖这个来保障系统服务层级(Service Level Agreement, SLA)。使得Aurora在没有引入分布式事务以及无需对应用进行改造的前提下,将性能和弹性扩展能力进行了极大的提升。

 

商业银行的挑战与选型思考

 

对于商业银行而言,随着国产化浪潮、线上支付的兴起以及大数据、AI等新技术的成熟,银行IT系统主要发展向着国产化、智能化、服务化的方向演进。银行的IT系统按功能划分大致可以分为四类:渠道服务系统、业务前置系统、账务处理系统、管理信息系统。

 

渠道服务系统与传统业务相比,已经与各个线上平台进行了相关对接,随着双11、618等各类平台的促销活动,高并发的支撑和资源能否快速弹性扩展成为线上渠道服务系统的必要考量因素。在这种背景下,可以采用基于私有云的弹性扩容以及云原生数据库的极致扩展来应对此类的业务爆发场景。

 

由于历史原因,核心账务类系统目前大多运行在IBM的大型机或小型机上,此类系统作为银行系统的心脏,并发高、一致性要求高,且兼顾联机交易及批处理场景,随着业务发展,面临着扩容成本高、扩容难度大的问题。

 

并且随着国际形势的变化,也必将面临着国产化之路,如何将核心数据库从Power 下移到ARM或将成为银行需要面对的课题。由于硬件本身的差异性,如何将现在的传统关系型数据库迁移到分布式数据库也必将是这个课题的核心重点和难点。

 

随着金融业务放宽及渠道的拓展,需要通过数据支撑贷款审批、金融诈骗、洗钱以及实时营销等场景,对于数据类系统的实时性要求提高,数据处理也从传统的T+1、D+1向着D+0及实时的方向转变。在这些需求下,图数据库、KV数据库以及文档数据库等也快速地补充了进来,提供了多模数据处理及实时分析的能力。 

 

总体来说,个人理解数据库的架构形态主要由三个原因引起:

 

  1. 由于业务量及数据量的增长,对数据库的容量提出了新的要求;

  2. 由于应用需求的变化,需要高速处理新型的数据类型;

  3. 由于基础架构的进步,对数据库扩展性和性能提出了新的解决方案。

 

而以上的三类挑战,将会是今后的常态化现象,未来会出现越来越大的数据量要求、更多种类的数据类型,以及更健壮强大的基础架构。而如何不断地使用新的工具来应对挑战,打造可扩展的系统,支撑业务发展和业务诉求,必将是银行业IT从业者长期的使命。

这篇关于透析商业银行在云时代下的数据库需求与选型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797199

相关文章

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO