得物彩虹桥架构演进之路-负载均衡篇

news2024/11/20 22:43:54

文 / 新一

一、前言

一年一更的彩虹桥系列又来了,在前面两期我们分享了在稳定性和性能2个层面的一些演进&优化思路。近期我们针对彩虹桥 Proxy 负载均衡层面的架构做了一次升级,目前新架构已经部署完成,生产环境正在逐步升级中,借此机会更新一下彩虹桥架构演进之路系列的第三篇。

阅读本文预计需要20~30分钟,建议不熟悉彩虹桥的同学在阅读本文前,可以先看一下前两篇彩虹桥架构演进的文章:

得物数据库中间件平台“彩虹桥”演进之路

彩虹桥架构演进之路-性能篇|得物技术

二、背景

彩虹桥目前依赖 SLB 做负载均衡和节点发现,随着业务发展流量越来越高,SLB 带宽瓶颈逐渐暴露,虽然在半年前做过一次双 SLB 改造临时解决了带宽瓶颈,但运维成本也随之变高。除了带宽瓶颈外,SLB 无法支持同区优先访问,导致难以适配双活架构。所以准备去除彩虹桥对 SLB 的强依赖,自建彩虹桥元数据中心,提供负载均衡和节点发现等能力,同时支持同区访问等能力来更好的适配双活架构。下面会详细介绍一下彩虹桥元数据中心以及 SDK 相关能力的相关细节。

三、核心名称解释

图片

四、现有架构回顾

在开始介绍彩虹桥元数据中心之前,我们先来回顾一下彩虹桥目前架构,以及存在的一些痛点。

现有架构

图片

  • 业务服务集成 SDK 通过域名访问,请求经过 SLB 转发到具体的 Proxy 节点。

  • 每个集群挂载双 SLB,SDK 通过 DNS 解析轮训路由到2个 SLB,2个 SLB 挂载不同的后端节点。

  • 每个集群部署的 Proxy 节点均为一个可用区,双活架构为集群维度多可用区部署。

  • 业务侧大多数为多可用区混布,单同一个逻辑库只会连接一个彩虹桥集群,由于彩虹桥一个集群内的节点均为同一可用区,所以业务服务-彩虹桥这条链路必然会出现一半节点跨区访问。

  • 彩虹桥集群按照业务域划分,彩虹桥集群所属业务域的 RDS 大多数都会跟彩虹桥集群同区。比如彩虹桥交易集群为i区,归属交易集群的逻辑库挂载的 RDS 大多数也都是i区。

主要痛点

  • SLB 带宽已达瓶颈(5Gb/s,历史上出现过多次 SLB 带宽达到 100%的情况),目前彩虹桥单集群挂载了双 SLB 暂时解决带宽瓶颈但仍存在痛点:

    1. SLB 扩容流程较复杂(配置监听、配置虚拟服务器组、监听绑定虚拟服务组,配置调度算法、更新域名解析的等),基于目前发布系统能力无法实现全自动化。根据之前混沌工程演练结果,SLB 扩容流程需要30分钟左右。

    2. SLB 扩容后,需要改域名解析,DNS 解析生效需要一段时间(域名 TTL 1 分钟,本地缓存10分钟),新 SLB 需要10分钟左右才开始逐渐承载流量,无法实现 SLB 快速扩容。

  • 单可用区故障时,需要人工操作切流到其他可用区集群,SLA 难以保证(目前无法自动化判定单可用区故障,且集群级别流量调度需要人工预估集群负载,难以实现自动化切流)。

  • SLB 目前支持最低权重为1/100,粒度较粗,无法支撑发布过程中的更小流量灰度需求。

  • Proxy 单个集群所有节点均为同一个 AZ,需要与下游 RDS 保证同 AZ,跨集群流量调度灵活性差,很难实现多可用区流量均衡(目前由于大部分 RDS 为 I 区,Proxy 多可用区流量非常不均衡:i区 90%/k 区流量 10%)。

五、自建元数据中心&SDK 增强

图片

元数据中心独立部署

  • 新增 Metadata 数据库,多可用区部署(需要跟集群中的 Proxy 同区)。

  • 新增 MetaCenter 服务,多可用区部署。

  • Proxy 连接所有 Metadata 数据库,注册&心跳都会写入到所有数据库。

  • MetaCenter 服务定时查询所有 metadata 数据库,基于心跳版本号和多个数据库的并集筛选出健康的节点列表存储到内存中。

  • MetaCenter 服务提供 API,查询 MetaCenter 内存中的可用节点列表数据。

  • SDK 启动时会去通过7层 SLB 访问 MetaCenter 提供的 API 拉取节点列表并存储到内存,运行中每隔 5s 更新一次。

  • MetaCenter 每次计算时如果有节点下线,通过 ARK 实时下发拉取事件给 SDK,SDK 会立刻重新拉取一次节点列表。

  • SDK 通过下发的节点列表做负载均衡,优先路由到同可用区的 Proxy 节点,其次按照节点权重轮训。

  • SDK 轮训间隔时间和节点变更事件下发开关均为可配置,实时生效。

架构详解

Metadata 数据库

图片

节点表结构设计

  • beat_version:心跳版本号,只有上报心跳时会更新。

  • config_version:配置版本号,更新权重&状态时会更新。

  • enabled:是否启用

Proxy

节点启动时

  • 注册:启动时会去所有 metadata 数据库注册当前节点,如果 node_info 不存在对应节点记录,则新增,如果存在则修改权重为初始权重。

  • 启动完成后需要调用 bifrost-admin 提供的调用节点启用 API(发布脚本)

update node_info set weight = 1, config_version = #{config_version}where cluster_name = ? and address = ?

节点运行时

  • 心跳:定时更新所有 metadata 数据库节点记录的 beat_version 字段

update node_info set beat_version = beat_version + 1 where cluster_name = ? and address = ?

节点下线

  • 调用 bifrost-admin 提供的下线 OPEN API(发布脚本)

MetaCenter( Heimdall) 

  • 启动时

初始化心跳版本号:记录所有 metadata 数据库每个节点最新 beat_version 和初始化心跳丢失次数到内存

图片

图片

  • 运行时

定时查询节点信息(3s 一次),筛选可用节点并写入到内存中,提供 OpenAPI 给 SDK 调用,每个库均执行以下操作,最终会得到每个库的可用节点列表,最后把多个 list 求并集,得到最终的可用列表,写入到内存中。

查出所有列表数据后,对比内存中的 beat_version 与数据库中的 beat_version,如不相同则更新内存,如果相同说明对应节点心跳有丢失,如果丢失次数超过阈值,则剔除此节点。

节点列表中除了 ip、端口信息外,还有权重,启用状态属性, 这些属性都属于控制流变更,如果出现2边数据库不一致场景,以 config_version 最大的为准。

图片

1.2.3.20节点与K区网络断开

图片

1.2.3.20节点宕机

如果本次计算时有节点列表变化,会下发一个变更事件到 ARK(value 为时间戳-秒),SDK 在收到次配置变更后会立刻到 MetaCenter 拉取一次节点列表,以弥补定时轮训的延时。

  • 兜底配置

MetaCenter 提供的 OpenAPI 是通过计算后存入内存的数据,为了可以人工干预节点列表,需要支持开关一键切换至人工配置的节点列表数据。

图片

SDK( Rainbow) 

  • SDK 启动时会去通过7层 SLB 拉取节点列表并存储到内存,运行中每隔5s更新一次。

    如果拉取失败,启动时报错,运行中不做任何处理,等待下次拉取。

    如果拉取的可用节点列表为空,启动时报错,运行时兜底不做任何处理,等待下次拉取。

  • 拉取的可用节点列表与内存中做对比,如果有节点被移除,需要优雅关闭对应的存量连接(如果被移除节点超过1个,则不做驱逐)。

      当可用节点数量/所有节点数量 < X%时,忽略本次变更,不更新内存中的可用节点列表。

  • 拉取的节点数据会按照可用区进行分组,分为同可用区&跨可用区2个队列

    负载均衡时优先从同 AZ 节点队列中进行加权轮训。

      当同AZ节点权重总和/所有节点权重总和 < Y%时,同 AZ 节点优先策略失效,退化为所有节点加权轮训。

      当同AZ可用节点 < Z时,同 AZ 节点优先策略失效,退化为所有节点加权轮训 。

  • 需要新增查询节点列表的监控埋点&以上三种计算结果的埋点

图片

另外 SDK 支持一键动态切换至走老架构方式(4层 SLB)

管理后台

  • 新增页面【节点管理】,用于查询&管理节点

图片

  • 新增页面【兜底节点管理】,用于管理兜底节点列表。

图片

  • 提供节点上下线 API,给发布系统调用。

修改状态会去所有 metadata 数据库执行,只有一个库成功就返回成功,如所有库都修改失败,则返回失败。

update node_info set enabled = 0, config_version = #{config_version}where ip = ? and port = ?

容灾能力

表格中的是否有影响和故障恢复时间均指 SDK-Proxy 的访问链路,Proxy-DB 链路不在范围内。

图片

  • 可用区i全部宕机举例

参考以下时间线,可在30s左右完成恢复。

图片

  • i区 Metadata 数据库故障,无影响。

图片

一些思考

Q:为什么不用 sylas(得物注册中心产品)做注册中心,而是要自建元数据中心做服务发现?

彩虹桥和 sylas 均为 P0 级别服务,对稳定性要求极高,在架构设计之初需要充分考虑到互相依赖可能带来的级联故障,在与注册中心相关同学沟通后,决定自建彩虹桥元数据中心,实现自闭环。

Q:为什么不是传统的基于 Raft 协议的三节点来实现服务发现,而是用多套数据源做 merge?

Raft 是工程上使用较为广泛的强一致性、去中心化、高可用的共识算法,在分布式系统中,适用于高一致性、容错性要求高的场景。但 Raft 协议需要维护领导者选举和日志复制等机制,性能开销较大,其次 Raft 协议相对复杂,在开发、维护、排障等方面会非常困难,反之采用多数据源求并集的方式更简单,同时也具备单节点故障、整个可用区故障以及跨区网络中断等多种复杂故障下的容灾能力。

Q:如何在 SLB 切换到新架构的过程中保障稳定性?

可灰度:支持单个上游节点粒度的灰度

可回滚:支持一键动态切换至 SLB 架构

可观测:大量埋点数据可实时进行观测,有问题可快速回滚。

图片

图片

六、总结

自建元数据中心后,将给彩虹桥带来一系列收益:

  • 应用服务通过 SDK 直接连接 Proxy 节点,摆脱了对 SLB 的依赖,解决了带宽瓶颈和额外网络开销问题,并提高了流量灰度控制的精细度。

  • 简化了扩容流程,扩容时只需增加 Proxy 节点大大缩短整个扩容时间。

  • 多可用区容灾实现自动故障转移,无需人工干预。

  • SDK 具备了同 AZ 路由能力,更好适配双活架构。

往期回顾

1.得物精准测试平台设计与实现

2.解析Go切片:为何按值传递时会发生改变?|得物技术

3.基于IM场景下的Wasm初探:提升Web应用性能|得物技术

4.实时特征框架的生产实践|得物技术

5.商家下载中心设计演进之路|得物技术

关注得物技术,每周一、三更新技术干货

要是觉得文章对你有帮助的话,欢迎评论转发点赞~

未经得物技术许可严禁转载,否则依法追究法律责任。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ lambda(匿名函数)捕获自己

今天写算法题时无意间遇到一种情况,我的深度优先遍历函数要在函数内调用自身,如果是普通函数没什么问题,但如果是 匿名函数 的话会有一些问题,甚至问ai,ai也没打上来,上网搜了半天,才找到这个的解答,故作此文 以费契那波数列为例 // 普通函数式 int fun(int pos) {if (pos …

解决Spring Boot整合Redis时的连接问题

前言 在使用Spring Boot整合Redis的过程中&#xff0c;经常会遇到连接问题&#xff0c;尤其是当Redis服务部署在远程服务器上时。 问题描述 当你尝试连接到Redis服务器时&#xff0c;可能会遇到以下错误&#xff1a; org.springframework.data.redis.connection.PoolExcept…

vue3 路由守卫

在Vue 3中&#xff0c;路由守卫是一种控制和管理路由跳转的机制。它允许你在执行导航前后进行一些逻辑处理&#xff0c;比如权限验证、数据预取等&#xff0c;从而增强应用的安全性和效率。路由守卫分为几种不同的类型&#xff0c;每种类型的守卫都有其特定的应用场景。 其实路…

向潜在安全信息和事件管理 SIEM 提供商提出的六个问题

收集和解读数据洞察以制定可用的解决方案是强大网络安全策略的基础。然而&#xff0c;组织正淹没在数据中&#xff0c;这使得这项任务变得复杂。 传统的安全信息和事件管理 ( SIEM ) 工具是组织尝试使用的一种方法&#xff0c;但由于成本、资源和可扩展性等几个原因&#xff0…

星海智算:Stable Diffusion3.5镜像教程

Stable Diffusion3.5 模型介绍 Stable Diffusion 3.5是由Stability AI推出的最新图像生成模型&#xff0c;它是Stable Diffusion系列中的一个重大升级。这个模型家族包括三个版本&#xff0c;分别是Stable Diffusion 3.5 Large、Stable Diffusion 3.5 Large Turbo和Stable Dif…

STM32电源管理—实现低功耗

注&#xff1a; 本文是学习野火的指南针开发板过程的学习笔记&#xff0c;可能有误&#xff0c;详细请看B站野火官方配套视频教程&#xff08;这个教程真的讲的很详细&#xff0c;请给官方三连吧&#xff09; 在响应绿色发展的同时&#xff0c;在很多应用场合中都对电子设备的功…

3D Gaussian Splatting 代码层理解之Part2

现在让我们来谈谈高斯分布。我们已经在Part1介绍了如何根据相机的位置获取 3D 点并将其转换为 2D。在本文中,我们将继续处理高斯泼溅的高斯部分,这里用到的是代码库 GitHub 中part2。 我们在这里要做的一个小改动是,我们将使用透视投影,它利用与上一篇文章中所示的内参矩阵…

【白话机器学习系列】白话 Softmax

文章目录 什么是 SoftmaxSoftmax 函数详解示例编程实现对矩阵应用 Softmax 函数 什么是 Softmax Softmax 函数&#xff0c;又称归一化指数函数&#xff0c;它使用指数函数将输入向量归一化为概率分布&#xff08;每一个元素的范围都在 ( 0 , 1 ) (0,1) (0,1) 之间&#xff0c;…

thinkphp6配置多应用项目及多域名访问路由app配置

这里写一写TP6下配置多应用。TP6默认是单应用模式&#xff08;单模块&#xff09;&#xff0c;而我们实际项目中往往是多应用的&#xff08;多个模块&#xff09;&#xff0c;所以在利用TP6是就需要进行配置&#xff0c;开启多应用模式。 1、安装ThinkPHP6 1.1安装ThinkPHP6.…

无人机航测技术算法概述!

一、核心技术 传感器技术&#xff1a; GPS/GLONASS&#xff1a;无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机&#xff1a;用于拍摄地面图像&#xff0c;通过后续图像处理生成三维模型。 激光雷达&#xff08;LiDAR&#xff09;&#xff1a;通过激光扫…

Linux网络——套接字编程

目录 1. 网络通信基本脉络 2. 端口号 ① 什么是套接字编程&#xff1f; ② 端口号 port && 进程 PID 3. 网络字节序 4. 套接字编程 ① UDP版 ② TCP版 5. 改进方案与拓展 ①多进程版 ②多线程版 ③线程池版 ④守护进程化 1. 简单的重联 2. session &…

Excel如何把两列数据合并成一列,4种方法

Excel如何把两列数据合并成一列,4种方法 参考链接:https://baijiahao.baidu.com/s?id=1786337572531105925&wfr=spider&for=pc 在Excel中,有时候需要把两列或者多列数据合并到一列中,下面介绍4种常见方法,并且提示一些使用注意事项,总有一种方法符合你的要求:…

LabVIEW三针自动校准系统

基于LabVIEW的智能三针自动校准系统采用非接触式激光测径仪对标准三针进行精确测量。系统通过LabVIEW软件平台与硬件设备的协同工作&#xff0c;实现了数据自动采集、处理及报告生成&#xff0c;大幅提高了校准精度与效率&#xff0c;并有效降低了人为操作误差。 一、项目背景…

【Java】JDK集合类源码设计相关笔记

文章目录 前言1. Iterable2. RandomAccess2.1 RandomAccess 使用索引进行二分查找 3. Map3.1 HashMap3.2 IdentityHashMap 4. Collections 工具类4.1 Collections.shuffle() 洗牌 前言 目的: 收集JDK集合类的类图。记录一些有意思的设计。将之前写过的文章建立联系。 1. Ite…

macbook外接2k/1080p显示器调试经验

准备工具 电脑 满足电脑和显示器要求的hdmi线或者转接头或者扩展坞 betterdisplay软件 Dell P2419H的最佳显示信息如下 飞利浦 245Es 2K的最佳显示比例如下 首选1152

Stable Diffusion的解读(二)

Stable Diffusion的解读&#xff08;二&#xff09; 文章目录 Stable Diffusion的解读&#xff08;二&#xff09;摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…

Github 2024-11-16Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Go项目1Python项目1Lapce:用 Rust 编写的极快且强大的代码编辑器 创建周期:2181 天开发语言:Rust协议类型:Apache License 2.0St…

Redis作为分布式锁,得会避坑

日常开发中&#xff0c;经常会碰到秒杀抢购等业务场景。为了避免并发请求造成的库存超卖等问题&#xff0c;我们一般会用到Redis分布式锁。但是使用Redis分布式锁之前要知道有哪些坑是需要我们避过去的。 1. 非原子操作&#xff08;setnx expire&#xff09; 一说到实现Redis…

Qt、C++实现五子棋人机对战与本地双人对战(高难度AI,极少代码)

介绍 本项目基于 Qt C 实现了一个完整的五子棋游戏&#xff0c;支持 人机对战 和 人人对战 模式&#xff0c;并提供了三种难度选择&#xff08;简单、中等、困难&#xff09;。界面美观&#xff0c;逻辑清晰&#xff0c;是一个综合性很强的 Qt 小项目 标题项目核心功能 棋盘…

Vulnhub靶场案例渗透[12]-Grotesque: 1.0.1

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 目录扫描4. 敏感信息获取5. 反弹shell6. 权限提升 一、靶场搭建 1. 靶场描述 get flags difficulty: medium about vm: tested and exported from vi…