高可用、无状态化、广义负载均衡设计
高可用
说到高可用,有高可用系统和高可用架构。那么什么是高可用?其实就是任何人,在任何时间,任何地点,使用任何方式,访问服务都能有正确的结果,这就是高可用。
如何评估是否高可用?
传统的评估方式:一段时间的停机时间占比(停机时间/总服务时间)。
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)