MySQL切换PolarDB-X方案
一、DTS 增量同步完成后的流量切换策略
1. 切换期间的数据写入处理
• 场景:DTS 增量同步完成(Lag=0)后,业务流量切换到 PolarDB-X 的瞬间可能产生 2-3 秒延迟,导致部分订单仍写入 MySQL。
• 解决方案:
◦ 双写兜底机制:在切换期间,同时写入 MySQL 和 PolarDB-X,确保数据最终一致性。
◦ 异步补偿写入:通过消息队列(如 Kafka)将 MySQL 的写入操作异步同步到 PolarDB-X。
// 示例:双写逻辑(切换期间)
public void saveOrder(Order order) {
// 写入 MySQL(过渡期兜底)
mysqlRepository.save(order);
// 异步写入 PolarDB-X(通过消息队列)
messageQueue.send(“polardbx_write”, order);
}
• 数据校验:在 PolarDB-X 侧增加 数据比对服务,检测 MySQL 与 PolarDB-X 的差异并自动修复。
2. 延迟订单的处理
• 自动重试:若订单写入 MySQL 后未及时同步到 PolarDB-X,通过 重试机制(如指数退避)重新写入 PolarDB-X。
• 人工干预:设置监控告警,对延迟超过阈值的订单进行人工核查和补录。
二、部分流量切换到 PolarDB-X 时的数据一致性方案
1. 分批次流量切换
• 灰度策略:按用户 ID、订单类型等维度逐步切换流量,避免全量切换风险。
• 示例代码(基于 Spring Cloud Gateway):
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(“polardbx_route”, r -> r.path(“/order/“)
.filters(f -> f.setPath(”/polardbx-order"))
.uri(“lb://polardbx-service”)) // 10% 流量切到 PolarDB-X
.route(“mysql_route”, r -> r.path("/order/”)
.filters(f -> f.setPath(“/mysql-order”))
.uri(“lb://mysql-service”)) // 90% 流量仍走 MySQL
.build();
}
2. 剩余 MySQL 写入数据的处理
• 持续同步:保持 DTS 增量任务运行,将 MySQL 剩余写入同步到 PolarDB-X。
• 最终一致性保障:
◦ 定时任务补录:定期扫描 MySQL 中未被同步的订单,批量写入 PolarDB-X。
◦ 业务补偿:在订单支付成功后,强制校验 PolarDB-X 的数据完整性。
三、关键流程图
DTS->>MySQL: 增量同步完成(Lag=0)
App->>MySQL: 写入订单(灰度切换期间)
MySQL->>DTS: 增量日志
DTS->>PolarDBX: 同步增量数据(延迟2-3秒)
App->>PolarDBX: 直接写入(非灰度流量)
PolarDBX->>PolarDBX: 异步补偿写入(MySQL 延迟订单)
Note right of PolarDBX: 数据比对服务检测差异并修复
四、风险控制与监控
| 风险点 | 解决方案 |
|---|---|
| 延迟订单丢失 | 双写兜底 + 消息队列重试 + 人工补录 |
| 数据不一致 | DTS 数据校验 + 定时任务补录 + 业务层校验 |
| PolarDB-X 写入压力突增 | 限流熔断(如 Sentinel) + 自动扩容 |
| DTS 同步延迟 | 监控 Lag 值,超过阈值触发告警并自动扩容 DTS 任务规格 |
五、总结
- 切换期间延迟订单:通过双写和异步补偿确保最终写入 PolarDB-X。
- 部分流量写入 MySQL:持续运行 DTS 同步任务,结合补偿机制处理剩余数据。
- 核心原则:
• 最终一致性:允许短暂延迟,但需保证数据最终同步。
• 可观测性:通过监控和日志实时跟踪数据状态。
• 回滚能力:若切换后异常,快速回滚到 MySQL 双写模式。
相关文章:
MySQL切换PolarDB-X方案
一、DTS 增量同步完成后的流量切换策略 1. 切换期间的数据写入处理 • 场景:DTS 增量同步完成(Lag0)后,业务流量切换到 PolarDB-X 的瞬间可能产生 2-3 秒延迟,导致部分订单仍写入 MySQL。 • 解决方案: ◦…...
Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路
Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路 在 Java 开发的历史长河中,开发工具的演变不仅改变了程序员的编码方式,也深刻影响了整个行业的开发效率和代码质量。从 Eclipse 到 IntelliJ IDEA,这不仅是工具的更替&…...
GPT - 2 文本生成任务全流程
数据集下载 数据预处理 import json import pandas as pdall_data []with open("part-00018.jsonl",encoding"utf-8") as f:for line in f.readlines():data json.loads(line)all_data.append(data["text"])batch_size 10000for i in ran…...
红宝书第四十三讲:基于资料的数据可视化工具简单介绍:D3.js 与 Canvas绘图
红宝书第四十三讲:基于资料的数据可视化工具简单介绍:D3.js 与 Canvas绘图12 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、D3.js:数据驱动文档的王者 1 核心特性&#x…...
UI基础(1)
quit和close的区别: driver.close():关闭当前正在使用的窗口。 1、如果你的当前浏览器窗口只有一个情况下,它就会关闭窗口并且关闭浏览器 2、如果你的当前浏览器窗口有多个的情况下,它就会关闭driver驱动焦点所在的窗口 driver.quit():真正关闭浏览器(把所有的窗口都关闭…...
深入理解 Vue 的数据代理机制
何为数据代理? 通过一个对象代理对另一个对象中的属性的操作(读/写),就是数据代理。 要搞懂Vue数据代理这个概念,那我们就要从Object.defineProperty()入手 Object.defineProperty()是Vue中比较底层的一个方法&…...
封装,继承,多态(续)
在Java中,最基础的三原则无疑是封装,继承,多态 对于这三类,最基本同样最重要,我们是会经常遇到的,在编程中,会使用,但在考试中还有一定的不理解。 对于这点,我在这里进…...
Java excel导入/导出导致内存溢出问题,以及解决方案
excel导入/导出导致内存溢出问题,以及解决方案 1、内存溢出问题导入功能重新修正,采用SAX的流式解析数据。并结合业务流程。导出功能:由于精细化了业务流程,导致比较代码比较冗杂,就只放出最简单的案例。 1、内存溢出问…...
10 个最新 CSS 功能已在所有主流浏览器中得到支持
前言 CSS 不断发展,新功能使我们的工作更快、更简洁、更强大。得益于最新的浏览器改进(Baseline 2024),许多新功能现在可在所有主要引擎上使用。以下是您可以立即开始使用的10 CSS新功能。 1. Scrollbar-Gutter 和 Scrollbar-Co…...
思科模拟器的单臂路由,交换机,路由器,路由器只要两个端口的话,连接三台电脑该怎么办,划分VLAN,dotlq协议
单臂路由 1. 需求:让三台电脑互通 2. 在二层交换机划分vlan,并加入; 3. 将连接二层交换机和路由器的端口f0/4改为trunk模式 4. 路由器:进入连接路由器的f0/0端口将端口开启 5. 进入每个vlan设dotlq协议并设网络IP(…...
14 nginx 的 dns 缓存的流程
前言 这个是 2020年11月 记录的这个关于 nginx 的 dns 缓存的问题 docker 环境下面 前端A连到后端B 前端B连到后端A 最近从草稿箱发布这个问题的时候, 重新看了一下 发现该问题的记录中仅仅是 定位到了 nginx 这边的 dns 缓存的问题, 但是 并没有到细节, 没有到 具体的 n种…...
实战教程:使用JetBrians Rider快速部署与调试PS5和Xbox上的UE项目
面向主机游戏开发者的重大新闻!在2024.3版本中,JetBrains Rider 增加了对 PlayStation5 和 Xbox 游戏主机的支持,您可以直接在您喜欢的游戏主机上构建、部署和调试 Unreal Engine 和自定义游戏引擎。 JetBrains Rider现在支持主机游戏开发&am…...
大型语言模型中中医知识的多模态基准数据集
下载链接: https://github.com/pariskang/ZhongJing-OMNI https://github.com/pariskang/ZhongJing-OMNI 下载链接 https://github.com/pariskang/ZhongJing-OMNI.git 链接失效反馈 资源简介: ZhongJing-OMNI是第一个用于评估大型语言模型中中医知…...
专题十五:动态路由——BGP
一、BGP的基本概念 BGP(Border Gateway Protocol,边界网关协议)是一种用于在不同自治系统(AS)之间交换路由信息的外部网关协议(EGP)。通过TCP179端口建立连接。目前采用BGP4版本,IP…...
Linux命令-vim编辑
用vi或vim命令进入vim编辑器。 基础: u 撤销上一次操作。x剪切当前光标所在处的字符。yy复制当前行。dd剪切当前行。p粘贴剪贴板内容到光标下方。i切换到输入模式,在光标当前位置开始输入文本。:wq保存并退出Vim 编辑器。:q!不保存强制退出Vim 编辑器。 拓展: w光…...
hive数仓要点总结
1.OLTP和OLAP区别 OLTP(On-Line Transaction Processing)即联机事务处理,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用…...
一款安全好用的企业即时通讯平台,支持统一门户
在数字化转型的浪潮中,企业面临着信息孤岛、系统分散、协作低效等诸多挑战。BeeWorks作为一款专为企业打造的数字化底座平台,凭借其强大的企业内部应用集成能力和单点登录功能,正在成为企业数字化转型的有力推手。 数字化底座平台࿱…...
git安装(windows)
通过网盘分享的文件:资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用,所以不用创建。 用vscode,所以这么选择。...
微信小程序实战案例 - 餐馆点餐系统 阶段1 - 菜单浏览
阶段 1 – 菜单浏览(超详细版) 目标:完成「首页=菜品卡片列表」 打好 UI 地基会从 云数据库 拉取 categories / dishes 并渲染打 Git Tag v1.0‑menu 1. 技术/知识点速览 知识点关键词说明云数据库db.collection().where().…...
Dashboard的安装和基本使用
1.Dashboard简介: Dashboard是Kubernetes的Web图形用户界面(GUI),它为用户提供了一个直观的方式来管理和监控Kubernetes集群。 2.实验基础和前置条件: 本实验以Kubernetes集群环境搭建与初始化-CSDN博客为基础和前置…...
英语单词 list 11
前言 这一个 list 是一些简单的单词。感觉这个浏览单词的方法比较低效,所以准备每天最多看一个 list ,真要提升英语水平,感觉还是得直接做阅读理解题。就像我们接触中文阅读材料一样,当然光知道这个表面意思还不够,还…...
JAVA基础 - 高效管理线程隔离数据结构ThreadLocalMap
欢迎光临小站:致橡树 ThreadLocalMap 是 ThreadLocal 的核心底层数据结构,负责在每个线程中存储与 ThreadLocal 实例绑定的数据。它的设计目标是高效管理线程隔离数据,同时尽量减少内存泄漏风险。以下是其核心实现细节。 数据结构与设计目标…...
DeepSeek 接入 Word 完整教程
一、前期准备 1.1 注册并获取 API 密钥 访问 DeepSeek 平台: 打开浏览器,访问 DeepSeek 官方网站(或您使用的相应平台)。注册并登录您的账户。 创建 API 密钥: 在用户控制面板中,找到“API Keys”或“API…...
通义灵码助力Neo4J开发:快速上手与智能编码技巧
在 Web 应用开发中,Neo4J 作为一种图数据库,用于存储节点及节点间的关系。当图结构复杂化时,关系型数据库的查找效率会显著降低,甚至无法有效查找,这时 Neo4J 的优势便凸显出来。然而,由于其独特的应用场景…...
高性能文件上传服务
高性能文件上传服务 —— 您业务升级的不二选择 在当今互联网数据量激增、文件体积日益庞大的背景下,高效、稳定的文件上传方案显得尤为重要。我们的文件分块上传服务端采用业界领先的 Rust HTTP 框架 Hyperlane 开发,凭借其轻量级、低延时和高并发的特…...
p2p的发展
PCDN(P2P内容分发网络)行业目前处于快速发展阶段,面临机遇与挑战并存的局面。 一、发展机遇 技术融合推动 边缘计算与5G普及:5G的高带宽、低延迟特性与边缘计算技术结合,显著提升PCDN性能,降低延迟&#x…...
Java Lambda 表达式详解:发展史、语法、使用场景及代码示例
Java Lambda 表达式详解:发展史、语法、使用场景及代码示例 1. Lambda 表达式的发展史 背景与动机 JDK 7 前:Java的匿名内部类虽强大,但代码冗余(如事件监听器、集合遍历)。JDK 8(2014)&#…...
【从0到1学Elasticsearch】Elasticsearch从入门到精通(下)
我们在【从0到1学Elasticsearch】Elasticsearch从入门到精通(上)这边文章详细讲解了如何创建索引库和文档及javaAPI操作,但是在实战当中,我们还需要根据一些特殊字段对文档进行查找搜索,仅仅靠id查找文档是显然不够的。…...
Python实现贪吃蛇二
上篇文章Python实现贪吃蛇一,实现了一个贪吃蛇的基础版本,但存在一些不足,也缺乏一些乐趣。本篇文章将对其进行一些改进,主要修改/实现以下几点: 1、解决食物随机生成的位置与蛇身重合问题 2、蛇身移动加速/减速功能 3…...
使用pybind11开发c++扩展模块输出到控制台的中文信息显示乱码的问题
使用pybind11开发供Python项目使用的C++扩展模块时,如果在扩展模块的C++代码中向控制台输出的信息中包含中文,python程序的控制台很容易出现乱码。以如下C++扩展框架代码为例(这是对上一篇文章简明使用pybind11开发pythonc+扩展模块教程-CSDN博客中的C++扩展框架代码进行少量…...
