以下文章来源方志朋的博客,回复”666“获面试宝典

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

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

让我们从最初开始。

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

  2. 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 规则。这样,所有的组件都能保持一致的规则,从而正确的访问到数据库。如下图:

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

最后

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

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

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

来源:thinkinjava.cn/2019/01/fkfb/

热门内容:没错,使用 Nacos 踩坑了
Java这个高级特性-泛型,很多人还没用过!
面试官问:MySQL 的自增 ID 用完了,怎么办?
王者荣耀中一个英雄是怎么被产生的?
饿了么CTO:“不能被烂用的框架不是好框架”!
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

阿里面试题:分库分表无限扩容后的瓶颈以及解决方案相关推荐

  1. 一种可以避免数据迁移的分库分表scale-out扩容方式

    原文地址:http://jm-blog.aliapp.com/?p=590 目前绝大多数应用采取的两种分库分表规则 mod方式 dayofweek系列日期方式(所有星期1的数据在一个库/表,或所有?月 ...

  2. 使用nhmicro使分库分表支持排序后的分页查询

    2019独角兽企业重金招聘Python工程师标准>>> 常见的在创建数据时根据规则分库分表保存,查询时往往只支持按照id进行查询. Nhmicro(开源地址为 https://git ...

  3. 数据库面试 - 如何设计可以动态扩容缩容的分库分表方案?

    数据库面试 - 如何设计可以动态扩容缩容的分库分表方案? 面试题 如何设计可以动态扩容缩容的分库分表方案? 面试官心理分析 对于分库分表来说,主要是面对以下问题: 选择一个数据库中间件,调研.学习.测 ...

  4. 动态扩容缩容的分库分表方案

    1.面试题 如何设计可以动态扩容缩容的分库分表方案? 2.面试官心里分析 (1)选择一个数据库中间件,调研.学习.测试 (2)设计你的分库分表的一个方案,你要分成多少个库,每个库分成多少个表,3个库每 ...

  5. 如何设计可以动态扩容缩容的分库分表方案?

    面试题 如何设计可以动态扩容缩容的分库分表方案? 面试官心理分析 对于分库分表来说,主要是面对以下问题: 选择一个数据库中间件,调研.学习.测试: 设计你的分库分表的一个方案,你要分成多少个库,每个库 ...

  6. 经典面试题 之 分库分表

    分 库 分 表 1.为 什 么 要 分 库 分 表 ( 设 计 高 并 发 系 统 的 时 候 , 数 据 库 层 面 该如 何 设 计 ) ? 用 过 哪 些 分 库 分 表 中 间 件 ? 不 同 ...

  7. 高薪程序员面试题精讲系列96之分库分表了解吗?你项目中用到过吗?怎么用的?

    一. 面试题及剖析 1. 今日面试题 分库分表了解吗? 有哪些分库分表的实现方案? 你项目中用到过分库分表吗?怎么用的? 数据库有没有进行过分区? 2. 题目剖析 现在我们出去面试时的现状,真的很贴合 ...

  8. 分库分表之后,主键的处理方法

    面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全 ...

  9. 数据库面试 - 分库分表之后,id 主键如何处理?

    数据库面试 - 分库分表之后,id 主键如何处理? 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后, ...

最新文章

  1. 未找到beta版怎么解决_刚刚,谷歌正式发布Android 11 Beta版,带来多项重磅更新...
  2. iOS架构-静态库.framework手动打包及脚本化打包(5)
  3. python怎么读取txt文件并统计其字数-python计算文件的行数和读取某一行内容的实现方法...
  4. BZOJ5137lg4081(广义后缀自动机,set启发式合并)
  5. ARM Cortex-M3相比于ARM其他系列微控制器的优势和特点
  6. JPA技巧:避免N + 1选择问题
  7. android 崩溃捕获框架,DefenseCrash
  8. 挑战摩尔定律极限,揭秘阿里云神龙的封神之路
  9. linux重启配置文件,rEFInd启动管理器配置文件详解
  10. 语音识别双十一优惠活动
  11. 每日算法系列【LeetCode 312】戳气球
  12. 崛起于Springboot2.X之集成单机Redis(14)
  13. 解决OSError: [Errno 22] Invalid argument:C:\\Windows\\Fonts\\simhei.ttf\u202a
  14. 说明波特率和比特率的关系---再谈一下编码的关系
  15. Python文本分析 jieba
  16. 如何提高c语言编程能力,如何快速提高自己的编程能力
  17. vscode 编写html 浏览器显示 空白 白屏
  18. SQLyog Ultimate最流行的数据库管理工具之一
  19. 【Spring Boot】21.集成elasticsearch
  20. java三层、四层和五层结构介绍

热门文章

  1. ROS nodelet的使用
  2. 反射 -- 通过字符串操作对象中的成员
  3. WannaCry的UWP版,哈哈哈
  4. 测试,发布,质量保障,用户体验
  5. 安卓学习-界面-ui-ListView
  6. Jzzhu and Chocolate
  7. myeclipse中安装svn插件
  8. 【ACM】LightOJ - 1010 Knights in Chessboard(不是搜索...)
  9. 高中计算机个人总结怎么写,毕业生自我总结范文
  10. 赠书 | GNN 模型在生物化学和医疗健康中的典型应用