分库分表就能无限扩容吗,解释得太好了!

像我这样的菜鸟,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 JVM 的疑问,当工作几年后,对服务的可用性,可扩展性也有了新的疑问,什么疑问呢?其实是老生常谈的话题:服务的扩容问题。

正常情况下的服务演化之路

让我们从最初开始。

1. 单体应用

每个创业公司基本都是从类似 SSM 和 SSH 这种架构起来的,没什么好讲的,基本每个程序员都经历过。

2. RPC 应用

当业务越来越大,我们需要对服务进行水平扩容,扩容很简单,只要保证服务是无状态的就可以了,如下图:

当业务又越来越大,我们的服务关系错综复杂,同时,有很多服务访问都是不需要连接 DB 的,只需要连接缓存即可,那么就可以做成分离的,减少 DB 宝贵的连接。如下图:

我相信大部分公司都是在这个阶段。Dubbo 就是为了解决这个问题而生的。

3. 分库分表

如果你的公司产品很受欢迎,业务继续高速发展,数据越来越多,SQL 操作越来越慢,那么数据库就会成为瓶颈,那么你肯定会想到分库分表,不论通过 ID hash 或者 range 的方式都可以。如下图:

这下应该没问题了吧。任凭你用户再多,并发再高,我只要无限扩容数据库,无限扩容应用,就可以了。

这也是本文的标题,分库分表就能解决无限扩容吗?

实际上,像上面的架构,并不能解决。

其实,这个问题和 RPC 的问题有点类似:数据库连接过多!!!

通常,我们的 RPC 应用由于是使用中间件进行访问数据库,应用实际上是不知道到底要访问哪个数据库的,访问数据库的规则由中间件决定,例如 sharding JDBC。这就导致,这个应用必须和所有的数据库连接,就像我们上面的架构图一样,一个 RPC 应用需要和 3 个 mysql 连接,如果是 30 个 RPC 应用,每个 RPC 的数据库连接池大小是8 ,每个 mysql 需要维护 240 个连接,我们知道,mysql 默认连接数是 100,最大连接数是 16384,也就是说,假设每个应用的连接池大小是 8 ,超过 2048 个应用就无法再继续连接了,也就无法继续扩容了。注意,由于每个物理库有很多逻辑库,再加上微服务运动如火如荼, 2048 并没有看起来那么大。

也许你说,我可以通过前面加一个 proxy 来解决连接数的问题,实际上,代理的性能也会成为问题,为什么?代理的连接数也是不能超过 16384 的,如果并发超过 16384,变成 163840,那么 proxy 也解决不了问题。

怎么办?让我们再看看上面的架构图:

我们发现,问题是出在“每个 RPC 应用都要连所有的库”,导致扩容应用的同时,每个数据库连接数就要增加。就算增加数据库,也不能解决连接数的问题。

那怎么办呢?

单元化

单元化,听起来高大上,通常在一些 XXX 大会上,分享“关于两地三中心”,“三地五中心”,“异地多活”等等牛逼的名词的时候,单元化也会一起出现。

这里我们不讨论那么牛逼的,就只说“数据库连接数过多” 的问题。

实际上,思路很简单:我们不让应用连接所有的数据库就可以了。

假设我们根据 range 分成了 10 个库,现在有 10 个应用,我们让每个应用只连一个库,当应用增多变成 20个,数据库的连接不够用了,我们就将 10 个库分成 20 个库,这样,无论你应用扩容到多少个,都可以解决数据库连接数过多的问题。

注意:做这件事的前提是:你必须保证,访问你这个应用的 request 请求的数据库一定是在这个应用的。s

换个说法,当用户从 DNS 那里进来的时候,就知道自己要去那个应用了,所以,规则在 DNS 之前就定好了,虽然这有点夸张,但肯定在进应用之前就知道要去哪个库了。

所以,这通常需要一个规则,例如通过用户 ID hash,由配置中心广播 hash 规则。这样,所有的组件都能保持一致的规则,从而正确的访问到数据库。如下图:

到这里,我们终于解决了无限扩容的问题。

最后

本文从单体应用开始,逐步讲述了一个正常后台的演进历程,知道了分库分表并不能解决“无限扩容” 的问题,只有单元化才能解决这问题。而单元化则带来更多的复杂性。但是好处不言而喻。

单元化带来的更多的思路。

有了单元化,解决了无限扩容的问题,但是我们还没有考虑单点的问题,即服务的可用性。要知道,我们这里的数据库都是单点的。

这就是另一个话题 —— 异地多活。限于篇幅,下次再聊。

作者 | 莫那·鲁道

来源 | http://rrd.me/emHsn

Image placeholder
IT头条
未设置
  42人点赞

没有讨论,发表一下自己的看法吧

推荐文章
数据库分库分表解决方案汇总

一.数据切分关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重

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

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

炸!业界难题,跨库分页的几种常见方案

为什么需要研究跨库分页?互联网很多业务都有分页拉取数据的需求,例如:(1)微信消息过多时,拉取第N页消息;(2)京东下单过多时,拉取第N页订单;(3)浏览58同城,查看第N页帖子;这些业务场景对应的消

sharding sphere 4.0.0-RC1版本 按年分表实战

1.shardingsphere4.0.0-RC1版本按年分表实战1.1.需求需要对日志表进行按时间划分表,由于用于后台系统,日志量预估不会太大,因此按年划分表经过我不断的查阅shardingsphe

百亿级数据分表后怎么分页查询?

推荐课程:PHP开发工程师--学习猿地精品课程 当业务规模达到一定规模之后,像淘宝日订单量在5000万单以上,美团3000万单以上。数据库面对海量的数据压力,分库分表就是必须进行的操作了。而分库分表之

PHP 快速扫描列表创建无限极分类树

PHP快速扫描列表创建无限极分类树 无限极分类树 省市区列表结构 array( 1=>array( 'id'=>1, 'name'=>'中华人民共和国', 'parent_id'=>0, 'lev

DTCC | 云数据库时代已来,你准备好了吗?

作为基础软件之一,数据库一直是企业IT系统的核心,过去数十年,数据库技术发展缓慢。而随着云计算的到来及相关技术的不断成熟推动了数据库行业的快速发展,传统数据库铁打的防线也正在被撕裂。截至目前,全球主流

你需要的前端知识收集好了,请查收!

github地址记录学习成长收获的知识,不断进步,Front-end-go-on目前包含的模块有 HTML基础 CSS基础 JS基础 数据结构基础 Http基础 JS代码练习 算法代码练习 CSS代码

Python入门教程_2. 使用 Python 解释器

2.1.调用解释器 Python解释器通常安装在目标机器上的/usr/local/bin/python3.7目录下;把/usr/local/bin目录放进你的Unixshell的搜索路径里,确保它可以

面试题:请解释一下什么是虚拟内存?

内存对于用户来说就是一个字节数组,我们可以根据地址来访问到某个字节或者某些字节:很久之前的内存很久很久之前,一台机器上只放置一个程序,操作系统仅仅作为一个函数库存在。对于内存来说,除去操作系统的代码和

太天真了!这简历一看就是包装过的!

前言上到职场干将下到职场萌新,都会接触到包装简历这个词语。当你简历投到心仪的公司,公司内负责求职的工作人员是如何甄别简历的包装程度的?Coody老师根据自己的经验写下了这篇文章,谁都不是天才,包装无可

中国顶级程序员图鉴,最后一个厉害了!

程序员圈子里有很多如明星般闪耀的牛人!有中国第一代程序员求伯君有获得图灵奖的姚期智有产品取得巨大成功的张小龙商业巨子张一鸣影响开源领域的章亦春……他们的最初都是程序员机遇与热爱,把他们送到了不同的方向

Spring Boot 面试,一个问题就干趴下了!

随着SpringBoot使用越来越广泛,SpringBoot已经成为Java程序员面试的知识点,很多同学对SpringBoot理解不是那么深刻,经常就会被几个连环跑给干趴下了!比如下面这一段的Spri

华为鸿蒙来了!八大亮点超越安卓,特殊情况随时可用!

大数据文摘编辑部出品鸿蒙OS来了!8月9日,在广东东莞举办的华为开发者大会HDC.2019上,华为消费者业务CEO余承东正式发布了“面向未来、多终端能力共享的操作系统”——鸿蒙HarmonyOS。鸿蒙

蓦然回首,Java 已经 24 岁了!

01、真没想到,Java竟然24岁了(算是90后)!提起Java,印象最深刻的当然就是:classCmower{ publicstaticvoidmain(String[]args){  System

终于有篇看的懂的 B 树文章了!

索引,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述完整。本文就来从头到尾介绍下数据库的索引。索引是一种数据结构,用于

尴尬了!四分之三的Sybase/ASE用户无意迁往SAP HANA

SAP战略,很大一部与SAP HANA有关。SAPHANA是SAP在2010年发布的一款产品,其全称是SAPHighPerformanceAnalyticApplication,简称SAPHANA,内

(PPT 下载,来了!)DTCC2019 中国数据库技术大会见证实录

2019年5月8日-10日,DTCC2019第十届中国数据库技术大会历时3天,圆满收官。作为国内顶级的数据领域技术盛会,共有23个技术场次,邀请超过125名专家,包括来自阿里、京东、苏宁、滴滴出行、百

能直接下载了!微软最爽命令行工具登陆Windows 10,GitHub标星已破4万6

乾明发自凹非寺 转自量子位 |公众号QbitAI微软正式放出命令行工具WindowsTerminal。这个在发布之际就引得开发者大呼“WoW!Awesome!MyGod!”,甚至引得不少人当场表态买P

Oculus CTO、传奇程序员John Carmack宣布离职:我要去搞AI了!

大数据文摘出品OculusCTO,也是游戏程序员大神、开源软件倡导者JohnCarmack昨天在Facebook上宣布,将辞去公司CTO职位,只担任咨询身份。而对于下一步的打算,John也毫不掩饰,直

终于有人把中台说清楚了!

前一段朋友圈被中台刷屏了,那么今天我们来说说中台!缘起百度指数搜索“中台”,可以发现,中台一词前几年几乎都没有搜索,反倒是今年5月21号开始蹭蹭往上涨!百度指数仔细搜索了一下原来5月21号腾讯召开了全

我是程序员,每一天都太难了!

互联网圈子里有一个神奇的群体——程序员。他们每天穿着格子衫,背着双肩包挤地铁,一到公司就陷入了“打代码-喝水-上厕所-打代码-喝水-上厕所”的死循环。热(jia)爱(ban)工(yan)作(zhong

10后小学生都能教你学编程了!低龄编程的下限在哪?

大数据文摘出品作者:宁静最近,文摘菌经常收到读者留言,说b站上有一个10后小学生在教编程。小学生???教编程???话说文摘菌小学时候还只知道玩儿贪吃蛇……在感叹长江后浪推前浪的同时,文摘菌也赶紧去这位

阿里巴巴为什么能抗住90秒100亿?看完这篇你就明白了!

1、概述本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。2、