目录
1. 架构演进
1.1 单机架构
单机架构只有一台服务器, 这个服务器需要负责所有的工作.
假定现在有一个电商网站 :
当用户想要查看商品列表的时候, 有以下几个步骤 :
- 应用程序服务器通过 selct 语句发送查询请求给 MySQL 服务器;
- MySQL 服务器处理请求, 查到数据后返回给应用程序;
- 应用程序通过 Http 协议响应给用户, 显示到浏览器界面;
1.2 什么是分布式架构
--- 随着业务进一步增长, 用户量和数据量都水涨船高了, 一台主机难以应付了, 这时候就需要引入更多的主机, 引入更多的硬件资源.
一台主机的以下几个主要资源是有限的 :
- CPU
- 内存
- 硬盘
- 网络
遇到资源不够用的情况该怎么解决 :
使用上述开源的方法, 一旦引入多台主机了, 咱们的系统就可以称为是 "分布式系统" 了.
-- 引入分布式系统其实是无奈之举, 因为分布式架构下, 系统的复杂程度会大大提高, 出现 bug 的概率会变高, 进而咱们加班的概率以及丢失年终奖的概率也随之提高了!!
1.3 数据库和应用分离
前边由于硬件资源的不够用, 导致处理请求的时间过长, 或者请求错误, 所以接下来我们就可以针对应用服务器和数据库服务器分别部署在两台主机上.
于是我们可以针对不同服务器的类型, 配置不同的硬件类型. 比如说给应用服务器配置机械硬盘(便宜, 慢), 给数据库配置固态硬盘 (贵, 快), 从而达到一个更高的性价比.
1.4 引入负载均衡
由于应用服务器比较吃 "CPU" 和 "内存", 如果把 CPU 或者内存吃没了, 此时应用服务器就顶不住了. 于是我们就需要引入更多的应用服务器, 才能有效的解决上述问题.
当用户发送请求过来时, 请求会先到达负载均衡器(网关服务器), 然后负载均衡器再将请求分发给下面的应用服务器. (上图看起来是两个应用服务器, 实际上可能是多个)
那是否会出现请求量大到负载均衡器也扛不住了呢 ?
-- 虽然负载均衡器是一个 "领导", 只需要布置任务, 一般情况下, 不会说处理不过来, 但是处理不过来也是有可能的, 如果真的处理不过来了, 我们就可以引入更多的负载均衡器.
1.5 引入数据库读写分离
当我们引入更多的应用服务器时, 确实能够处理更高的请求量了, 但随之数据库服务器, 要承担的请求量也就更多了, 那怎么办呢 ? 还是要么开源, 要么节流. 由于节流门槛高, 更复杂, 于是我们可以引入更多的机器.
1.6 引入缓存
由于数据库天然有个问题, 响应速度 "慢" !! 不管怎么进行分库, 它终究是要从硬盘读取数据, 而读硬盘在某些场景下是接受不了的, 所以为了更进一步的提高数据访问效率, 还可以将数据进行 "冷热" 拆分, 其中热点数据放到缓存中, 而缓存的访问速度往往比数据库快很多.
此时读数据读的又快, 同时数据库服务器压力又小!!
【问题】缓存和数据库中存在数据同步, 数据一致性问题 ?
1.7 数据库分库分表
咱们引入分布式系统, 不光要能够应对更高的请求量(并发量), 同时也要能够应对更大的数据量. 请求量咱们目前解决了, 那么是否可能会出现, 一台数据库服务器已经存不下数据了呢 ? 答案无疑是肯定的. 虽然一台服务器存储的数据量可以达到几十个 TB, 即使如此也可能会存不下, 比如 : 短视频. 于是我们就需要针对数据库进行分库分表.
最初我们的架构是一个数据库服务器里头有多个数据库(create database...), 而分库就相当于引入多个数据库服务器, 每个数据库服务器存储一个或者一部分数据库.
【对应上图】 用户表由一个主服务器来存, 然后引入多个从服务器, 商品表由一个主服务器来存, 然后引入多个从服务器......
注意数据库的分库分表操作解决的是数据量过大的问题, 而不是并发问题. 另外数据库分库分表如何实现, 还是要结合实际的业务场景来展开.
1.8 微服务架构
回到应用服务器上面来, 咱们之前的应用服务器, 一个服务器程序里面做了很多的业务 : 用户,商品,交易等等. 这就可能导致这一个服务器的代码变得越来越复杂. 为了更方便于代码的维护, 就可以把这样的一个复杂的服务器, 拆分成更多的, 功能更单一的, 但是更小的服务器. 于是我们就可以引入微服务!!
-- 目的 --> 引入微服务是为了解决 "人" 的问题!!
那么啥时候会涉及到人的问题 ?? --> 大厂
如果是小公司, 就那么几个, 十几个开发, 此时搞微服务就没太大的必要了.
【引入微服务的代价1】系统的性能下降
要想保证性能不下降那么多, 就只能引入更多的机器, 更多的硬件资源, 换句话来说就是 "充钱"!!, 所以说为什么大厂要搞微服务. 不过目前的硬件水平还是很给力的, 网卡现在有个 "万兆网卡", 它的读写速度已经能超过硬盘的读写速度了, 哪怕是在固态硬盘面前, 万兆网卡依然有优势, 所以有了万兆网卡, 虽然系统的性能会有所下降, 但也不至于下降太多.
-- 万兆网卡 [贵] --
使用万兆网卡虽然有防止性能下降过多的效果, 但是不是光一个万兆网卡就完事了, 首先万兆网卡就很贵了, 其次它还得配备万兆交换机, 万兆路由器, 甚至还要配备万兆带宽的网线, 这一套装备下来可得花不少钱, 所以说微服务可不是一些中小公司折腾的起的, 还得是大厂.
【引入微服务的代价2】系统的复杂程度提高, 可用性受到影响
🍁微服务的优势
总言之, 微服务既有它的优势, 也有它的劣势, 具体怎么搞, 还得根据业务场景, 还得根据公司的钞能力!!
2. 分布式系统下的常见概念
应用 (Applicaction) / 系统 (System)
一个应用就是一个组, 或者说服务器程序
模块 Module / 组件 (Component)
一个应用里面有很多个功能, 每个独立的功能, 就可以称为是一个模块/组件
分布式 (Distributed)
引入多个主机/服务器, 协同配合完成系列的工作 (物理上的多个主机)
集群 (Cluster)
引入多个主机/服务器, 协同配合完成系列的工作 (逻辑上的多个主机)
中间件 (Middleware)
和业务无关的服务(功能更通用的服务)
可用性 (Avaliablility)
系统整体可用的时间 / 总的时间 // 一个系统的第一要务
响应时长 (Response Time RT)
处理一次请求需要消耗多长时间. 用于衡量服务器的性能.
吞吐 (Throughput) VS 并发 (Concurrent)
衡量系统处理请求的能力.也是用来衡量服务器的性能的.