高可用实践之区域路由、集群访问和负载均衡策略(五)

机房和区域对比

常见的区域层级有:

  1. 同机房(IDC)
  2. 同区域(region上海、北京等)

在RPC服务中,region是地区概念,如北京、上海、深圳等,不做流量分配,只做灾备。即在一个 region 不可用时,可以切换到另一个 region。

region层面不做流量分配的原因:一般跨region的访问延时很高,像北京到上海有30ms。正常情况下做流量分配会对服务性能造成比较大的影响。

region 不可用的定义:region 内某一服务的可用服务器数量小于一定比例。
在特定的region下,有不同的ip段,每个ip段对应概念是逻辑机房(idc),在同region下的idc,在访问速度上没有明显区别,可以忽略地理上的差异。

ldc 层面需要做流量分配,每个ldc需要定义各自承担的流量比例。

RPC请求服务节点请求流程

在RPC服务调用流程中,往往覆盖三块核心领域:

  1. 区域路由算法:根据特定的区域路由算法,选取指定区域的机器提供服务
  2. 集群访问策略:在选取特定区域后,得到服务节点集群,根据具体的集群访问策略来访问。
  3. 负载均衡选取:在选取特定区域后,得到服务节点集群后,依据负载均衡算法选择合适的节点请求

其中第二点和第三点往往是整合在一起的。

区域路由

路由基础配置

下面参考开源框架pigeon中的实现,可以基于以下配置来管理RPC服务的区域路由访问策略:

  1. pigeon.regions.route.enable: 是否启用区域路由策略

  2. pigeon.regions: 以ip网段划分区域的归属,配置示例如:region1:110.120,172.23;region2:192.168;region3:120.128,注意所有的ip段都为xxx.xxx的形式,即只保留ip高16位

  3. pigeon.regions.prefer.xxx,其中xxx是划分的区域名,如前面的region1,region2,region3,具体配置示例如:

    1. pigeon.regions.prefer.region1=region1:3,region2:1,region3:0
    2. pigeon.regions.prefer.region2=region2:10,region3:3,region1:1
    3. pigeon.regions.prefer.region3=region3:3,region1:1,region2:0

    上面配置了特定region的访问优先级策略(冒号后面为region权重,用于weight based policy)

路由算法介绍

基于不同的路由算法,服务调用方可以根据不同的需求特点来获取特定的服务提供方节点,来完成RPC服务调用。选择合适路由算法配置,可以提高RPC服务系统调用的整体可用性和调用性能。

参考pigeon框架,实现的3种调用算法包括:

  1. 自动切换区域路由 AutoSwitchRegionPolicy
  2. 基于权重区域路由 WeightBaseRegionPolicy
  3. 强制区域路由 ForceRegionPolicy

自动切换区域路由策略

  1. 按照优先级选择region中的可用client连接,当region可用率低于设置的切换阈值时,依次选择下一个优先级的region。切换阈值regionSwitchRatio默认为0.5f,即可用的client连接低于50%为region不可用。
  2. 在autoSwitch策略下,通过修改开关值isIdcFilterEnable,可以开启本region中的idc过滤,当同时满足以下3个条件会优先路由本地idc连接:
    1. 同一ip段活跃的连接数idcActive > 同一ip段总连接数idcTotal * 配置比例idcFilterThresHoldRatio
    2. idcActive > 最小阈值idcFilterThresholdLeast
    3. 同一ip段活跃的连接数idcActive > region可用连接数active * 配置比例idcFilterThresHoldRatio

基于权重区域路由

按照region权重,随机选择特定region中的可用client连接。前面通过pigeon.regions.prefer.xxx配置了客户端所在区域的优先规则,假设客户端机器所在区域为region1,则依据配置:pigeon.regions.prefer.region1=region1:5,region2:3,region3:1,会先对所有的客户端连接实例归类到3个区域。计算总权重为9,先初始化n=0到9的随机数,在regionSet中遍历region,判断n所属region权重区域,如region1=[0,5],region2=[6,8],region3=9,根据n的值,判断所属region,返回相应region的连接,以此实现基于权重的区域路由。

强制区域路由

ForceRegionPolicy可以当作是AutoSwitchRegionPolicy的简化版,ForceRegionPolicy按照配置的region优先级,根据forceRegionConf切换规则判断是否使用优先region。切换规则参见AutoSwitchRegionPolicy。两个策略的区别是ForceRegionPolicy使用了同一路由优先级配置(pigeon.regions.force.config),不针对不同的区域有不同的优先级策略(pigeon.regions.prefer.xxx),且没有idc的细化路由策略。

集群访问

对于集群的多个节点,我们通过应用相关的集群访问策略,来提高服务请求的可用性。

常见的集群访问算法包括:

  1. failfast:如果使用failfast策略,会在调用失败后抛出异常。可以同时配置重试timeoutRetry和retries属性,如果配置了timeoutRetry=true(超时重试),会在因为捕获到超时异常失败后,重试调用最多retries次
  2. failover:调用服务的一个节点失败后会尝试调用另外的一个节点,另外一个节点的选取也是通过负载均衡算法从集群中选取,也可以同时配置重试timeoutRetry和retries属性,failover和failfast的实现区别是如果配置了超时失败重试,在超时失败后进行重试时,failover选取服务端连接会排除掉之前失败的链接,而failfast不会。
  3. failsafe:调用服务的一个节点失败后不会抛出异常,返回null或默认值
  4. forking:同时调用服务的所有可用节点,返回调用最快的节点结果数据,在forking策略中,
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值