系统存储架构升级分享 | 京东云技术团队
一、业务背景
系统业务功能:系统内部进行数据处理及整合, 对外部系统提供结果数据的初始化(写)及查询数据结果服务。
系统网络架构:

- 部署架构对切量上线的影响 - 内部管理系统上线对其他系统的读业务无影响
- 分布式缓存可进行单独扩容, 与存储及查询功能升级无关
- 通过缓存层的隔离, 系统扩展期间外部系统可保持不变, 只对内部管理系统升级
- 内部系统上线/验证时, 除了业务场景1相关的初始化操作, 仍可提供读服务,降低上线影响
二、本次升级整体实施方案:
整体实施方案图例:

(一)、设立目标
商品全量渠道化-切量计划: (总量为当前10倍):

目前:
当前数据库常用表均已超过5000W, 其中部分结果表达6000W, 已达到MYSQL数据库表容量峰值, 对于全切量无法支持;
目标:
最高支持9亿: 根据切量计划, 全切量后系统约为6.7亿, 保留1/4的冗余, 取8.375亿; 向上取整9亿, 此值冗余量较大, 可满足未来5年数据支持
时间目标: 8月初方案设定, 8月17~8.22上线及验证, 8.24切量计划开始
(二)、当前系统现状
1、资源使用
•当前部署结构
——机房分布,Mysql: 1主4从(机房A 1主, 3从; 机房B只读从)
——机房分布,Doris: 32C, 63个节点, 3副本
•当前应用容器(docker)数量,db最大连接数
——应用容器数量: 62 (Web分组: 25, Worker分组: 31, MQ分组: 6)
——db最大连接数100 (每个容器配置)
•当前业务是否读写分离,读写比例情况
——无读写分离
•各业务场景下,是否可容忍主从延迟?可容忍的延迟时长是多少
——目前业务人员修改操作多数为同步操作, 修改完成后返回操作结果到前端, 从业务方操作+查询结果来说, 无法空忍延迟
——后台任务场景, 对于中间数据处理, 可以容忍主从延迟
•产品层面,系统出现瓶颈压力时,是否接受限流?是否接受数据延迟展示?
——对外服务接口本次不涉及开发, 服务接口不受影响;业务页面访问量少,可接受短时间内的延迟
•团队是否有ES使用经验
——部分了解, 未在项目中使用
2、数据库内部使用情况
使用通用性的盘点框架对系统进行全面性现状梳理
表内空间, 业务场景等信息 (部分)
| 表名 | 当前表记录数 (单位:万) | 最大支持条数 (单位:万) | 表字段数 | 是否可拆分出分片键 | 分片键字段 | 是否存在不带分片字段的SQL | 是否有跨表查询场景 | 数据记录读写比 | 是否存在写后立即查询 | 使用场景 | 数据是否 可截转 | 可接受的截转时长 | 切量后预估量 | 分布式DB | ES 判断条件:是否有复杂查询 | ES直接双写 判断条件: 写后立即查询 |
| 审批流表 | 3.5KW | 4KW | 43 | 有 | sku | 存在 | 存在 | 1000/1 | 存在写后用户手动再查询操作 | 1、页面创建审批流 2、页面查询审批流 3、页面数据置失效 4、审批平台回调修改 | 否 | | +3亿 | ✅ | ✅ | UI修改后需重新点击"查询"按钮; |
| 审批流细目表 (历史数据已清理) | 800W | 4KW | 20 | 有 | 增加sku | 无 | 存在 | 1000/1 | 存在写后用户手动再查询操作 | 1、刷新审批流(删除+增加) 2、查询审核中流程(任务) | 审批通过可转冷备 | | 转冷备 | ✅ | ✅ | |
| 业务数据表1 | 3.3KW | 4KW | 15 | 有 | sku | 无 | 无 | 100/1 | | 1、审批流通过后, 创建 2、数据失效, 删除操作 3、后台工具: 同步缓存(存在复杂+分页查询) | 否 | | +3亿 | ✅ | ❌ | ❌ |
| 业务数据表2 | 5.9KW | 4KW | 16 | 有 | sku | 存在 (新增后异常按id删除) | 无 | 1000/1 | | 1、业务查询/导出维度1数据 2、业务查询维度2数据2 3、后台工具: 同步缓存 | 否 | | +5亿 | ✅ | 同步大数据推送数据到缓存, 使用creator字段查询; 多个SKU分页查询 | ❌ |
| 支持数据表(大数据平台计算后推送) | 1.2KW | 4KW | 12 | 有 | item_sku_id | 无 | 无 | 5/1 | | 1、运维工具: 增加/删除记录 2、清理历史数据(任务) 3、数据查询(显示使用) 4、计算 5、大数据推送数据 | 按日期推送, 目前保留3天 | 历史数据无用 doris? | 一天3~4KW | ✅ | 删除数据dt | ❌ |
| … | | | | | | | | | | | | | | | | |
(三)、技术方案选型
系统特点:单表高并发写、复杂读
1、存储选型:
结论:
内部分布式DB: 由单分片拓展到多分片, 解决海量数据存储及简单查询
ES: 新引入, 实现复杂查询(分词查询)及全局排序
redis: 保留, 需扩容
Doris: 保留, 容量增大
复杂查询(原因: 前端业务访问存在多表关联场景(2张千万级别表关联查询), 随着表容量变大, 关联查询性能下降, 已无法满足业务高效需求)
复杂查询决策因素:
| | | 分布式DB(mysql) | es | doris | TiDB |
| 决策指标 | 产品定位 | 数据库 (OLTP) | 搜索引擎 | 数据库 (OLAP) | 数据库(OLTP+80%OLAP) |
| 优势 | 1、高并发、高吞吐量事务处理 2、稳定性 3、数据实时(写后即读) | 1、全文索引 2、复杂结构化查询 | 高并发查询分析 | 1、兼具事务处理+数据分析 2、自动拓展 3、数据实时(写后即读) |
| 劣势 | 1、大量数据分析 2、手动拓展 | 1、事务处理 2、实时(写后即读) | 1、事务处理 2、实时(写后即读) | 高并发、高吞吐量事务处理 |
| 可靠性 | 高(多机房) | 高(多机房) | 低(共享集群) | 低(单机房) |
| 拓展性 | 库维度:平台管理 表维度:应用控制 | 平台管理 | | 库维度:平台管理 表维度:应用控制 |
| 数据一致性 | 最终一致性 | 最终一致性 | | 强一致性 |
| 运维支持 | DBA | 分公司运维 | 无专业运维团队 | 分公司DBA |
| 总结 | 复杂业务查询慢 无法支持大数据量跨表查询、多维度复杂查询及全局排序 单表使用分片字段查询性能快 | 复杂业务查询性能高 | 部署结构为共享集群,(特别是)写性能受外部影响大 | 部署架构为单机房,无法满足0级系统可靠性要求 |
| | 架构目标 | | | | |
| 结论 | 海量存储及高并发写 | ✅ 大数据量存储,基于分库字段单表查询性能高, 单库事务处理 | ✖️ 高并发下的事务处理 | ✖️ 查询受写入/更新操作影响大 | ✖️ 高并发下的事务处理 可靠性 |
| 复杂度查询 | ✖️ 性能差, 可能会存在跨库查询 | ✅ 可靠性高 大数据量下的复杂业务查询 | ✖️ 查询受写入/更新操作影响大 | ✖️ 可靠性 |
2、数据同步方案
A-准实时同步方案:
方案描述:使用DRC平台配置化完成分布式DB到ES的准实时数据同步 (注: DRC为公司内部通用数据同步平台, 可在多个数据源之间进行数据同步)
优势:简单无序代码开发 劣势:可能存在业务写后即查场景,数据不一致风险

B-双写强一致方案:
方案描述:双写分布式DB与ES, 保证数据一致性
优势:保障数据写即读场景一致性 劣势:代码开发成本高

数据同步方案选择建议:
先选择A-准实时同步方案 -> 线上验证是否满足业务操作体验-> 再选择是否实施B-双写强一致方案
数据同步难点及解决方案:
问题:
•双表联合查询场景无法直接使用DRC平台同步, 需另开发相应的同步模块jar包, 嵌入DRC任务, 或放弃使用DRC, 直接使用代码同步, 都存在开发时间长问题
•ES索引空间占用多, 冗余记录条数多, , 查询结果需排重, 查询复杂
难点:流程表与流程细目节点表涉及联合查询, 两表都存在单表增删改的操作; 导致同步到ES的数据模型复杂、同步困难

解决方案:(数据库表增加冗余字段, 冗余字段专用于ES查询)
在DB的流程表增加待审人员, 已审人员字段, 字段的值使用空格分隔, 使用ES的分词功能, 同时ES可直接使用DRC工具直接同步此表数据, 减少同步的开发时间
方案成本: 增加/修改流程细目时同步修改流程表新增字段; 开发刷新历史数据工具

(四)、分阶段开发及上线实施步骤
1、系统业务改造-表字段增加(8月10日)
1) 业务表新增分库字段
部分业务表缺少分库字段,无法直接分片。针对业务表新增sku分片字段, 同时对现有逻辑改造增加SKU条件,以提升查询效率;
2) ES相关查询冗余字段的增加 (刷数据)
2、分布式DB分库数据同步+验证(8月11日)
1) 完成分布式DB分片库+ ES初始化;
2) 配置DRC完成原单库到分布式DB分片库的全量+增量数据同步;
3) 配置DRC完成分布式DB分片库到ES的全量+增量数据同步;
4) 通过检验工具,定期比对分布式DB单片、分布式DB分片及ES间的数据一致性。

3、读流量切换+验证 (8月17日)
1) 新增AOP切面, 通过DUCC配置(erp白名单, 全量读, 结果对比等维度配置),将读请求逐步切量到新应用集群
2) 待产品、业务侧完成验证后,切换全部读流量至新应用集群(注: 新应用集群使用数据库只读帐号)

4、写流量切换(8.21)
-
上线前周知业务方及上下游系统,告知上线时间段及预估时长,减少业务影响
-
新增一个静态页面提示用户系统升级中不可用,切换前端域名至静态页面, 避免用户操作
-
停止原系统分组,确保原单库不再存有写流量,同时协调DBA对原库执行禁写(关闭worker, 暂停MQ消费)
-
等待并确保原库数据均同步至目的库后,再次通过手动+自动方式校验新老两个数据库的数据一致性
-
新系统分组切换为读写帐号, 进行部署
-
研发及测试人员对新系统分组功能使用测试商品进行功能验证, 无问题后交由业务人员验证(切换静态运维页面)
-
启动worker及接入MQ

5、上线后效果
上线后系统运行正常, 8.23至今已结转商品 2.6亿; 目前系统支持商品场维度数据3.16亿; 最大DB表数据已有2.84亿; ES数据4356W;
前后对比: erp:xxx; 此erp帐号数据29w 原查询9s,新查询1s;
四、总结
好的建议:
•全面、清晰的系统现状盘点:可以降低复杂度、提高质量
•清晰的上线计划:指导人员合理分工、缩短上线时间、降低上线难度

未解决问题:
目前分布式DB分布式事务支持比较弱, 无法保证跨分库时多条记录在一个事务中修改的正确性, 需要提交后进行读取后再验证确保数据正确保存
业务人员名下商品数据百万时, 查询时间仍然效长, 查询性能将持续优化
作者:京东零售 王凯
来源:京东云开发者社区 转载请注明来源
相关文章:
系统存储架构升级分享 | 京东云技术团队
一、业务背景 系统业务功能:系统内部进行数据处理及整合, 对外部系统提供结果数据的初始化(写)及查询数据结果服务。 系统网络架构: 部署架构对切量上线的影响 - 内部管理系统上线对其他系统的读业务无影响分布式缓存可进行单独扩容, 与存储及查询功能升级无关通过…...
OpenCV-22高斯滤波
一、高斯函数的基础 要理解高斯滤波首先要直到什么是高斯函数,高斯函数是符合高斯分布的(也叫正态分布)的数据的概率密度函数。 高斯函数的特点是以x轴某一点(这一点称为均值)为对称轴,越靠近中心数据发生…...
实现LCM在docker之间的通信
目录 1.docker容器互联 新建网络 连接容器 2.设置环境变量 3.在两个docker之间实现通信 1.docker容器互联 新建网络 $ docker network create -d bridge test-net 连接容器 运行一个容器并连接到新建的 test-net 网络: $ docker run -itd --name lcm_1 --network tes…...
GitLab任意用户密码重置漏洞(CVE-2023-7028)
GitLab CVE-2023-7028 POC user[email][]validemail.com&user[email][]attackeremail.com 本文链接: https://www.黑客.wang/wen/47.html...
在机械行业中,直线导轨和弧形导轨哪个应用范围更广泛?
弧形导轨和直线导轨是两种常见的导轨类型,直线导轨主要被用于高精度或快速直线往复运动场所,而弧形导轨是一种专门设计用于曲线运动的导轨系统,那么在机械行业中,直线导轨和弧形导轨哪个应用范围更加广泛呢? 直线导轨主…...
关于ue4 射击游戏架构设计
传统mmo的服务器架构 网关--->游戏逻辑服--->游戏db服 网关---> 游戏逻辑服--->关系服务器master 其结构简单,方便维护,但是在应对射击游戏时候暴露出很大的缺陷 但是随着大dau产品的像和平精英等游戏问世 腾讯主要的服务器是基于tbus4j…...
vc++开发地图
1、概述 (1)mapbox 官网:https://docs.mapbox.com/mapbox-gl-js/example/ github: https://github.com/mapbox/mapbox-gl-native (2)mapX 使用VC创建MapX控件步骤 在vc中作用mapx C 如何根据地理坐标范围获取瓦片地图并使用CImage库实现多张…...
轻量化的yolov8部署到安卓Android手机端
一、pytorch环境配置和yolov8源码安装 首先在电脑上需要配置好pytorch环境,和yolov8源码的下载 然后针对yolov8做自己的轻量化改进 二、下载Android Studio和ncnn-android-yolov8 1. Android Studio官网链接: 下载 Android Studio 和应用工具 - And…...
分块矩阵的定义、计算
目录 一、定义 二、分块矩阵的加减乘法 三、考点 一、定义 分块,顾名思义,将整个矩阵分成几部分,如下图所示 二、分块矩阵的加减乘法 三、考点 分块矩阵的考点不多,一般来说,有一种: 求分块矩阵的转置…...
NAND系统性能提升常见方案
随着NAND的发展,针对NAND系统性能提升,业内目前主要的做法有以下几种方案: 1.提升总线频率和优化AC时序: 提高NAND闪存接口的工作频率可以显著加快数据传输速度。通过不断改进工艺和技术,缩短了信号稳定时间、降低了延…...
集简云动作管理平台上线:创建强大且可分享的AI助手(GPTs)
OpenAI的GPT Store于昨天上线,用户可以找到好用的GPTs,也可以将自己的GPTs分享到GPT Store中。未来(预计今年1季度)甚至可以从GPTs Store中获取利润分成。 要创建强大的GPTs离不开调用外部的软件工具,比如查询CRM/ERP软…...
机器人制作开源方案 | 基于混合现实的可移动机械臂平台
作者:董泽宇 李肖兵 叶彤 李秉宸 吴雅霏 单位:广西大学 电气工程学院 指导老师:李勇 雷圆媛 为应对特殊条件下不便于实地进行移动式操作的问题,本作品设计了一套基于混合现实的可移动机械臂操作控制系统。该系统分为人机交互、机…...
JavaScript基础03
1 - 循环 1.1 for循环 语法结构 for(初始化变量; 条件表达式; 操作表达式 ){//循环体 } 名称作用初始化变量通常被用于初始化一个计数器,该表达式可以使用 var 关键字声明新的变量,这个变量帮我们来记录次数。条件表达式用于确定每一次循环是否能被执行…...
CMake入门教程【实战篇】使用开源库cmake-modules简化项目开发与维护
文章目录 简介项目地址项目特点使用方式模块使用模块说明示例结论简介 本教程介绍了rpavlik/cmake-modules,一个CMake模块集合,旨在简化和优化CMakeLists.txt文件的编写和维护工作。该集合尤其对虚拟现实和物理模拟包的开发者有用,同时也包含通用实用模块和针对旧版CMake的…...
基于TOP204的开关电源电路图
图为TOP204的典型应用电路。该电源的技术特点是输入电压为交流85~265V;输出电压为15V2%;额定输出功率为30W;输出电压纹波不大于50mV;线性调整率为2%;效率为85%。电路中&a…...
CES 2024上的AI亮点
以下是CES 2024前两天AI方面亮点: 一个AI助手,取代你的智能手机应用程序的rabbit.tech人工智能驱动的捆绑式鞋子被称为“Moonwalkers”,可以让你走得更快 FitXR Slam的VR和健身创新WeHead的人工智能能给ChatGPT一张脸世界上第一个高清触觉游…...
Canopen学习笔记——sync同步报文增加数据域(同步计数器)
1.Canfestival同步报文sync的设置 在OD表中的配置如下: 如果0x1006索引的同步报文循环周期时间设置为0则禁用同步报文,这里要注意的就是,上面第一张图也提到了,时间单位是us。第二张图,我的0x1006就设置为0xF4240,也就…...
CRLF检测工具汇总
目录 漏洞介绍 详细请看 工具介绍 Oralyzer 介绍 主要功能...
vue、element-ui使用el-tooltip判断文本是否溢出
1.需求:需要实现文本单行显示,超出时,使用省略号,划过该文本时使用tooltip显示全部文本。需要考虑数据是由接口动态获取,只有溢出文本鼠标滑过时显示全部文本,没有溢出的则不需要。 2.实现: 第…...
高防dns服务器租用有哪些应用场景?-速盾cdn
高防DNS服务器租用可以应用于以下场景: 网站安全防护:高防DNS服务器可以提供强大的防御能力,抵御DDoS攻击、DNS劫持、泛洪攻击等威胁,保证网站的稳定运行和安全性。 网络游戏:网络游戏通常面临大量用户同时访问和数据…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
