同城双活-流量分流

  1. 引言
    现阶段,在同城带宽时延问题没有经过大规模的生产实践、验证的情况下,我们只导入”白名单或1%”的小比例请求流量,进入双活环境,确保环境有效的(活的),同时能支持”容灾切换”。
 那么,请求流量如何导入双活环境?有哪些分流方法?存在什么样的问题和挑战,需要注意些什么?本文将从这些角度进行剖析。
  1. 流量分流方法
    流量分流的主要方法有:
 1、HTTP-DNS

同城双活-流量分流
    2、公网GSLB(公网DNS+公网F5出口)

同城双活-流量分流
    3、SLB(F5+Nginx)

同城双活-流量分流
    4、内网GSLB (内网DNS+内网F5)

同城双活-流量分流
    5、点对点软路由(Dubbo/SpringCloud)

同城双活-流量分流

2.1 HTTP-DNS
在口袋App渠道终端,通过HttpDNS模块,以”域名”为单位,按白名单或比例进行分流。

    说明:

        1. HTTP-DNS服务的IP地址列表,内置到APP中。App启动时,异步基于IP发送请求,获取各域名的映射IP。

        2. 前端App发送业务请求时,HTTP-DNS模块进行拦截,获得域名映射IP,替代默认的DNS服务。

        3. HTTP-DNS服务通过设备ID返回不同的映射IP,实现白名单或比例分流

        4. HTTP-DNS服务双活,前端侦测模块定时侦测,当默认环境IP不可用时,切换使用双活环境IP,进行域名映射IP获取。

    局限性:

        1.  依赖App的native能力,不适用于微信公众号/小程序、PC、纯H5等类型的终端渠道

        2.  分流策略为全局策略:以“域名”为单位,后端多个应用系统共享域名,分流策略也就多个应用系统共用,需要协同。

    优点:

        1.  相对于GSLB(公网DNS)方式,切换速度快,更改策略准实时生效

        2.  基于设备ID分流,也就是“用户”请求只会进入到同一IDC,不会随机进入不同的IDC。长远来看,对于后端应用系统处理跨IDC延时和数据一致性是有利的。

2.2 公网GSLB
通过公网域名解析服务(DNS)进行分流,公网渠道端入口的分流方法:

    说明:

       1. GSLB服务在域名解析时,按照预先配置的分流规则(按比例或根据客户端IP按地域),返回不同的域名映射IP,实现请求流量分流

       2. GSLB服务本身双活

    局限性:

        1.  公网DNS服务提供方的DNS缓存策略的不确定性,会影响分流策略的准确度,以及策略变更生效的时效性

        2.  分流策略为全局策略:以“域名”为单位,后端多个应用系统共享域名,分流策略也就多个应用系统共用,需要协同。

2.3 SLB(F5+Nginx)
SLB(F5+Nginx)通过Nginx配置动态变更,实现流量分流。内网动态分流方法。

    说明:

        1.  公网接入SLB双活,实现互联网出口双活。上图示例中,假设域名M由应用A和应用B共用,应用B尚未双活,则域名M双活流量中,请求应用B的部分,需要回到观澜IDC。

        应用B虽未做双活,但互联网出口是双活的,也是有价值的。

        2.  内网SLB,上图示例中,假设应用C通过内网SLB调用应用A,需要通过分流策略,将部分流量分流到应用A的双活集群。这种情况下,需要在SLB治理平台上,设定分流策略。

        3.  内网SLB,Nginx跨IDC连接双活集群所有节点,心跳侦测机制确保及时排除故障节点

        4.  SLB治理平台,自身双活,支持随时在线变更分流策略

    局限性:

        1.  内网系统间调用,大部分应用未使用SLB做负载均衡,大部分是直接使用F5。应用使用需要F5后面加Nginx,进行改造接入SLB

    优点:

        1. 可以按应用系统维度,设置不同的分流策略,且变更实时生效

        2. 公网基于域名分流,域名下没有做双活的应用,可以通过SLB把双活环境(福田IDC)流量导回观澜IDC,起到一个很好的补充作用

        3. 对比内网GSLB(DNS域名解析),内网SLB(Nginx)策略变更实时生效,也不依赖调用方,调用方无需重启或策略变更。

2.4 内网GSLB
通过内网DNS域名解析,结合内网F5,实现流量分流

    说明:

        1.  通过GSLB管理工具,进行分流策略管理。应用调用时,进行域名解析时,根据分流策略(按比例)返回不同IP,实现分流。

        2. 目前已实现应用双活的系统,基本上是基于此方案实现。

        应用A-->F5-->ESB-->F5(DNS分流)-->应用B

    局限性:

        1.  当调用方启用连接池时,将受到调用方连接池策略的影响。分流策略可能得不到有效执行,同时策略变更时,策略可能不能生效。

        2.  为了保证策略生效,调用方有可能需要重启。

2.5 点对点软路由
Pafa5(Dubbo),Halo(SpringCloud),是通过点对点软路由方式进行流量分流的。本章节通过Dubbo来描述这块的解决方案。

    说明:

        1.  两套环境,通过服务提供者工具,将对方环境所有服务提供者(IP列表)同步到当前环境的注册中心,保证当前环境的注册中心中,有服务提供者的全集。

        2.  当应用间进行点对点调用时,根据提供者权重或同IDC优先原则,筛选(路由选择)提供者,获得可用提供者列表,再进行负载均衡,点对点调用。

        3. 当某应用没有做双活时,双活环境将获得默认环境的提供者列表,调用回到观澜IDC(默认环境),比如:示例图中的应用C。

        4. 当其中某一环境不可用时,对方环境的服务同步者工具侦测到,自动删除对方环境的提供者。

    局限性:

        1. 需要升级Pafa5或Halo的新版本才能支持
  1. 分流存在挑战
    流量分流,是双活建设最为重要的课题之一。

3.1 同IDC优先 VS IDC权重
如果从公网渠道入口分流(如:HTTP-DNS),内网执行”同IDC优先原则”,则内网系统间,是不需要设置”分流策略”,

    但这前提条件是:主要渠道或调用方已完成双活,业务场景比较全,能有效验证双活环境,通过“同IDC优先“方式实现全链路双活。

    同IDC优先的优点:双活环境独立,流量分流由渠道入口统一控制,内部应用系统不需要单独做“分流策略”。

同城双活-流量分流
如果应用系统的调用方或主要接入渠道,都没有实现双活,那只能自己在应用系统维度设定分流策略(IDC权重),导入部分流量来验证自己的双活环境和双活能力。例如:

同城双活-流量分流
   那我们到底选用哪一种方案呢?现阶段,D+等核心业务系统,接入渠道较多,且多没有完成双活,

   可以以应用系统为维度,自已独立验证双活能力,建议先使用“IDC权重“方案,后续主要渠道及调用方完成双活后,再切换到“同IDC优先“的方案上来。

   以口袋APP为主要渠道的渠道系统,则建议以“同IDC优先“的方案,协同进行全链路的双活建设和验证。

3.2跨IDC时延和带宽问题
跨IDC时延和带宽问题,问题影响有多大,应用系统能否接受,终端用户体验能否接受,目前还没有大规模生产实践、论证过,暂时是没有答案的。

    现阶段,我们只导入极小部分流量(白名单,百分之一,甚至万分之一),进入双活环境,能验证双活环境可用,保证它是活的即可。

    长期手段,我们慢慢增加导入的流量,持续监控观察,持续改进,在实践过程中,逐步把这个问题解决掉或规避掉。

    所以,短期我们可以忽略这个问题。

3.3 白名单分流的支持
白名单分流,是比较安全的双活环境验证方式。

     目前支持白名单分流的方式,只有HTTP-DNS,且口袋APP是行内的主要C端渠道,场景也比较全。所以要充分利用这个渠道和HTTP-DNS这个方法做双活分流。

3.4 变更实时生效

    公网GSLB、内网GSLB,存在实时生效问题,如果有替代方式,尽量用替代方式。

    比如:HTTP-DNS替代公网GSLB,SLB替代内网GSLB。

3.5 B端如何分流

    B端合作方渠道,一般通过专线或公网,服务端对服务端连接进行交互,分流方式需要合作方商定。

4.总结

   前面,我们分析了各分流方法,及各自优劣,也分析了现阶段存在的挑战和问题,并给出了解决办法,有以下观点,我们再阐述一下:

    1.  现阶段,应该尽快把双活环境搭建起来。大家都搭建起来了,才能执行”同IDC优先“原则,保证双活环境独立性,并全链路双活验证。

    2.  现阶段,只要导入极小部分流量,进入双活环境,保证它是可用的,是活的,就可以了。当容灾切换时,存储手工切换,确保所有流量能即时切入双活环境。

    3.  现阶段,只导入极小部分流量进入双活环境,先忽略掉跨IDC时延和带宽问题。容灾切换后,双活环境确保没有跨IDC流量。

    4.  推荐使用:HTTP-DNS、SLB、点对点软路由(Dubbo/SpringCloud)这三种分流方法。GSLB尽量不使用。

    5.  "同IDC优先“的策略下,在渠道入口端进行分流,后端应用系统无需设定自己的分流策略,由运维统一变更和协同。

    6.  “同IDC优先“与”IDC权重“二选一,应用系统可以根据自身情况选择”IDC权重“,自己设置自身的分流策略,导入一定比例的流量进入自己的双活环境。

    7.  所有分流方法都需要同时支持这二种策略:“同IDC优先“与”IDC权重“。

    8.  现阶段,在达到目的的前提下,尽量保持架构简单,谨防过度设计

本文转载至:https://www.modb.pro/db/52907

Original: https://www.cnblogs.com/zbzSH/p/15916922.html
Author: zbzSH
Title: 同城双活-流量分流

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612987/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • muduo项目介绍

    在上一个集群聊天服务器项目中,我使用了 muduo作为网络库,然后主要实现了业务逻辑等,所以为了深入网络库的代码和实现,我跟着一位老师的代码去实现了 muduo库的基本原理和作用,…

    Linux 2023年6月13日
    0108
  • Go-channel

    (1)channel本质就是一个数据结构——队列 (2)数据先进先出 (3)线程安全,多goroutine访问时,不需要加锁,channel本身就是线程安全的 (4)channel…

    Linux 2023年6月8日
    0109
  • [SSM架构]springboot笔记

    框架基础介绍 框架概念 框架(Framework)是一个半成品软件,将所有的、公共的、重复的功能解决掉,帮助程序快速高效的进行开发,他是可重复的,可拓展的。 常见的框架&#8211…

    Linux 2023年6月13日
    091
  • java 连接 redis

    Jedis 导入对应的依赖 redis.clients jedis 4.2.3 com.alibaba fastjson 1.2.79 连接数据库 记得在本地打开 redis //…

    Linux 2023年6月7日
    095
  • JavaScript json&ajax

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。 博主…

    Linux 2023年6月13日
    098
  • 详细记录一次stampstime字段引起pxc集群脑裂

    事故回顾 运维执行导入sql,导入后收到master2和master3节点宕机的报警;检查集群状态发现master1进入初始化模式,无法读写;master2和master3已经下线…

    Linux 2023年6月14日
    086
  • redis 使用lua 生成流水号

    在实际的业务场景中,我们会用到流水号。之前的流水号做法是,使用redis的全局锁。然后对数据库进行更新,数据库更新 这个也会有一些问题,比如对于同一个流水号,多个线程去更新,由于事…

    Linux 2023年5月28日
    095
  • Redis 三种集群策略

    Redis 是单线程的,但是一般的作为缓存使用的话,速度已经足够使用。官方有一个简单测试:测试完成 50 个并发执行 100000 个请求,设置和获取的值是一个 256 字节字符串…

    Linux 2023年5月28日
    0103
  • 在使用amoeba连接数据库时,报错java.lang.Exception: poolName=slaves, no valid pools

    搭建3台MySQL服务器,完成主从复制,搭建一台amoeba服务器,完成MySQL的读写分离 问题描述: 问题1、 在服务搭建完毕后,利用客户机连接amoeba服务器登录数据库,无…

    Linux 2023年6月13日
    088
  • windows系统cmd切换盘符路径命令失效

    问题描述:比如当我在C盘想切换到D盘的某个文件夹路径下时 只是输出了那个路径 但是并没有真的切换 这时候需要再多操作一步就会成功了 Original: https://www.cn…

    Linux 2023年6月14日
    091
  • 【深度学习】RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

    报错代码: if __name__ == ‘__main__’: model = Perception(2, 3, 2).cuda() input = torch.randn(4,…

    Linux 2023年6月13日
    095
  • 如何设置 QEMU 输出到控制台并使用 Shell 脚本自动化

    如何设置 QEMU 输出到控制台并使用 Shell 脚本自动化 原文:How to Setup QEMU Output to Console and Automate Using …

    Linux 2023年5月28日
    0116
  • Redis 事务与锁

    基本操作 事务的基本操作 开启事务,设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中 multi 取消事务,终止当前事务的定义,发生在 multi 之后,exec 之…

    Linux 2023年5月28日
    084
  • ASP.NET CORE在docker中的健康检查(healthcheck)

    在使用docker-compose的过程中,很多程序都提供了健康检查(healthcheck)的方法,通过健康检查,应用程序能够在确保其依赖的程序都已经启动的前提下启动,减少各种错…

    Linux 2023年6月6日
    0120
  • WPF 切换主题使用 luna 复古版本

    本文告诉大家如何在 WPF 里面使用 luna 等复古主题 今天在 lsj 说他准备优化 WPF 的程序集时,准备删除 luna 等程序集时,找到了一段有趣的注释,发现在 WPF …

    Linux 2023年6月6日
    085
  • [Git系列] 前言

    Git 简介 Git 是一个重视速度的分布式版本控制和代码管理系统,最初是由 Linus Torvalds 为开发 Linux 内核而设计并开发的,是一款遵循二代 GUN 协议的免…

    Linux 2023年5月27日
    0147
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球