嚣张:分库分表就能无限扩容吗?
作者:莫那鲁道
来源:thinkinjava.cn/2019/01/fkfb/
前言
正常情况下的服务演化之路
单元化
最后
前言
像我这样的菜鸟,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 JVM 的疑问,当工作几年后,对服务的可用性,可扩展性也有了新的疑问,什么疑问呢?其实是老生常谈的话题:服务的扩容问题。
正常情况下的服务演化之路
让我们从最初开始。
单体应用 每个创业公司基本都是从类似 SSM 和 SSH 这种架构起来的,没什么好讲的,基本每个程序员都经历过。
RPC 应用 当业务越来越大,我们需要对服务进行水平扩容,扩容很简单,只要保证服务是无状态的就可以了,如下图:
当业务又越来越大,我们的服务关系错综复杂,同时,有很多服务访问都是不需要连接 DB 的,只需要连接缓存即可,那么就可以做成分离的,减少 DB 宝贵的连接。如下图:
我相信大部分公司都是在这个阶段。Dubbo 就是为了解决这个问题而生的。
如果你的公司产品很受欢迎,业务继续高速发展,数据越来越多,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 规则。这样,所有的组件都能保持一致的规则,从而正确的访问到数据库。如下图:
到这里,我们终于解决了无限扩容的问题。
最后
本文从单体应用开始,逐步讲述了一个正常后台的演进历程,知道了分库分表并不能解决“无限扩容” 的问题,只有单元化才能解决这问题。而单元化则带来更多的复杂性。但是好处不言而喻。
单元化带来的更多的思路。
有了单元化,解决了无限扩容的问题,但是我们还没有考虑单点的问题,即服务的可用性。要知道,我们这里的数据库都是单点的。
往期推荐
Netty 实现百万连接的难点和优化点
面试官:说一下线程池内部工作原理?
产品需求:用java做一个长链接转短链的微服务
【elasticsearch】数据早8小时or晚8小时,你知道为什么吗?附解决方案
java项目,这样优雅的处理 Exception 实践,客户都给你点赞
大实话:等电梯的时候,90%的程序员都想过调度算法
SpringBoot实现API接口多版本支持
太多项目使用MyBatis,你理解它的架构和原理吗?
嚣张:分库分表就能无限扩容吗?相关推荐
- 值得深思的问题——分库分表就能无限扩容吗?
点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者:莫那-鲁道 来源:http://t.cn/EKNnkht 刚开始工作的菜鸟,总会有各种疑问 ...
- 分库分表就能无限扩容吗?
- 目录 - 1.正常情况下的服务演化之路 2.单元化 3.最后 - 前言 - 像我这样的菜鸟,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 ...
- 分库分表就能无限扩容吗,解释得太好了!
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 莫那·鲁道 来源 | http://rrd.me/emHsn 像我这样的菜鸟,总会 ...
- 扎心一问:分库分表就能无限扩容吗?
作者:莫那 鲁道 thinkinjava.cn/2019/01/15/2019-01-16-fkfb/ 让我们从最初开始. 1.单体应用 每个创业公司基本都是从类似 SSM 和 SSH 这种架构起来的 ...
- 分库分表就能无限扩容吗,解释得太好了
作者:莫那·鲁道 原文:http://thinkinjava.cn/2019/01/fkfb/ 前言 像我这样的菜鸟,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 JVM ...
- 分库分表就能无限扩容吗
前言 像我这样的菜鸟,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 JVM 的疑问,当工作几年后,对服务的可用性,可扩展性也有了新的疑问,什么疑问呢?其实是老生常谈的话题 ...
- 扎心一问:分库分表就能无限扩容吗
前言 像我这样的菜鸟,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 JVM 的疑问,当工作几年后,对服务的可用性,可扩展性也有了新的疑问,什么疑问呢?其实是老生常谈的话题 ...
- 基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案
一.项目结构 1.工程结构 2.模块命名 shard-common-entity: 公共代码块 shard-open-inte: 开放接口管理 shard-eureka-7001: 注册中心 shar ...
- 数据库面试 - 如何设计可以动态扩容缩容的分库分表方案?
数据库面试 - 如何设计可以动态扩容缩容的分库分表方案? 面试题 如何设计可以动态扩容缩容的分库分表方案? 面试官心理分析 对于分库分表来说,主要是面对以下问题: 选择一个数据库中间件,调研.学习.测 ...
最新文章
- windows系统下Python环境的搭建及Selenium的安装
- 分析隐藏在比特币区块链中的Pony CC服务器
- mysql分库主键_分库主键设计-Mysql
- 网络推广外包中目标用户习惯对企业网站设计与开发有重要影响
- 同时买票是怎么实现的_刷脸进站,语音买票!广州地铁这波操作666~
- 浅谈sql中的in与not in,exists与not exists的区别以及性能分析
- vim 分屏 最大化_5分钟学会Vim分屏操作方方面面
- Kruskal+LCA【p2245】 星际导航
- 给大家推荐一款高大上的代码高亮插件(sublime,github风格)——highlight.js
- 大快人心!和P2P网贷彻底说再见
- UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)
- JUST——简单转换下的JSON
- 如何将零填充到字符串?
- C#操作明华澳汉读写器读写M1卡往扇区块写入读取值小结
- 大数据平台--调度系统
- 中文词典的扩充和组织
- 异常来自nbsp;HRESULT:0x80040215
- java-net-php-python-23jspm在线学习设计计算机毕业设计程序
- 谷歌是如何跌下神坛的?
- 回归预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络多输入单输出回归预测
热门文章
- macOS SwiftUI 指示器组件规范之 01 液位指示器Level Indicators
- 机器人杆长标定_机器人标定系统
- Hrbust 2294 修建传送门【思维】
- 运行Android Studio,一直提示:Error running app: Instant Run requires 'Tools | Android | Enable ADB integrat
- 视频资源网站采集-视频资源API采集教程
- sudo apt-get update 时遇签名过期错误 “The following signatures were invalid”
- Android 端的基于TCP的小型服务器_超级简单
- 电脑发出很大的嗡嗡声_跟踪嗡嗡声的十大方法
- Debian系安装rabbitmq
- vue2知识点:数据代理