系统存储架构升级分享

一、业务背景

系统业务功能:系统内部进行数据处理及整合, 对外部系统提供结果数据的初始化(写)及查询数据结果服务。

系统网络架构:

部署架构对切量上线的影响 - 内部管理系统上线对其他系统的读业务无影响

•分布式缓存可进行单独扩容, 与存储及查询功能升级无关

•通过缓存层的隔离, 系统扩展期间外部系统可保持不变, 只对内部管理系统升级

•内部系统上线/验证时, 除了业务场景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)

  1. 上线前周知业务方及上下游系统,告知上线时间段及预估时长,减少业务影响

  2. 新增一个静态页面提示用户系统升级中不可用,切换前端域名至静态页面, 避免用户操作

  3. 停止原系统分组,确保原单库不再存有写流量,同时协调DBA对原库执行禁写(关闭worker, 暂停MQ消费)

  4. 等待并确保原库数据均同步至目的库后,再次通过手动+自动方式校验新老两个数据库的数据一致性

  5. 新系统分组切换为读写帐号, 进行部署

  6. 研发及测试人员对新系统分组功能使用测试商品进行功能验证, 无问题后交由业务人员验证(切换静态运维页面)

  7. 启动worker及接入MQ

5、上线后效果

上线后系统运行正常, 8.23至今已结转商品 2.6亿; 目前系统支持商品场维度数据3.16亿; 最大DB表数据已有2.84亿; ES数据4356W;

前后对比: erp:xxx; 此erp帐号数据29w 原查询9s,新查询1s;

四、总结

好的建议:

•全面、清晰的系统现状盘点:可以降低复杂度、提高质量

•清晰的上线计划:指导人员合理分工、缩短上线时间、降低上线难度

未解决问题:

目前分布式DB分布式事务支持比较弱, 无法保证跨分库时多条记录在一个事务中修改的正确性, 需要提交后进行读取后再验证确保数据正确保存

业务人员名下商品数据百万时, 查询时间仍然效长, 查询性能将持续优化

作者:京东零售 王凯

来源:京东云开发者社区 转载请注明来源

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

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

相关文章

出版实务 | 出版物的成本及其构成

文章目录 出版物成本的总体构成直接成本开发成本制作成本 间接成本期间费用 本量利分析原则特点和作用变动成本项目固定成本项目本量利分析的基本公式及其应用定价发行折扣率销售数量单位销售收入销售收入总额单位销售税金销售税金总额变动成本总额单位变动成本固定成本总额单位…

CMake入门教程【高级篇】CPack打包项目Linux的deb和windows的msi

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 什么是CPack?2. 如何使用CPack?2.1 在CMakeLists.txt中包含CPack模块2.2 设置CPack变量2.3 创建分发包3.CPack命

转专业(UPC练习)

题目描述 根据教育部的规定,大学生进校后符合条件的可申请转专业。在校本科生在完成大学一年级课程,进入二年级之前,符合以下条件之一者,可以申请转专业:(1)在某一学科方面确有特长的学生&#…

谁将掌控工业界的命脉?揭秘工业互联网巨头的秘密角逐!

大数据产业创新服务媒体 ——聚焦数据 改变商业 在这个快速发展的数字化时代,一个新兴的巨兽——工业互联网,正以惊人的速度崛起,它不仅预示着生产力的飞跃性进步,更是引领着整个工业世界走向一个前所未有的新时代。 然而&#x…

微信小程序中路由跳转的方式有哪些?区别?

面试官:说说微信小程序中路由跳转的方式有哪些?区别? 一、是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小…

【FPGA/verilog -入门学习17】vivado 实现串口自发自收程序

1,需求 PC使用串口助手给FPGA板发送9600 波特率的数据,FPGA板接收到数据后,回复同样的数据给PC 2,需求分析 按模块可以划分为: rx接收模块,将输入的8位并行rx 数据转换成[7:0]rx_data 信号,当…

C++面试宝典第18题:旋转数组

题目 给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。要求如下: (1)尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 (2)使用时间复杂度为O(n)和空间复杂度为O(1)的原地算法解决这个问题。 示例 1: 输入: [1, 2, 3, 4, 5, 6, 7] 和 k…

NR中如何判断是否需要measurement gap来做邻区的测量?

先看下NR中定义的测量。 intra-freq 测量和inter-freq测量可以分为以下几类: 1 SSB based intra-freq 测量:serving cell SSB的center freq与邻区 SSB的center freq 相同并且两个SSB 的SCS也相同。 2 SSB based inter-freq 测量:serving ce…

vue3中ref和reactive联系与区别以及如何选择

vue3中ref和reactive区别与联系 区别 1、ref既可定义基本数据类型,也可以定义引用数据类型,reactive只能定义应用数据类型 2、ref在js中取响应值需要使用 .value,而reactive则直接取用既可 3、ref定义的对象通过.value重新分配新对象时依旧…

自学Python,需要注意哪些?

为什么要学习Python? 在学习Python之前,你不要担心自己没基础或“脑子笨”,我始终认为,只要你想学并为之努力,就能学好,就能用Python去做很多事情。在这个喧嚣的时代,很多技术或概念会不断兴起…

php 函数声明与调用

在 PHP 中,函数声明和调用的语法如下: 函数声明的一般形式为: function functionName($param1, $param2, ...) {// 函数体return $result; // 可选 } 例如: function add($a, $b) {return $a $b; } 函数调用的一般形式为&am…

Elasticsearch 地理空间搜索 - 远超 OpenSearch

作者:来自 Elastic Nathan_Reese 2021 年,OpenSearch 和 OpenSearch Dashboards 开始作为 Elasticsearch 和 Kibana 的分支。 尽管 OpenSearch 和 OpenSearch Dashboards 具有相似的血统,但它们不提供相同的功能。 在分叉时,只能克…

纯化蛋白质树脂ES-4060_用于吸附蛋白质树脂

蛋白纯化树脂是一种固定在基质中的化学物质,具有选择性地与目标蛋白结合,并通过洗脱将其从混合物中分离出来。蛋白纯化树脂的工作原理主要分为三个步骤:吸附、洗脱和再生。 吸附 蛋白纯化树脂通过与目标蛋白之间的特定相互作用来吸附目标蛋白。这些相互…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷5

某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,选…

Kafka集群部署 (KRaft模式集群)

KRaft 模式是 Kafka 在 3.0 版本中引入的新模式。KRaft 模式使用了 Raft 共识算法来管理 Kafka 集群元数据。Raft 算法是一种分布式共识算法,具有高可用性、可扩展性和安全性等优势。 在 KRaft 模式下,Kafka 集群中的每个 Broker 都具有和 Zookeeper 类…

飞腾FT2000-4/D2000-8 VPX主板

产品特点 ①国产飞腾FT2000-4或D2000-8处理器 ,同一模块兼容两种处理器,可以根据性能需要选择 ②丰富的万兆以太网、千兆以太网、USB、SATA接口,可用作数据处理、存储、通信服务器 ③内部集成FPGA-V7协处理器,支持SRIO、LVDS等…

【LangChain学习之旅】—(5) 提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

【LangChain学习之旅】—(5) 提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案 提示的结构LangChain 提示模板的类型使用 PromptTemplate使用 ChatPromptTemplateFewShot 的思想起源使用 FewShotPr…

Android通过Recyclerview实现流式布局自适应列数及高度

调用 FlowAdapter 跟普通recyclerview一样使用 RecyclerView rvLayout holder.getView(R.id.spe_tag_layout); FlowAdapter rvAdapter new FlowAdapter(); FlowLayoutManager flowLayoutManager new FlowLayoutManager(); rvLayout.setLayoutManager(flowLayoutManager); r…

MyBatis源码分析(六):数据源模块

1. 概述 本文,我们来分享 MyBatis 的数据源模块,对应 datasource 包。如下图所示: ​ 在 MyBatis源码分析(二):项目结构 中,简单介绍了这个模块如下: 数据源是实际开发中常用的组件…

Python Jinja2:强大易用的模板引擎

Jinja2是一个基于Python的模板引擎,它的功能类似于PHP的smarty,J2ee的Freemarker和velocity。 模板引擎的应用场景非常广泛,它可以将动态数据与静态模板结合,提高发效率和代码可维护性。 我们平时接触各类网页,邮件通…