首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一种简单的Failover机制

一种简单的Failover机制

作者头像
老钱
发布于 2018-08-15 08:27:30
发布于 2018-08-15 08:27:30
1.9K0
举报
文章被收录于专栏:码洞码洞

在应用结构上有这样一个业务场景,机房里部署了多个物理数据库的Proxy无状态节点,业务端通过Proxy节点间接和存储DB交互。Proxy支持了分库分表的特性,管理下层多个物理DB,向上层提供单表抽象。为了支持高可用性,Proxy为多节点部署,业务端可以随机挑选Proxy收发消息。

这里我们讨论业务端SDK的Failover实现方案。SDK需要管理指向多个Proxy连接,每个请求都需要随机挑选某个Proxy连接进行收发消息。当Proxy都正常时,随机算法已经可以满足负载均衡了。但是Proxy是可能会突然宕机的,挂了一个Proxy节点后,SDK需要快速摘除宕机的Proxy连接,将所有的请求都转移到其它节点之上。当这个Proxy节点恢复后,又可以重新将这个节点放回Proxy列表中。

那这种快速的动态调整,SDK又该如何以最简单的方法进行实现呢?一般的思路如下

  1. 使用计数机制,当请求出现错误时,比如在一定的时间窗口里出现了N次错误,那就可以标记该Proxy已损坏,从Proxy正常列表中摘除掉该Proxy,同时在恢复列表中加入该Proxy
  2. 使用Retry机制,每隔一段时间对恢复列表中的Proxy进行重试,重试一旦正确,就立即将Proxy从恢复列表中转移至正常列表
  3. 如果所有的Proxy都损坏了,那最后一个Proxy是不可以随便摘的。如果直接摘掉了,会导致Retry窗口内服务不可用。即使Proxy快速恢复了,也需要等待Retry窗口的时间才可以检测到。一般的做法是,如果所有的Proxy都坏掉了,那请求的随机Proxy列表不再是正常Proxy列表,而是全体Proxy列表。

要对这种思路进行编码实现有一定的复杂度。比如下图是pylibmc的状态转移图,看一眼知道复杂度非同一般。

为降低复杂性,我设计了一个非常简单的方案,可以很好的解决Proxy Failover的问题,步骤如下

  1. 给每个Proxy设定一个初值,比如说1024,该值作为随机权重使用
  2. 每次请求出现失败一次,就将权值除以一个数,比如说2,数字越大,降权越快。
  3. 当权值降低到最小值,比如说1时,不再继续降权。这样可以保持坏掉的Proxy以一个极低的概率得到重试。
  4. 只要有任何一个成功的请求,就将权值恢复到初值。
  5. 当SDK通过权重随机挑选了一个Proxy进行了一个失败的请求时,将重新随机挑选Proxy进行重试,记录重试次数,直到成功为止或者重试到了一个最大次数上限,向上层抛出异常。

这种方案的优势在于不需要划分出正常列表和恢复列表,没有复杂的状态迁移,而且不需要设置额外定时器进行重试。当所有的节点都坏掉的情况下,所有的Proxy权重也还是一样的。我尝试用代码实现了这个方案,用了非常简洁的十几行代码就搞定了Failover问题。

当然这种方案也不是完美的,它的缺点体现在需要仔细控制权重参数,初始值/降权系数/最小值,特别是最小值,如果设置的太小,而SDK的QPS又太低的话,Proxy可能会长时间得不到恢复,不过这种情况也没有关系,如果QPS太小,要那么多的Proxy做负载均衡也是多余的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码洞 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
电商互联网如何做微服务治理(SOA governance)?
按Anne Thomas Manes的定义是:企业为了确保事情顺利完成而实施的过程,包括最佳实践、架构原则、治理规程、规律以及其他决定性的因素。服务治理指的是用来管理SOA的采用和实现的过程。
JavaEdge
2021/02/23
5180
Nacos
这些核心特性使得Nacos成为一个功能丰富、灵活且可靠的服务发现和配置管理解决方案,适用于构建和管理大规模的分布式系统。
疯狂的KK
2024/03/07
3860
Nacos
Redis Cluster服务平台化之路
作者介绍: 姓名:李航 github:https://github.com/lidaohang
Lucien168
2020/07/20
1K0
Redis Cluster服务平台化之路
Nginx专题(2):Nginx的负载均衡策略及其配置
前篇Nginx专题(1):Nginx之反向代理及配置详细介绍了Nginx功能之一——反向代理。本篇文章将重点介绍Nginx功能之二——负载均衡。
宜信技术学院
2019/12/05
2.5K0
新零售实战 | 压测引擎的边界突破:基于LSTM预测模型的资源动态预分配算法在新零售中的实践
消费者购物习惯的转变、线上线下融合的趋势,使得新零售平台面临着巨大的流量冲击。特别是在各类大促活动期间,平台的流量峰值可能是日常的数倍甚至数十倍。这对平台的高可用性、稳定性和性能提出了极为严峻的挑战。
叶一一
2025/05/14
2030
新零售实战 | 压测引擎的边界突破:基于LSTM预测模型的资源动态预分配算法在新零售中的实践
微服务系列 2:微服务化框架的模型和治理能力设计
紧接上一篇,微服务系列 1:微服务化框架落地的挑战和核心需求,那么基于这些核心诉求,我们整个的微服务框架的模型是如何?又该具备哪些核心的治理能力呢?通过本文来一一知晓!
Allen.Wu
2023/03/01
9050
微服务系列 2:微服务化框架的模型和治理能力设计
Nginx(八)-- Nginx+keepalived实现高可用
keepalived下载地址:http://download.csdn.net/detail/u010821757/9892484
码农小胖哥
2019/12/10
6200
Nginx(八)-- Nginx+keepalived实现高可用
Design for failure常见的12种设计思想
请求从客户端发出,到达Proxy Layer(执行一些公共的逻辑,如逻辑、流控、审计等),完成后,发往App Layer(执行具体业务逻辑),执行完毕后,发向Data Laye(进行数据持久化)。
架构精进之路
2021/09/22
9870
Design for failure常见的12种设计思想
深入理解 RPC 之集群篇
上一篇文章分析了服务的注册与发现,这一篇文章着重分析下 RPC 框架都会用到的集群的相关知识。 集群(Cluster)本身并不具备太多知识点,在分布式系统中,集群一般涵盖了负载均衡(LoadBalance),高可用(HA),路由(Route)等等概念,每个 RPC 框架对集群支持的程度不同,本文着重分析前两者--负载均衡和高可用。 集群概述 在此之前的《深入理解 RPC》系列文章,对 RPC 的分析着重还是放在服务之间的点对点调用,而分布式服务中每个服务必然不止一个实例,不同服务的实例和相同服务的多个实例
kirito-moe
2018/04/27
1.2K0
深入理解 RPC 之集群篇
B站多活容灾高可用建设思路
看文章可以知道这次故障,主要是因为SLB层面故障引起的,最终是通过多活进行服务的恢复。
春哥大魔王
2023/03/22
1.6K0
B站多活容灾高可用建设思路
微服务如何保障稳定性?
作者:fredalxin 地址:https://fredal.xin/talking-msa-msa-stability
Java技术栈
2021/05/11
1.4K0
微信后台团队最近开源力作:PhxQueue 分布式队列
腾讯开源
2017/09/19
4.9K1
微信后台团队最近开源力作:PhxQueue 分布式队列
限流系列之四:TDMQ RocketMQ 版限流机制详解与实践教程
随着分布式系统架构的普及,消息队列已成为支撑大规模、高并发在线业务的核心组件之一。TDMQ RocketMQ 版作为一款高性能、高可靠的消息中间件,通过提供稳定、低延迟的消息服务,帮助企业轻松应对业务洪峰、实现系统解耦。然而,在高并发、大流量场景下,如何合理分配资源、防止系统过载成为保障服务稳定性的关键。为此,TDMQ RocketMQ 版引入了分布式限流机制,通过动态调整客户端的发送与消费速率,确保集群在高负载情况下依然能够稳定运行。
腾讯云中间件团队
2025/04/26
2720
限流系列之四:TDMQ RocketMQ 版限流机制详解与实践教程
Redis Cluster探索与思考
Redis Cluster的基本原理和架构 Redis Cluster是分布式Redis的实现。随着Redis版本的更替,以及各种已知bug的fixed,在稳定性和高可用性上有了很大的提升和进步,越来越多的企业将Redis Cluster实际应用到线上业务中,通过从社区获取到反馈社区的迭代,为Redis Cluster成为一个可靠的企业级开源产品,在简化业务架构和业务逻辑方面都起着积极重要的作用。下面从Redis Cluster的基本原理为起点开启Redis Cluster在业界的分析与思考之旅。 基本原理
CSDN技术头条
2018/02/13
1.6K0
Redis Cluster探索与思考
Java编程解密-Dubbo负载均衡与集群容错机制
  Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
慕容千语
2019/06/11
6720
了解Dubbo配置:优先级、重试和容错机制的秘密【五】
Dubbo作为一款强大的分布式服务框架,其高级配置选项为开发者提供了更多的灵活性和控制权。就像调整一台高性能引擎的参数一样,我们将一同进入Dubbo的引擎室,深入了解配置中的奥秘,优化微服务通信的性能和可靠性。
一只牛博
2025/05/30
1010
了解Dubbo配置:优先级、重试和容错机制的秘密【五】
直播场景下-异步消息处理机制
吴文周
2023/09/01
2700
直播场景下-异步消息处理机制
阿里IM技术分享(九):深度揭密RocketMQ在钉钉IM系统中的应用实践
IM作为钉钉最核心的功能,每天需要支持海量企业用户的沟通,同时还通过 PaaS 形式为淘宝、高德等 App 提供基础的即时通讯能力,是日均千亿级消息量的 IM 平台。
JackJiang
2022/12/30
9160
阿里IM技术分享(九):深度揭密RocketMQ在钉钉IM系统中的应用实践
[源码解析] 并行分布式框架 Celery 之 容错机制
Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。本文介绍 Celery 的故障转移容错机制。
罗西的思考
2021/05/19
8960
[源码解析] 并行分布式框架 Celery 之 容错机制
ActiveMQ的断线重连机制
断线重连机制是ActiveMQ的高可用性具体体现之一。ActiveMQ提供failover机制去实现断线重连的高可用性,可以使得连接断开之后,不断的重试连接到一个或多个brokerURL。
爱撸猫的杰
2019/03/28
7.6K2
ActiveMQ的断线重连机制
相关推荐
电商互联网如何做微服务治理(SOA governance)?
更多 >
交个朋友
加入[数据库] 腾讯云官方技术交流站
数据库问题秒解答 分享实践经验
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档