一、系统高可用(High Availability)
(1) 啥是 “高可用” ?
高可用的目的:保障业务的连续性。实现在用户眼里,业务永远是正常对外提供服务的。
一个 SpringBoot 项目(apple.jar)被部署到了服务器上运行。可向其发送网络请求获取网络资源。随着请求数量的逐渐增多,服务器宕机(死机)的可能性也越来越高。 若一个服务器宕机会导致该服务器上的某个系统直接无法被访问,则不是高可用的项目,便产生了单点故障。单点故障:服务器与项目共生。服务器生,项目活;服务器挂,项目死。
高可用希望实现两个目标:
① 系统的健壮性,不允许出现单点故障
② 提高系统的处理能力,保证系统的运行效率
(2) 集群
服务器就是计算机,计算机就是服务器。
高可用:项目依赖于多台服务器,某台服务器宕机不会导致项目无法提供服务
集群(cluster):一组 相互独立的、通过高速网络互联的计算机的集合。
- 多台计算机构成一个组,它们被一种 单一系统的模式 加以管理
- 一个客户向集群服务器发送请求时,集群(多台计算机的集合)像是一台独立的服务器一样
- 集群模式:多台计算机的组合方式
① 主备模式
- 多台服务器,其中有 1 台为主服务器。正常情况下由主服务器提供服务,主服务器处于 active 状态
- 除主服务器之外的都是备用服务器。备用服务器平时不提供服务,处于 standby(待命、后备人员)状态
- 若主服务器出现故障、若主服务器宕机,挑选众多备用服务器中的一台作为主服务器继续提供服务
② 主从模式
- 多台服务器,每台服务器都提供服务
- 服务器的功能(角色)可能不一样
③ 高可用模式
Queries-per-second:单个进程每秒请求服务器的成功次数(每秒查询率)
- 多台服务器,每台服务器的角色和功能都一样
④ 总结
主备集群:避免单点故障
主从集群:避免单点故障;提高并发度;吞吐量
高可用集群:避免单点故障;提高并发度;吞吐量
(3) 分布式
- 分布式是一种系统部署的方式
上图部署应用的方式是【单机部署】
- 应用服务器(Tomcat)和数据库服务器(MySQL)部署在同一台服务器上
- Tomcat 和 MySQL 沟通的网络开销很小
- Tomcat 和 MySQL 共享服务器的内存空间
上图部署应用的方式是【分布式部署】
- 服务器之间通过网络访问(存在网络开销)
- 应用服务(Tomcat)和数据库服务器(MySQL)被部署在不同的服务器上
- Tomcat 和 MySQL 独享自己所在服务器的内存空间
(4) 微服务
- 微服务是系统的一种架构设计方式
- 微服务一定是分布式,但分布式不一定是微服务
上图把一个应用全部的功能置于同一个项目、同一个应用、同一个 jar 包中,这是单体应用。
上图根据模块进行划分,每个模块通过服务之间的网络调用进行访问,是微服务架构。
(5) 分布式和微服务的对比
① 单体架构所有的模块全都耦合在一块。代码量大,维护困难。微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
② 单体架构所有的模块都共用一个数据库,存储方式比较单一。微服务每个模块都可以使用不同的存储方式(如有的用 redis,有的用 MySQL),数据库也是单个模块对应自己的数据库。
③ 单体架构所有的模块开发所使用的技术一样。微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
二、分布式应用
大数据时代,将会面临三个重大的问题:① 海量数据如何存储?② 如何对海量数据进行运算?③ 高并发的请求如何处理?
这些问题都可通过【分布式】进行解决。分布式存储解决海量数据的存储;分布式计算处理海量数据之间的运算;分布式系统处理高并发的请求。
(1) 分布式存储
使用 MySQL 数据库可存储数据,但其存储的数据是有限的。假如 MySQL 可存储的数据是 1T,那固定了只能存储 1T 的数据,若数据容量超过 1T 就无法存储了。
HBase:Hadoop Database 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。利用 HBase 技术可在廉价 PC Server 上搭建起大规模的结构化的存储集群。【百度百科】
(2) 分布式计算
分布式计算:分而算之,把一个大的计算任务分解为多个小的计算任务进行计算操作。把小的计算任务的计算结果进行汇总,进而得到大的计算任务的结果。
上图,有一个计算海量数据中字母个数的任务。每种数据被存放在不在的服务器中,计算字母个数的代码放在 A 服务器。把每个服务器的数据都移动到 A 服务器并进行计算会非常耗费时间和性能。最好的做法是:把计算字母个数的代码移动到不同的服务器,在数据所在的服务器统计完字母个数后再把计算结果进行汇总。
一份计算字母个数的代码可能最多100M,而不同服务器上的一份数据肯定是远大于100M的,移动代码(运算)比移动数据划算。
分布式计算强调:移动运算,而不是移动数据。
(3) 分布式系统
把应用服务器(Tomcat)和数据库服务器(MySQL)部署在不同的服务器上,Tomcat 和 MySQL 之间的沟通通过网络进行。
三、分布式协调服务(以 ZooKeeper 为例)
上图,客户端若想访问秒杀服务,需要知道有那些秒杀服务器可访问;需要知道秒杀服务的动态变化(那些服务器宕机了,那些新的服务器上线了)
但实际上,客户端是没有必要知道服务器的状态的。
ZooKeeper 在分布式系统中充当协调者的角色,帮助客户端和分布式服务之间进行沟通,保证系统的正常运行。