高可用最重要的原则就是“消除单点故障”, 对应的方法是集群部署。同一个服务部署多个节点,即便某些节点故障,业务系统依然可以对外提供服务。但将单节点服务拓展为集群的关键是避免将服务的状态和机器绑定,即服务必须是无状态化的。

状态:

状态是指在调用服务时必须依赖的数据。例如,用户登录某个购物网站,登录信息会保存在服务端节点的session数据中(状态),用户再次发送请求给服务端时,服务端会依赖session数据来决定如何响应用户
(服务端会从session提取用户信息,判断用户是否有权限获取资源等)

无状态服务:

服务节点不存储或不绑定相关状态数据的服务被成为无状态服务
通常无状态服务所需的状态数据都存储在第三方,集群中的任一节点均可访问。集群中的节点没有任何差别,可随意增加或删除。
image.png

如图所示,上图有三个auth节点组成了auth服务集群,状态数据存储在第三方redis上,无论访问哪个auth节点,获得的结果都是一样的。通俗来说集群节点“只干活,不记事”

有状态服务:

服务节点存储或绑定相关状态数据的服务被成为有状态服务。典型的如mysql数据库,数据必须存在节点集群磁盘上。要实现高可用需要备份冗余,主从复制等机制。

image.png

如上图所示这是典型的有状态服务,服务器节点存储了session信息,而且每个节点存储的信息可能不一样。访问不同的web节点得到的结果也不同。例如用户第一次访问了web服务的a节点,注册并登录,此时服务端a节点将用户信息存储到session中。用户再次发起请求访问了web服务的b节点,但是b节点上session是空的,所以b节点认为用户没有登录过,于是返回信息让用户再登录一次....

无状态服务设计要点

无状态服务不存储任何数据,只是个无情的业务逻辑处理机器,所以它可以任意拓展而不影响用户。为了把服务的状态和具体节点解耦,通常要把数据保存再其他地方,例如不太重要的数据保存再redis,重要的可以放在mysql或其他分布式存储。

设计要点:
1)保证冗余部署的多个节点(进程)完全平等
2)请求提交到冗余部署的任意节点,处理结果完全一致
3)冗余节点不存储业务的上下文信息
4)仅根据每次请求携带的数据进行相应的业务逻辑处理。


千里之行
1 声望0 粉丝

SRE体系践行者