关于高可用服务的优化
高可用服务
1. 负载均衡
负载均衡的目的是尽量让流量均匀调度到目标机上,常用均衡算法有轮训、随机、hash、加权轮训、最小连接数。这些算法的核心都是基于QPS的,但是对于每个请求,影响它的因素有:请求处理成本、物理机性能。请求处理一条数据和处理1000条数据对机器的消耗完全不一样;对于机器性能来说,一般软件都会有内存池的概念,当内存积累到一定程度时再释放,这就会造成CPU出现毛刺。
对上述几种算法而言,不论哪一种,我们都是在尽量挑选最闲
的机器,但这种闲只是表面的,通过请求数来反映的,机器真正的负载我们不知,我们缺少对机器的全局认知。
基于上述情况,出现了一种算法the Choise of 2
算法。该算法的核心是随机选取两个节点就行打分,打分的依据是节点的CPU、延迟等,得分高的节点作为本次请求要发送的节点,对于机器CPU、内存等参数,则通过RPC的时候传过来。
对于新启动的节点,使用一个常量惩罚者,用探针方式最小化放了,进行预热。
对于得分较低的节点,为了防止其永久进入黑名单而无法恢复,可以使用统计衰减的方式,定时最小化一部分流量进去,刷新惩罚值,让节点逐渐恢复到初始状态。比如,可以对最近没有处理请求节点每10分钟发送一个请求,进行探针测试。
2. 限流
一般限流都是基于QPS的,但是处理每个请求消耗的机器资源是不一样的,这也就是QPS欺骗,这种线路会有两个问题
- 请求成本不同,比如A请求中带了1条数据,B请求中带了1000条数据。
- 静态阈值难以配置,需要通过压测的方法测试阈值,但是压测的请求又不同于线上真实请求。
3. 过载保护
4. 重试策略
如果是多层级联服务,在每一层都重试,就会导致重试风暴,应该避免。
解决方法: - 只在失败的层级重试,如果重试失败,则返回给上一层失败原因,上层收到错误码后不再重试,直接放行。 - 限制重试次数,只针对少了的请求(10%)进行重试,其他流量直接放行。 - 随机化重试周期
5. 超时
多层级联服务系统中,各个服务的超时时间应该是逐级递减的。
上一篇: 数据库事务中MVCC的实现
下一篇: redis源码之线程模型