基本概念
系统高可用
所谓的系统高可用,主要是指两个方面
- 系统的健壮性 不允许系统出现单点故障
- 系统的处理能力 可以提高系统的处理能力,保证系统的运行效率
如果要实现系统高可用,有以下几种方式
集群
什么是集群?
以前部署项目是使用一台服务器来处理,现在使用多台服务器来保障系统的运行
主备模式
有一个主要节点提供服务,另外的备用节点主要处于待命状态,平时不提供服务,一旦主节点出现问题,备用节点启动运行,保障系统的正常运行
主备模式相对来说比较浪费,如果主节点一直没有出现故障,那备用节点一直都在待命,不干活
主从模式
集群中有很多节点,集群中的每个节点都会提供服务,只不过身份、角色不一样,提供的功能有可能不一样
上图描述,为了减轻服务器的压力,把大部分的读请求都放在了从节点,但如果是高实时的读请求(比如股票的价格),还是放在了主节点
高可用模式
这种模式在项目中经常使用,比如对于一个秒杀系统做的一个集群,其中所有的节点是没有主次之分的,无论选择哪台服务器都可以正常的提供服务,就算有服务器宕机了,其他服务器还是可以正常提供服务
高可用集群中的节点角色是一样的,提供的功能也是一样的
提高并发度,吞吐量
避免单点故障
分布式
其实所谓的分布式只是一种系统部署的方式
比如一个业务系统,部署一个业务系统需要的环境(Tomcat + MySQL),如果我们把Tomcat和MySQL两个部署在同一台服务器上,我们称之为单机部署,这样两者之间的网络开销可以直接忽略(直接走127.0.0.1不会消耗网络)
如果把Tomcat和MySQL部署在不同的服务器, 我们称之为分布式应用, 因为应用服务器和数据库服务器之间需要走网络通信, 当然, 我们把所有需要走网络这种部署方式称之为分布式应用
微服务
微服务一定是分布式, 但是分布式不一定是微服务 所谓微服务指的是我们系统的一个架构设计方式
以前我们把所有的功能都放到一个项目(应用中), 这种方式我们称之为单体应用 随着项目开发的功能变多, 架构变强, 我们需要根据模块来进行划分, 每个模块之间通过服务之间的网络调用, 我们称之为微服务架构
主要好处
- 模块化部署,避免一个模块宕机,导致整个系统不可用
- 可以单独针对高并发的场景(秒杀,订单)扩容,添加服务器
- 方便开发人员独立开发,互不干扰
分布式协调服务
所谓分布式:主要是指我们的一个整个的应用是由部署在多个机器上的服务去统一完成, 对于部署在多个机器上的应用, 通常是有不同的角色,比如有Master和Slave角色的区分,对于Zookeeper集群, 也会有多个节点,主要包括leader节点和follower节点
所谓协调服务: 主要是指我们的Zookeeper去在我们的分布式系统中充当一个协调者的角色,帮助我们的具体的业务系统之间的相互协调,保证系统的正常运行
Zookeeper应用场景
服务器在线感知
通过上图的例子来简单理解下这个场景
- 秒杀服务启动的时候,向zookeeper进行注册
- 在zookeeper动态创建节点(存储相关信息)
- 客户端(服务调用者) 连接zookeeper,注册(绑定)节点改变事件,获取服务的地址列表信息(不会每次都发请求去注册中心获取,只有在收到到节点改变才会去请求),然后把地址列表信息缓存在本地
- 随机选择一台服务器,发送秒杀服务请求
- 如果一台服务器(server03)宕机了,zookeeper会发现服务器宕机(心跳机制,socket连接),然后zookeeper就会将宕机的服务器对应的地址信息移除掉
- 当zookeeper移除掉对应的地址信息,会通知客户端进行数据更新
- 客户端获取到事件通知,重新获取最新的数据
主从协调
通过上图来介绍该场景
- 首先两台服务器server01 server02启动,并且都在zookeeper进行注册,写入相关信息/server/server01,server02
- 两台服务器都判断一下自己写入的数据,是否是第一条记录,如果是第一条记录,直接作为活动节点(主节点),如果不是第一条记录,就作为从节点
- 当zookeeper中的节点信息发生改变(新的节点加入,存在的节点移除),通知所有的已经绑定值改变事件的客户端,去更新最新的数据
- 当所有的服务器收到一个值改变事件,再去判断一下自己的节点是否是第一个节点,如果是,就把状态改为活动状态,反之设置为备份状态
配置管理
在我们的大型的应用中, 对于一个系统的配置会有很多需要配置的参数,比如说数据库的配置, Tomcat的线程数的配置等等, 如果我们不使用统一的配置管理中心的话, 需要在每个应用服务去进行一个单独的配置,这样操作比较麻烦,而且还容易出错,我们可以适用一个统一的配置管理
- 提供一个配置管理程序, 用于向Zookeeper中写入对应的数据, 主要包括属性名称和属性值
- 所有的服务启动的时候都去读取zookeeper中的配置信息,加载到应用程序,完成系统的正常启动
名称服务
命名服务就是指通过指定的名字来获取资源或者服务的地址。Zookeeper会在自己的文件系统上(树结构的文件系统)创建一个以路径为名称的节点,它可以指向提供的服务的地址,远程对象等。简单来说使用Zookeeper做命名服务就是用路径作为名字,路径上的数据就是其名字指向的实体。
分布式锁
- 所有的订单在生成ID之前,先去注册中心指定目录吸入数据(/lock),同时需要判断自己是否是第一条记录
- 如果是第一条记录,直接发送请求,调用ID生成器
- ID生成器接口调用完成以后,去注册中心,删除对应的节点信息
- 当zookeeper的节点信息发生变化以后,会立即通知所有的绑定该事件的订单服务器
- 当其他的订单服务器收到节点变化信息,再次判断自己是否是第一条记录
- 重复2~5的步骤