0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

电子工程师 来源:lq 2019-02-11 15:13 次阅读

前言

像我这样的菜鸟,总会有各种疑问,刚开始是对 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 请求的数据库一定是在这个应用的。

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

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

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

最后

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

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ssm
    ssm
    +关注

    关注

    0

    文章

    14

    浏览量

    11355
  • 程序员
    +关注

    关注

    4

    文章

    948

    浏览量

    29743

原文标题:扎心一问:分库分表就能无限扩容吗

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问当该音频运放的输出开路时,正常情况下Vout电压是接近Vcc的吗?

    请问当该音频运放的输出开路时,正常情况下Vout电压是接近Vcc的吗? (此时输入V+和V-正常) 如果可以的话,能否从内部结构层面上解释一这种情况下Vout的数值?
    发表于 08-20 06:37

    请问正常情况下芯片的操作顺序是什么?

    你好:我现在正在调试DAC161S997片子,现在有个疑问,正常情况下芯片的操作顺序是什么啊?也就是在输出电流值之前要做哪些工作啊?
    发表于 06-18 09:13

    NRF24L01模块的status正常情况下有几种状态?

    NRF24L01模块的status正常情况下 有几种状态。status正常的值是多少
    发表于 07-21 04:31

    正常情况下家用台式电脑电源应该怎样选择呢

    电脑的心脏哟。正常情况下家用台式电脑电源应该怎样选择呢?应该是根据CPU、显卡的满载功耗,再加上一二百瓦就足够了
    发表于 12-27 08:12

    常情况下双面沉金PCB线路板有哪些优势?

    常情况下双面沉金PCB线路板有哪些优势?
    发表于 04-14 15:20

    零线在什么情况下有电?如何预防?

    关于正常情况下零线是否有电,很多人都会对此有所争论。关于有电没电,其实是人们对带电的概念混淆,只是从个人观点认为其有电或者没电。
    的头像 发表于 09-21 14:42 5788次阅读

    零线在什么情况下有电 如何预防

    关于正常情况下零线是否有电,很多人都会对此有所争论。关于有电没电,其实是人们对带电的概念混淆,只是从个人观点认为其有电或者没电。
    的头像 发表于 01-18 17:06 4181次阅读

    正常情况下零线到底有没有电?什么时候零线是有电的

    关于正常情况下零线是否有电,很多人都会对此有所争论。反正就两个观点,一个有电;一个没电。关于有电没电,其实使人们对带电的概念混淆,只是从自己单独的观点认为其有电或者没电。
    的头像 发表于 07-28 10:02 1.9w次阅读

    变频电动机在什么情况下要选用

    正常情况下交流异步电动机在选配变频器时,电动机不需要进行更换,这主要是为了减少投资,但在以下要求的场合,必须选用变频电动机。
    发表于 07-05 10:14 3020次阅读

    什么情况下使用示波器

    示波器可以把我们看不见的电信号变换成看得见的图像,方便来研究各种电现象的变化过程。那么什么情况下使用示波器呢? 使用示波器进行测量需要涂有荧光物质的屏面、主机、探头配置和稳定的信号。示波器一般都是
    的头像 发表于 02-01 11:00 5644次阅读

    为什么短路情况下电流回上升?

    为什么短路电流这么大,还得从欧姆定律I=U/R说起。在正常情况下,无论是感性负载、容性负载,还是阻性负载,都存在一定的感抗、容抗和阻抗。一旦它们发生故障或短路,感抗、容抗和阻抗都为零,交直流电压都加到感抗、容抗和阻抗都为0的负载上,除了导线电阻,它当然是接近电源的电动势。因此,短路电流很大。
    的头像 发表于 06-27 14:49 1819次阅读
    为什么短路<b class='flag-5'>情况下</b>电流回上升?

    应急灯什么情况下才会亮?

    应急灯什么情况下才会亮? 应急灯指的是电源发生故障时,正常照明无法使用的情况下,启动的照明灯。比如说因为火灾导致正常照明系统失效时,消防疏散照明灯、消防应急照明灯会自动亮起,起到疏散人
    的头像 发表于 07-25 13:57 1.4w次阅读

    断路器的作用、结构及异常处理方法

    正常情况下:切断和接通正常情况下的空载电流和负荷电流
    的头像 发表于 07-27 14:46 1984次阅读
    断路器的作用、结构及异常处理方法

    请问什么原因导致在匹配正常情况下,插损出现周期性谐振?

    带状线插损出现谐振的原因?请问什么原因导致在匹配正常情况下,插损出现周期性谐振? 带状线插损是指带状线(stripline)结构中信号传输过程中的信号损耗,通常是由于信号在传输过程中遇到电磁波的阻力
    的头像 发表于 10-20 15:02 1120次阅读

    什么情况下会产生零序电流

    零序电流是指在三相电力系统中,三相电流的矢量和不为零的情况。在正常情况下,三相电力系统中的三相电流是平衡的,即三相电流的矢量和为零。但是,在某些特殊情况下,三相电流的矢量和不为零,就会产生零序电流
    的头像 发表于 07-15 14:53 2756次阅读