vlambda博客
学习文章列表

高可用、无状态化、广义负载均衡设计

高可用

说到高可用,有高可用系统和高可用架构。那么什么是高可用其实就是任何人,在任何时间,任何地点,使用任何方式,访问服务都能有正确的结果,这就是高可用。

如何评估是否高可用

传统的评估方式:一段时间的停机时间占比(停机时间/总服务时间)。

2个9:一年停机时间不超过88小时;

3个9:一年停机时间不超过9小时;

4个9:一年停机时间不超过53分钟;

5个9:一年停机时间不超过6分钟;

科学评估方式:一段时间的停机,影响请求量占比(停机时间影响请求数量/总请求数据量)

不高可用原因

硬件不可靠:硬件故障,硬件生命周期

软件不可靠:系统潜在bug(系统的边缘值,极限值);系统的性能极限(目前支撑1万qps,突然来5万qps,直接把系统打垮)

微博案例分析

某个明星发微博后引起亿级流量的的转发,评论,点赞,导致微博服务打垮。

消息的存储方式:

推送(普通用户)

拉取(明星,由于关注明星的人比较多,所以采用拉取方式)

可以采用异步批量写的方式进行。

应对方案演进:

数据库读写分离

数据访问层增加redis缓存

高可用、无状态化、广义负载均衡设计

数据访问层增加本地应用缓存

无限扩容数据访问层

流量控制

降级

微服务高可用设计落地实践

服务冗余设计

无状态化设计(重点)

广义负载均衡

幂等设计

超时设计

异步设计

服务自我保护设计:限流,降级,熔断

存储冗余,存储sharding,存储缓存

架构拆分服务治理

各阶段高可用设计方案

单体架构高可用设计:数据库主从+应用灾备+lvs+keepalive

SOA架构高可用设计数据库主从+应用灾备+lvs+keepalive

水平分层架构高可用设计主从+应用灾备+lvs+keepalive

微服务架构高可用设计:参考微服务高可用设计落地实践

服务网格架构高可用设计参考微服务高可用设计落地实践

中台架构高可用设计参考微服务高可用设计落地实践

云原生架构高可用设计参考微服务高可用设计落地实践

系统停机如何保证高可用

网关具备热切换能力:在网关层控制只出不进,当不再有业务日志时,关闭网关,关闭业务逻辑层,关闭数据访问层;优雅停机。

网关不具备热切换能力:防火墙iptable控制流量只出不进,lvs,nginx层控制流量。

高可用本质:降本增效,降低损失。


无状态化

一个服务若是存储指定用户信息,另个一服务存储其他用户信息,两个服务中存储不同的用户信息,这样的设计是有状态化服务。

每个服务存储的信息都是一样的,或者都不存储用户信息,这样的服务就是无状态化服务。也就是多个服务之间都是对等的,不论用户访问哪个服务都是一样的处理结果。

无状态化的目的:

快速扩容服务

弹性缩容服务

无状态化案例剖析:

用户session案例

登录方式:可以使用用户名+密码或者手机号+验证码

登录成功:生成用户凭证session

那么此时用户的session应该存储在哪里呢?

服务端:每个服务都要存储(浪费服务端资源)还是hash后指定服务存储(一旦机器宕机就会出现用户无法登录)

客户端存储:app存储,cookie

外置缓存:redis存储

如何判断是否是无状态化:

行为一致性:不论访问哪个服务都是一样的行为。

数据一致性:不论访问哪个服务产生的数据都是一样的。

如何把系统做到无状态化:

个性化数据进行外置即可达到无状态化。


广义负载均衡

大流量,高并发时代各种级别的公司都需要涉及到负载均衡技术。

下面我们将从负载均衡系统,负载均衡算法,广义负载均衡案例剖析几个维度进行学习。

负载均衡系统

硬件

F5:2G内存支撑400万并发

A10

Radware

软件

lvs:四层负载,10万到50万并发

nginx:四层,七层负载,支撑10万左右并发

HAProxy:四层或7层

反向代理vs正向代理

正向代理:代理客户端访问服务,如爬虫爬网站拉取数据

流量分配

负载均衡算法

dubbo loadbalance

Random随机,按权重设置随机概率

RoundRobin按约定的权重设置轮询比率

ConsistentHash一致性hash,相同的参数总发到同一个服务者

广义负载均衡案例剖析

完整的故障处理恢复机制

故障自动发现:服务探活,业务探活(服务提供一个默认的查询接口,简单的进行查询数据库操作,接口在配置中心配置,探活系统从注册中心拉取服务实例列表,进行定时探活。一分钟或指定时间内多次非200状态则确定服务实例死亡)

故障自动摘除:从注册中心摘除,cmdb(资产管理系统)摘除机器;保留故障现场(dump,sleep(30s),进行二次dump,上报dump数据,kill -15)

请求自动重试

服务恢复自动发现

水平分层架构案例

业务逻辑层故障(从下游进行保护)网关层通过注册中心发现(zookeeper,etcd,consul)

服务熔断机制(从上游进行保护):Netflex OSS Hystrix;熔断后恢复机器,物理机/虚拟机(kill press),容器化(kill press,kill docker kill pod)