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

文 / 新一

一、前言

一年一更的彩虹桥系列又来了,在前面两期我们分享了在稳定性和性能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.商家下载中心设计演进之路|得物技术

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…

23种设计模式-状态(State)设计模式

文章目录 一.什么是状态模式&#xff1f;二.状态模式的结构三.状态模式的应用场景四.状态模式的优缺点五.状态模式的C实现六.状态模式的JAVA实现七.代码解释八.总结 类图&#xff1a; 状态设计模式类图 一.什么是状态模式&#xff1f; 状态模式&#xff08;State Pattern&…

Chroma致茂Chroma61815回收式电网模拟电源

Chroma致茂 Chroma61815回收式电网模拟电源 产品特色 功率规格&#xff1a; 61809&#xff1a;9kVA 61812&#xff1a;12kVA 61815&#xff1a;15kVA 电压规格&#xff1a;0~350V 频率规格&#xff1a;30Hz~100Hz/DC 3U高度具备最大15kVA之高功率密度设计 全触控面板搭配直观的…

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

Hadoop 学习心得

一、引言 &#xff08;一&#xff09;学习 Hadoop 的背景和目的 随着信息技术的飞速发展&#xff0c;数据量呈爆炸式增长&#xff0c;传统的数据处理方式已难以满足需求。在这样的背景下&#xff0c;为了能够在大数据领域有所发展&#xff0c;我开始学习 Hadoop。Hadoop 作为处…

使用Mybatis向Mysql中的插入Point类型的数据全方位解析

1. 结果 希望每一个能够看到结果的人都能自己装载进去&#xff01;加油&#xff01; 2.代码 2.1TestMapper import org.apache.ibatis.annotations.*; import java.util.Date; import java.util.List;/*** author Administrator*/ Mapper public interface TestMapper {/*…

阿里云轻量应用服务器可以用在哪些场景呢

在数字化转型的浪潮中&#xff0c;中小企业面临着如何快速、高效地上云的挑战。阿里云轻量应用服务器&#xff08;SWAS&#xff09;作为一款专为中小企业设计的云服务产品&#xff0c;提供了简单易用、经济实惠的解决方案&#xff0c;助力企业轻松实现云端部署&#xff0c;赋能…

【桌面应用程序】Vue-Electron 环境构建、打包与测试(Windows)

前言 Vue 与 Electron 环境构建、打包与测试。 目录 前言 一、基本环境准备 二、配置npm源 三、创建Vue项目 四、添加Electron支持 五、应用启动 ​六、添加UI框架 ElementUI ​七、打包 一、基本环境准备 npm版本&#xff1a;8.6.0node版本&#xff1a;v18.0.0Vue/…

【SQL】E-R模型(实体-联系模型)

目录 一、介绍 1、实体集 定义和性质 属性 E-R图表示 2. 联系集 定义和性质 属性 E-R图表示 一、介绍 实体-联系数据模型&#xff08;E-R数据模型&#xff09;被开发来方便数据库的设计&#xff0c;它是通过允许定义代表数据库全局逻辑结构的企业模式&#xf…

Linux下安装NVIDIA显卡驱动(全流程通俗教程)

1、确认显卡型号 查明你的NVIDIA显卡型号&#xff0c;以确保下载驱动程序的版本&#xff1a; lspci | grep -i vga 2、下载NVIDIA驱动 前往官方网站&#xff1a;NVIDIA官网 选择显卡信息&#xff1a;使用下拉菜单选择正确的显卡型号、Linux操作系统和系统架构。 下载驱动…

视频里的音频怎么提取出来成单独文件?音频提取照着这些方法做

在数字时代&#xff0c;视频与音频的分离与重组已成为日常需求之一。无论是出于制作背景音乐、保存讲座内容&#xff0c;还是编辑播客素材&#xff0c;提取视频中的音频并将其保存为单独文件都显得尤为重要。视频里的音频怎么提取出来成单独文件&#xff1f;本文将详细介绍几种…

【Vue笔记】基于vue3 + element-plus + el-dialog封装一个自定义的dialog弹出窗口组件

这篇文章,介绍一下如何使用vue3+element-plus中的el-dialog组件,自己封装一个通用的弹出窗口组件。运行效果如下所示: 目录 1.1、父子组件通信 1.2、自定义VDialog组件(【v-model】模式) 1.2.1、编写VDialog组件代码 1.2.2、使用VDialog组件 1.2.3、运行效果 1.3、自…

python: generator IDAL and DAL using sql server 2019

其它数据库也是一样的思维方式 create IDAL # encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : P…

【澜舟科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

基于Java Springboot出租车管理网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)

元服务是什么&#xff1f;和App的关系&#xff1f; 元服务是是一种HarmonyOS轻量应用形态&#xff0c;用户无需安装即可使用&#xff0c;具备随处可及、服务直达、自由流转的特征。 元服务是可以独立部署和运行的程序实体&#xff0c;独立于应用&#xff0c;不依赖应用可独立…

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过&#xff0c;上架后却一直无法被搜索到。打开后&#xff0c;再在 QQ 上下拉查看 “最近使用”&#xff0c;发现他出现一下又马上消失。 上线是按正常流程走的&#xff0c;开发、备案、审核&#xff0c;没有任何违规&#xf…

Java中日志采集框架-JUL、Slf4j、Log4j、Logstash

1. 日志采集 日志采集是指在软件系统、网络设备、服务器或其他IT基础设施中自动收集日志文件和事件信息的过程。这些日志通常包含了时间戳、事件类型、源和目标信息、错误代码、用户操作记录等关键数据。日志采集的目的是为了监控系统运行状态、分析系统性能、审计用户行为、故…

CSS遮罩:mask

CSS属性 mask 允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。 // 一般用位图图片做遮罩 mask: url(~/assets/images/mask.png); mask-size: 100% 100%;// 使用 SVG 图形中的形状来做遮罩 mask: url(~/assets/images/mask.svg#star);…