分库分表真的适合你的系统吗?

曾几何时,“并发高就分库,数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。

面试官喜欢问,博主喜欢写,候选人也喜欢背,似乎已经形成了一个闭环。

但你有没有思考过,分库分表真的适合你的系统吗?

分表

在业务刚刚发展起来的时候,流量全部达到了一个 MySQL 上,用户信息全落到了 user 表。

后来,user 表的数据量越来越大了。

于是,你做了一次垂直拆分,将原来的 user 表拆分成了新的 user 表和 user_details 表。

这样一拆之后,用户的信息分散到两个表,user 表面的数据量一下就变小了,user 表面数据量过大的问题暂时就解决了。

但随着业务的发展,线上的流量越来越大,单个 MySQL 已经扛不住流量的压力了。

当个库承受不住压力的时候,就需要分库了。

分库

顾名思义,分库就是将一个库拆成多个库,让多个库分担流量的压力。

拆成多个库也意味着进行了分表,也就是说分库一定分表,分表不一定分库。

我们可以根据偏应用还是偏 DB,将分库分表的实现方式分成三种类型:

  • JDBC 代理模式
  • DB 代理模式
  • Sharding On MySQL 的 DB 模式

JDBC 代理模式

JDBC 代理模式是一种无中心化的架构模式。ShardingSphere-JDBC 就是 JDBC 代理模式的典型实现。

通常以 jar 包括提供服务,让客户端直连数据库,这种模式无需额外部署和依赖,可理解为增强版的 JDBC 驱动。

JDBC 代理模式虽然简单,但违背了 DB 透明的原则,侵入性比较高,需要针对不同的语言编写不同的 Driver。

美团的 Zebra、MTDDL,阿里 TDDL 都是基于这种模式的实现。

DB 代理模式

DB 代理模式是中心化的架构模式。ShardingSphere-Proxy 就是 DB 代理模式的经典实现。

这种模式旨在实现透明化的数据库代理端,并独立于应用部署,因为独立部署,所以对异构语言没有限制,不会对应用造成侵入。

DB 代理模式比 JDBC 代理模式消耗的连接数会少,相对来说性能也会更好。

但中心化的设计也带来了单点的问题,为了保持高可用和高性能,还需要引入 LVS/F5 等 VIP 来实现流量的负载均衡,如果跨越 IDC,还依赖诸如 DNS 进行 IDC 分发,大大拉长了应用到数据库的链路,进而提高了响应时间。

阿里的 MyCat、美团的 Meituan Atlas 和百度 Heisenberg 就是基于 DB 代理模式的实现。

Sharding On MySQL

Sharding On MySQL 相当于屏蔽了分库分表的操作,是运维和中间件结合的沉淀,比较典型的例子是阿里的 DRDS。

这种模式让分库分表变得模糊,对应用来说,更像是一个封装了 MySQL 的新型数据库。

虽然用户使用变得更简单了,但简单的背后是运维的沉淀,分库分表该存在的问题它依然存在。

分库分表的成本

实现分库分表的方式有很多,但不同模式的实现似乎都是在弥补 MySQL 不支持分布式的缺陷。

分库分表这种强行让 MySQL 达到一个伪“分布式”的状态,也带来了一些新的问题,比如:

  1. 功能限制问题:分库分表后跨维度 join、聚合、子查询不复存在,唯一键、外键等全局约束也只能靠业务保障,DB 慢慢弱化为存储。
  2. 运维复杂度问题:分库分表后的多个库表的管理麻烦,运维成本非常高,数据查询也很麻烦。
  3. Sharding Key 问题:非 Sharding key 的查询需要做额外的冗余处理,需要引入 Elasticsearch、ClickHouse 等其他节点,进一步提高了系统的复杂度。
  4. 唯一 ID 问题:分库分表后唯一一个 ID 得不到保障,需要唯一 ID 进行改造。
  5. 分布式事务问题:MySQL 自带的 XA 柔性事务性能太低,需要引入新的分布式事务解决方案。

NewSQL

从上文得知,分库分表需要牺牲 MySQL 的一些功能,还带来许多新的问题。

那有没有一种方案,既能拥有 MySQL 的功能,又能支持数据的可扩展?

有。那就是 NewSQL。

NewSQL 是一类关系数据库管理系统,旨在为在线事务处理(OLTP) 工作负载提供 NoSQL 系统的可扩展性,同时保持传统数据库系统的 ACID 保证。

国内比较知名的 NewSQL 有阿里的 OceanBase、腾讯的 TDSQL、PingCAP 的 TiDB。它们既有 MySQL 的功能,又有分布式可扩展的能力。

笔者对阿里的 OceanBase 只能说是略懂皮毛,就不过多描述。

我们重点看一下腾讯的 TDSQL 和 PingCAP 的 TiDB。


从两者的架构图(省略了部分模块)上可以看出,TDSQL 和 TiDB 的架构只有一些命名差别,可以说几乎一模一样。

两者整体来说分为三个部分:

  1. 计算:负责接受客户端的连接,执行 SQL 解析和优化,最终生成分布式执行计划转发给底层的存储层执行。(TDSQL:SQL Engine 、TiDB:TiDB-Server)
  2. 存储:分布式KV 存储,类似 NoSQL 数据库,支持弹性扩容和缩容。(TDSQL:TDStore 、TiDB:TiKV)
  3. 管控:整个集群的元信息管理模块,是整个集群的大脑。(TDSQL:TDMetaCluster 、TiDB:Placement Driver )

两者核心的存储模块(TDStore/TiKV),都是基于 RocksDB 开发而来,都是KV 存储的模式。

RocksDB 是由 Facebook 基于 LevelDB 开发的一款提供键值存储与读写功能的 LSM-tree 架构引擎。

底层利用了WAL(Write Ahead Log)技术和Sorted String Table,比 B 树类存储引擎更高的写吞吐。

NewSQL 平滑接入方案

因为笔者落地过 TiDB,所以会以 TiDB 为例描述如何接入 NewSQL,做到不影响线上使用的平滑迁移。

第一步:初始状态,所有线上读和写都落到 MySQL。

第二步:将 TiDB 作为 MySQL 的从节点接入系统,所有线上读写还是都落到 MySQL,日末通过脚本或者任务验证 MySQL 的数据和 TiDB 的数据是否一致,这一步主要验证 MySQL 数据同步到 TiDB 没有问题。

第三步:将部分读切换到 TiDB,这一步主要验证 TiDB 同步的数据读没有问题,验证系统 SQL 能正常在 TiDB 执行。

第四步:断掉 MySQL 和 TiDB 之间的同步,双写 MySQL 和 TiDB,所有的线上读流量都落到 MySQL。

第五步:将部分读流量切到 TiDB,验证 TiDB 写入的数据能够正常读取。这一阶段可以将部分幂等任务同时在两个数据源上执行,验证两者数据是否一致。

第六步:将所有的线上读流量切到 TiDB,同时保持双写,如果出问题随即切到 MySQL。

第七步:断掉 MySQL 的写流量,将 MySQL 作为 TiDB 的一个从库,作为降级使用。

整个方案的基础是:TiDB 兼容 MySQL 协议和 MySQL 生态

这个方案是建立在完全不信任 TiDB的基础上设计的,验证了 TiDB 和 MySQL 的契合点,所以整体会比较繁琐,实际落地的时候可以根据情况省略一部分步骤。

NewSQL 真的有那么好吗?

NewSQL 并是不万能的,也不必去过于神化 NewSQL,国内比较知名的几种 NewSQL 或多或少都存在部分功能缺陷,以 TiDB 为例:

  1. TiDB 的自增 ID 只能保证单个 TiKV 上的自增,并不能保证全局自增。
  2. 由于 TiKV 存储是根据 key 的二进制顺序排列的,使用自增 ID 可能会造成热块效应。
  3. TiDB 默认 RC(读已提交)的事务隔离级别,并且不支持 RR(可重复读)隔离级别,虽然提供了基本等价于RR的SI(Snapshot Isolation),但还是存在写偏斜问题
  4. TiDB 的点查(select point)性能比 MySQL 要差不少,在几个亿级别的数据量才能勉强和 MySQL 打平。
  5. 因为底层基于 Raft 协议做数据同步,所以 TiDB 延迟会比 MySQL 要高。

所以说,NewSQL 也并不是屠龙刀,需要根据实际应用去评估这些缺陷带来的影响。

NewSQL 的应用

NewSQL 在国内其实已经发展了很多年,OceanBase 诞生于 2010 年,TDSQL 可追溯到 2004 年,TiDB 诞生于 2015 年。

三者在国内外积累了不少的客户案例。

OceanBase

  1. OceanBase 已经覆盖蚂蚁集团100%核心链路,支撑全部五大业务板块。目前运行数十亿条不同的 SQL、数据量达数百 PB、服务器核数过百万。
  2. 中国工商银行全行业务都使用 OceanBase,包含不限于存、贷、支付结算及创新业务等。
  3. OceanBase 凭借混合云架构、高可用、Oracle 兼容等特性,通过分布式中间件、金融套件、移动开发平台集成解决方案,支撑网商银行核心系统数字化转型。
  4. 招商银行的“海量行情系统”和“历史收益系统”就是采用 OceanBase 作为底层数据库。

TDSQL

  1. 微众银行实现了 TDSQL 私有化部署,是一个典型的两地多中心架构。
  2. 富途证券的港股交易系统、东吴证券新一代核心交易系统底层存储都是 TDSQL。
  3. 数字广东粤省事深圳地铁码上乘车等业务都是在 TDSQL 上面跑的。
  4. 平安银行、中国农业银行、华夏银行、中国银行都有相关业务在 TDSQL 上。

TiDB

  1. 北京银行的网联支付业务,所有北京银行的银行卡绑定在比如支付宝、微信上的支付操作,后端的数据库就是运行在 TiDB,而且是一个典型的两地三中心同城双活的架构,这个业务非常的关键,如果业务中断超过一定时间,就是需要上报银监会的。
  2. 日本排名第一的支付公司——Paypay,钱包和支付的业务都在 TiDB 上面。
  3. 中国人寿的寿财险业务,正在用 TiDB 陆续替换 Oracle 。
  4. 肯德基所有的会员登录系统,包括 KFC 的 APP 以及第三方登录,后台数据库都是用的 TiDB ,这套业务 2020 年 4 月份上线,已经经历过多次肯德基的大促等活动,目前肯德基的后台支付系统也已经切换到 TiDB 上。
  5. 麦当劳的账户以及订单系统全部基于 TiDB,如果 TiDB 出问题了,那么国内所有的麦当劳门店,包括线上和线下的点单系统都将没法正常运行。
  6. 微众银行最核心和最赚钱的微粒贷业务,后台的全量批处理业务就运行在 TiDB 上面。

分库分表和 NewSQL 到底怎么选?

分库分表是一个重量级的方案,它会带来很多新的问题,对基建和运维的要求也很高。

NewSQL 功能强大但也有功能缺陷。

如何去抉择需要根据系统现状和公司情况去综合判断。

分库分表是一个重量级的方案,如果读写分离冷热分离等轻量级方案能解决的问题就没必要上分库分表

如果缓存分流和读写分离都扛不住了,且你身处互联网企业,基建尚可且运维也跟得上,分库分表仍然是第一选择;

但如果你身处一个传统的企业,基建很差甚至没有基建,那么你可以考虑考虑NewSQL

技术没有高低之分,能解决问题的技术就是好技术,技术方案选择上切莫炫技,也切勿过度设计!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473353.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

每日一题——Python实现蓝桥杯 单词分析(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码分析 时间复杂度分析 空间复杂度分析 总结 我要更强 方法一&#x…

可变参数 Collections 不可变集合 Stream流

目录 1.可变参数: 2.Collections: 3.不可变集合: 4.Stream流: 1、什么是流 2、如何生成流 1.单列集合获取Stream流 2.双列集合获取Stream流 3.数组获取Stream流: 4.一堆零散数据: Stream接口中的静态方法 3.Stream流的…

.net 调用海康SDK的跨平台解决方案

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 上2篇海康SDK使用以及常见的坑…

python拆分数字

问题 从键盘获取一个4位整数,分别输出个位、十位、百位、千位上的数字 分析 可以使用eval()函数或者int()函数将从键盘获取的数字串转成int类型,通过整除和取余操作分别获取数字 numeval(input(请输入一个四位整数:)) print(个位数&#…

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对流浪动物信息管理的提升&…

Midjourney对图片细微调整和下载保存

点击v2是对第二图片细微调整。 点击u3对第3张图片进行放大。 保存图片: 对点击u3放大的图片,双击 , 右键保存图片

【课程总结】Day13(下):人脸识别和MTCNN模型

前言 在上一章课程【课程总结】Day13(上):使用YOLO进行目标检测,我们了解到目标检测有两种策略,一种是以YOLO为代表的策略:特征提取→切片→分类回归;另外一种是以MTCNN为代表的策略:先图像切片→特征提取→分类和回归。因此,本章内容将深入了解MTCNN模型,包括:MTC…

基于STM32F407ZG的FreeRTOS移植

1.从FreeRTOS官网中下载源码 2、简单分析FreeRTOS源码目录结构 2.1、简单分析FreeRTOS源码根目录 (1)Demo:是官方为一些单片机移植FreeRTOS的例程 (2)License:许可信息 (3)Sourc…

电脑f盘的数据回收站清空了能恢复吗

随着信息技术的飞速发展,电脑已成为我们日常生活和工作中不可或缺的设备。然而,数据的丢失或误删往往会给人们带来极大的困扰。尤其是当F盘的数据在回收站被清空后,许多人会陷入绝望,认为这些数据已无法挽回。但事实真的如此吗&am…

Python 学习中什么是元组,如何使用元组?

什么是元组 元组(Tuple)是Python内置的一种数据结构,用于存储多个数据项。与列表类似,元组也可以存储不同类型的数据,但它们之间存在一个重要区别:元组是不可变的,也就是说,一旦创建…

怀念旧的Windows声音?以下是如何在Windows 11中恢复它们

如果你渴望旧的Windows声音,希望能在Windows 11上再次听到,那你就很幸运了。我们将向你展示如何下载必要的声音包并创建复古的声音方案。 如何获取旧Windows声音的声音包 你需要做的第一件事是下载一个包含旧Windows版本声音的声音包。此外,请确保它包含的每个声音都是WAV…

ctfshow web入门 nodejs

web334 有个文件下载之后改后缀为zip加压就可以得到两个文件 一个文件类似于index.php 还有一个就是登录密码登录成功就有flag username:ctfshow password:123456因为 return name!CTFSHOW && item.username name.toUpperCase() && item.password passwor…

软件运维服务方案(Word原件2024)

软件运维服务方案(Word原件) 1. 服务简述 我们提供全面的软件运维服务,确保软件系统的稳定运行。 1.1 服务内容 包括监控、维护、故障排查与优化。 1.2 服务方式 结合远程与现场服务,灵活响应客户需求。 1.3 服务要求 高效响应&am…

自动驾驶AVM环视算法--相机的联合标定算法实现和exe测试demo

更新:测试的exe程序,无需解压码就可以体验算法测试效果 链接:https://pan.baidu.com/s/1OfuslVNcTXAZWvwiqflWsA 提取码:zoef 1、压缩包解压后显示如下所示 测试文件包括:可执行的exe文件、测试的图片等。 2.双击ex…

C++|哈希应用->布隆过滤器

目录 一、概念 二、模拟实现 三、布隆过滤器扩展应用 上一篇章学习了位图的使用,但它只适用于整数,对于要查询字符串是否在不在,位图并不能解决。所以针对这一问题,布隆过滤器可以派上用场,至于布隆过滤器是什么&am…

8种方案解决移动端1px边框的问题

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 8 种方案解决移动端1px边框的问题 造成边框变粗的原因 css中的1px并不等于移动设备的1px,这是由不同手机由不同像素密度,在window对象中有一个devic…

Nginx-http_auth_basic_module使用

文章目录 前言一、ngx_http_auth_basic_module二、指令1.auth_basic1.auth_basic_user_file 示例生成密码文件配置basic认证浏览器验证 总结 前言 nginx可以通过HTTP Basic Authutication协议进行用户名和密码的认证。 一、ngx_http_auth_basic_module 生效阶段: …

压测工具---Ultron

压测工具:Ultron 类型:接口级和全链路 接口级 对于接口级别的压测我们可以进行 http接口压测、thrift压测、redis压测、kafka压测、DDMQ压测、MySQL压测等,选对对应的业务线、选择好压测执行的时间和轮数就可以执行压测操作了 全链路 对…

SAP PS学习笔记01 - PS概述,创建Project和WBS

本章开始学习PS(Project System)。 1,PS的概述 PS(Project System)是SAP企业资源规划系统中的一个关键模块,主要用于项目管理。 它提供了一个全面的框架来规划、控制和执行项目,涵盖了从项目启…

阿秒光脉冲(阿秒脉冲)持续时间在阿秒量级 科学研究是其目前主要应用方向

阿秒光脉冲(阿秒脉冲)持续时间在阿秒量级 科学研究是其目前主要应用方向 阿秒光脉冲简称阿秒脉冲,由超级短暂的激光脉冲构成,单个脉冲的持续时间仅为百万亿分之一秒(10-18秒)。   根据新思界产业研究中心…