业务持续增长带来的单表数据量过大,必然影响到数据库的读写性能,那到底要不要分库分表呢?

阿里巴巴P3C规范给出一个推荐:

【推荐】单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。
说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

对于银行业务来说,500万这个量还是很容易触达的。

分库分表的类型

水平分表:把一个大表数据在同一个库内拆分成多个表,这些表表结构一样,数据没有交集,如下图:

垂直分表:按照字段的维度,把一个大表拆分成多个表,每个表的字段都不一样,如下图:

水平分库:对库中的大表水平拆分到不同的库,最后所有库的表结构完全一样,数据没有交集,如下图:

垂直分库:对库中的大表垂直拆分到不同的库,每个库的表结构都不一样,如下图:

分库的优势:
支持更多的连接数
降低数据库故障影响范围
解决热点数据太多缓存放不下的问题
分库的代价:
跨库查询不支持join
会有分布式事务问题
聚合函数不能直接使用
自增id会有冲突

分库分表中间件

1.TDDL

淘宝的分库分表中间件,基于JDBC规范,没有server,用client-jar包依赖的方式部署。

tddl不支持下面的操作:

  • join语句

  • between/and

  • not语句

  • for update

  • force index语句

  • 数据库内部函数

  • 多表查询

下图是github上tddl现状,可以看到已经停止维护了。

2.kingshard

kingshard由go语言开发,使用时需要安装go语言环境和server,目前快手在用。从github上看,近1年有维护,但是不多:

缺点:不支持各类join和多表查询
优点:拆分表的数量可以跟拆分库的数量不一样,即分库后可以建子表

3.sharding-sphere

前身sharding-jdbc,目前比较热的一款中间件,好多公司在用。github上可以看到最近一个月内都有提交代码:

sharding-sphere使用jar包依赖的方式,不需要部署server。

社区活跃,遇到问题容易得到支持,支持分布式事务

4.Mycat

非常成熟的一款中间件,需要部署server做代理。网上吐槽mycat的商业味太浓,从github看,近期更新比较少。

5.问题

使用分库分表中间件会带来一些问题:

  • 不能完全兼容原生sql

  • 业务代码改动非常大

  • 部署server的中间件需要考虑高可用

  • 实际开发中可能会遇到各种坑

分布式数据库

分布式数据库是近几年兴起的新型数据库,主流的分布式数据库有2类,一类是PGXC风格的,另一个是NewSQL风格的。多数分库分表对mysql的语法支持更好一些,对oracle语法不太兼容。

PGXC风格的数据库,是在传统关系型数据库分片集群之上,增加了协调节点和全局事务管理器(GTM)来实现对分布式事务的支持。下面这个图是基于mysql单体数据库改进的PGXC数据库模型:

而NewSQL是由NoSQL键值数据库发展而来,构建在BigTable上的分布式数据库,不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID事务和SQL等特性。它主要有以下特性:

  • 放弃了PGXC架构中单体数据库的事务

  • 在BigTable基础上构建了事务支持

  • 引入分片机制,主要采用Range动态分片技术,跟HASH分片相比,数据可以不用固定的在某一个分片上

  • 可靠性方面,放弃传统数据库的主从复制,采用Paxos、Raft等共识算法来保证HA

  • 存储引擎方面,使用LSM-Tree替换B+树模型,写入性能更高

下面这张思维导图分享了主流分布式数据库,左边的5款是主流的PGXC风格数据库,右边的6款是NewSQL数据库。

使用分布式数据库的优势:

  • 解决了分布式事务问题

  • 实现了强一致要求

  • 技术新潮流

  • 解决数据库国产化诉求

使用分布式数据库的挑战:

  • DBA团队运维能力

  • 业务代码的改动量

  • 新技术可能带来的坑

  • sql不兼容问题

oracle分区表

如果当下使用的是oracle数据库,解决数据量太大带来的性能问题,oracle的分区表是非常不错的选择。

oracle分区表有以下几种类型:
范围分区:根据id或者时间进行范围分表
列表分区:表中的某个字段有固定几个值,使用这个值做分表
HASH分区:使用HASH函数做分区,分区表数据比较均匀
组合分区:可以使用上面的2种做组合分区

使用oracle分区表的优势:

  • 没有sql不兼容问题

  • 业务代码改动较小

  • 不需要考虑分布式事务

  • DBA团队运维压力小

使用oracle分区表的考虑:

  • 技术偏保守

  • 不能满足国产化诉求

  • 不利于长远去o计划

系统单元化改造

除了上面提到的分库分表技术外,也可以使用系统单元化的方式来完成。这个做法有下面几个方面需要考虑:

  • 是否支持动态分库分表

  • 是否要考虑分布式事务中间件

  • 多个系统的分库分表代码抽象共用

系统单元化改造,对DBA的运维压力小,但是对于开发团队来说不光当下工作量巨大,以后去o或者分布式技术的引入都会有巨大的改造量。

银行使用现状

工商银行

目前主要使用mysql和分库分表中间件(DBLE),联合华为研发GaussDB 200并且部分系统投产使用。

邮储银行

老系统依然采用oracle,新系统逐步过渡到PostgreSQL,没有使用分库分表中间件和分布式数据库。应对大数据量带来的性能问题,邮储银行使用业务系统单元化方式进行改造。

中信银行

联合中兴通讯研发了PGXC风格的分布式数据库GoldenDB,并且部分系统已经投产使用。

交通银行

联合华东师范大学和西北工业大学,研发了NewSQL风格的数据库CBASE,目前已经应用到多个核心交易系统中。

下面的引用出自论文《分布式数据库在金融应用场景中的探索与实践》

数据库属于系统底层核心组件,且分布式数据库技术存在大量的技术难点,此前金融领域也没有相关案例,因此在应用与实践过程中,交通银行遵循“稳定第一、谨慎试点、稳步推广”的原则,先后在金融行业查询类业务、流程类业务和高并发类业务中逐步推广应用,试点均取得了良好的效果,节省了大量的成本.

北京银行

目前有几套重要的实时交易类系统已经对接TiDB,包括比较重要网联系统、银联无卡支付、金融互联服务平台等。

中国银行

在Zabbix监控系统中使用了TiDB。

光大银行

在云缴费系统中使用了分库分表,而在现金理财业务中使用了TiDB。

招商银行

下面介绍来自OceanBase官网:

基于OceanBase的"历史收益系统"已正式上线对外提供服务。通过使用OceanBase提供的分区表功能达成了业务无入侵的目标,同时满足业务并发海量数据访问的性能要求。此外,依托OceanBase优秀的存储架构和压缩能力在数据存储成本节省方面相比原传统数据库收益显著。目前业务仍在持续迭代,为招商证券相关手机端用户提供在线盈亏分析等特色增值服务。

总结

近几年银行业越来越重视技术的投入,各大行都成立了科技研发中心并且研发投入在持续加大。但银行的技术依然比较传统,数据库使用Oracle和DB2居多。这不光是技术问题,更重要的是银行业对稳定性的要求太高。

目前头部几家大银行应对大数据量带来的性能问题,手段不尽相同。大部分偏保守,有的银行在一些交易系统、管理系统上引入了分布式数据库和分库分表中间件。

从技术上看,分库分表中间件需要从开发层面解决分布式事务问题,分布式数据库才是未来的主流趋势。

账务核算这类的核心系统,对稳定性和一致性要求几近苛刻,大家在技术选型上都比较保守。至今还没有一家银行愿意在这类系统引入分布式数据库。

对于使用oracle的银行,如果不考虑将来去o,oracle分区表是最好的选择,因为支持原生sql,业务代码改动小,不用考虑分布式事务。

有的银行使用业务系统单元化的方式来解决海量数据造成的性能问题,这很好地避开分布式带来的技术挑战,但是业务系统改造工作量巨大,而且对以后技术升级或国产化支持非常不利。

未来银行业在技术上的持续投入必然带来技术的更新换代,而在国产化诉求下,去o是必然趋势,相信未来必然会有银行在账务核算类的核心系统中尝试分布式数据库。

银行背景下分库分表技术选型相关推荐

  1. 分库分表技术及技术方案

    一.分库分表的必要性 分库分表技术的使用,主要是数据库产生了瓶颈,如单库的并发访问或单表的查询都超出了阈值.对系统使用造成一定的影响,不得已而产生的技术. 通过分库分表技术来解决此类问题,但正因为使用 ...

  2. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案

    Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 参考文章: (1)Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 (2)https://www.cnblogs.com/ ...

  3. MySQL纯透明的分库分表技术还没有

    MySQL纯透明的分库分表技术还没有 种树人 ./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...

  4. 分库分表技术演进最佳实践-修订篇

    https://www.itcodemonkey.com/article/10048.html 每个优秀的程序员和架构师都应该掌握分库分表,这是我的观点. 移动互联网时代,海量的用户每天产生海量的数量 ...

  5. 海量数据的分库分表技术演进,最佳实践

    每个优秀的程序员和架构师都应该掌握分库分表,移动互联网时代,海量的用户每天产生海量的数量 用户表 订单表 交易流水表 以支付宝用户为例,8亿:微信用户更是10亿.订单表更夸张,比如美团外卖,每天都是几 ...

  6. 分库分表技术演进最佳实践

    作者:阿飞的博客 来源:阿飞的博客 每个优秀的程序员和架构师都应该掌握分库分表,这是我的观点. 移动互联网时代,海量的用户每天产生海量的数量,比如: 用户表 订单表 交易流水表 以支付宝用户为例,8亿 ...

  7. 分库分表技术演进暨最佳实践

    每个优秀的程序员和架构师都应该掌握分库分表,这是我的观点. 移动互联网时代,海量的用户每天产生海量的数量,比如: 用户表 订单表 交易流水表 以支付宝用户为例,8亿:微信用户更是10亿.订单表更夸张, ...

  8. “分库分表 ?选型和流程要慎重,否则会失控

    原文地址:https://segmentfault.com/a/1190000017272697 恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了.但你是否知道分库分表需要哪些要素?拆 ...

  9. 分库分表学习总结(6)——分库分表?选型和流程要慎重,否则流程会失控!

    数据库中间件之分库分表 恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了.但你是否知道分库分表需要哪些要素?拆分过程是复杂的,提前计划,不要等真正开工,各种意外的工作接踵而至,以至失控 ...

最新文章

  1. 论文发得好,在这所985高校超市买东西能打折…
  2. sparkContext之一:sparkContext的初始化分析
  3. Matlab与神经网络入门
  4. 云炬随笔20180421
  5. 16进制的两位数转换不了 matlab_【大学生计算机基础】进制那些问题。小数或整数转换,各种进制间转换.........
  6. find命令及文件后缀名
  7. python与财务工作总结_Python小结1
  8. 动态规划-矩阵连乘问题
  9. CIKM'21 | 谷歌:推荐中的自监督对比学习
  10. CentOS7-下搭建Maven私服Nexus环境
  11. CODING Pages 服务全面升级,更快更稳更可靠!
  12. 典型计算机控制系统硬件组成框图,计算机控制技术重要.docx
  13. EC20模块GPGGA协议
  14. 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=
  15. 手机有显示3g无法理解服务器,3G手机根本不需升级4G,一个技巧提高3倍网速!...
  16. Pygame详解:前言
  17. c语言十进制转换成k进制,C语言10进制转换为k进制的问题
  18. 如何在双系统下删除linux系统
  19. 联联周边游系统开发源码及搭建
  20. 解决DNS服务器未响应网络异常

热门文章

  1. 使用 Vagrant 在不同的操作系统上测试你的脚本
  2. Mozilla在Firefox Nightly 92 版本测试兼容性影响
  3. 简单介绍基于PostgreSql 别名区分大小写的问题
  4. 如何系统的学习单片机?
  5. STM32单片机真的落后?
  6. Flask-Email的相关知识点实现(发送电子邮件)
  7. 逻辑回归,朴素贝叶斯,KMeans,决策树的不足和优势
  8. HDU2066(SPFA算法)
  9. NC14414 小AA的数列
  10. bezier曲线_Bezier算法