公开课—京东生产环境海量数据架构优化实战

news2025/1/11 23:40:26

文章目录

  • 读多写少——主库用来写,从库用来读
  • 单库的写压力太大——数据库的垂直和水平拆分
  • 分表怎么分呢?
    • hash分表
    • range分表
    • 多数据源操作与分布式事务问题
  • ShardingSphare分库分表(京东开源)
  • 关联查询怎么办?跨多个库,多张表怎么办?——要考虑业务场景
  • 线上单库如何迁移到多库多表
  • 监听binlog
  • 依旧有问题——临界的时候
    • 过一段时间把binlog的执行失败的sql语句从新做一遍
    • 又有问题了——数据达到一致后,直接上线吗?——灰度发布
    • 无损发布
    • 既想要解决数据热点的问题,又想不做数据迁移
    • TiDB 分布式数据库

在这里插入图片描述
早期都是单库单表
在这里插入图片描述

读多写少——主库用来写,从库用来读

主库写完了之后,同步到从数据库,通过从数据库分担压力
中小公司完全OK

单库的写压力太大——数据库的垂直和水平拆分

在这里插入图片描述
垂直拆分——比如微服务架构,根据不同业务我们拆分微服务应用,数据库的表也要按照业务分开。

水平拆分——虽然拆分成单表,如果一张表的量超过500万或1000万,数据的增量太快,这里假如到达4000万,就要把一张订单表拆成多张表。

垂直分库,水平分表

分表怎么分呢?

hash分表

在这里插入图片描述
hash分表的方式有个问题——假如分的四张表又快满了,还要再拆表,那总共八张表了,按照以前的**id%(表的个数)**的办法落在其他表中,以前的算法落得表和现在不一是同一个表了,查不到了,所以必须要把老数据做一次迁移。
数据迁移扩容痛苦

range分表

在这里插入图片描述
就是把数据按照范围顺序放,这样根据id算一下在什么范围,即使扩容了也可以找到。

当订单id在1000万以内,操作同一张表,如果并发特别大,压力特别大,那各种修改,新增,加大量的锁,性能肯定受影响。

这个问题就叫热点的问题

多数据源操作与分布式事务问题

其实市面上有很多很好的分库分表框架,直接用

ShardingSphare分库分表(京东开源)

在这里插入图片描述

非常轻量,
内部有很多的组件,Sharding-jdbc组件,其实就是帮我们做分库分表的,做好分库分表的配置文件,按照什么字段,什么规则配置好。

关联查询怎么办?跨多个库,多张表怎么办?——要考虑业务场景

在这里插入图片描述
从用户端思考,对于一个用户,我们尽量让他的数据落在一个库,一张表,这样查起来容易得多。用userId来分,这样插用户信息免费,那查订单呢?在orderId后面拼接上serId(后四位)

商家端:用商家的id作为分库分表的字段合适,上面的规则不适用了啊?查商家的订单就要跨库了呀,在互联网公司,商家端的数据会单独再存一份。按照商家端的id做路由分库分表。

运营管理端:要查全量数据,怎么办?
如果非实时的情况,可以把全量的数据放到数据仓库中(大数据),查的比较慢,可以走数据仓库;
如果要求实时的话(elasticsearch),一般需求是定好的,我们根据要查询的几个维度的字段,建立索引到ES的大宽表,这时候查起来就很快了。

在这里插入图片描述

线上单库如何迁移到多库多表

在这里插入图片描述
一般都是不停机迁移,但前段不断有新的增删改查操作来修改数据,我们的迁移是把数据复制过去,这时候要是来了一条修改已迁移的数据,怎么办?难道重头扫一遍吗?

监听binlog

数据库的binlog日志,
在这里插入图片描述
数据库有很多日志的,面试的时候很经常问。

binlog用来记录数据库的所有修改操作,

后端虽然在做全量的迁移,实时的增删改的操作,我们可以拿出来写进我们的新系统(多库多表),这样就同步了。

依旧有问题——临界的时候

insert一条语句,sql执行了一次,在迁移完成后,binlog在新数据库又执行了一次,会逐渐冲突(不过这个问题不大)。
在这里插入图片描述
update语句和delete语句问题大了。
假设update语句修改了单库单表,还没更新的时候,这时候被迁移查到了,准备写到多库多表,还没写成功的时候,这时候binlog更新了多库多表,查不到就更新为空,这时候老库的数据迁移过来了,实际写入多库多表的数据是旧数据。
delete同样在临界的时候会有问题。

过一段时间把binlog的执行失败的sql语句从新做一遍

binlog执行失败的sql丢到队列中去,过一段时间重新执行。

又有问题了——数据达到一致后,直接上线吗?——灰度发布

搞一小部分流量先打过来,看数据能不能进入到我们的多库多表,试探一下数据是不是正确,没问题了再全部上线。
灰度发布时间不能太长,否则会造成很多的报错,比如有个请求打到单库单表,而这个数据在多库多表中,这就报错啦。所以不能太长时间。

无损发布

就是把单库单表的数据断掉,直接把多库多表全流量切换上线。
这要是有问题的话,回退比较麻烦

所以一般采用的是灰度发布
在这里插入图片描述

既想要解决数据热点的问题,又想不做数据迁移

我们设计一套分库分表方案,并且解决热点问题?

TiDB 分布式数据库

这就不用做分库分表了,很多事情他帮我们做了。

后面就是卖课广告了

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

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

相关文章

CUDA的基础知识

文章目录 数据精度CUDA概念线程&线程块&线程网络&计算核心GPU规格参数内存 GPU并行方式数据并行流水并行张量并行混合专家系统 数据精度 FP32 是单精度浮点数,用8bit 表示指数,23bit 表示小数;FP16 是半精度浮点数,用…

【C++】封装哈希表 unordered_map和unordered_set容器

目录​​​​​​​ 一、unordered系列关联式容器 1、unordered_map 2、unordered_map的接口 3、unordered_set 二、哈希表的改造 三、哈希表的迭代器 1、const 迭代器 2、 operator 3、begin()/end() ​ 4、实现map[]运算符重载 四、封装 unordered_map 和 unordered_se…

ThinkPHP Lang多语言本地文件包含漏洞(QVD-2022-46174)漏洞复现

1 漏洞描述 ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前,存在一处本地文件包含漏洞。当ThinkPHP开启了多语言功能时,攻击者可以通过lang参数和目录穿越实现文件包含,当存在其他扩展模块如 pear 扩展时,攻击者可…

【城市】2023香港身份与生活定居相关政策(IANG,优才/高才/专才,受养人/单程证)

【城市】2023香港身份与生活定居相关政策(IANG,优才/高才/专才,受养人/单程证) 文章目录 一、如何获得香港身份1、7年计划2、旅游签 二、港澳相关的证件类别1、HK证件2、CN证件 三、香港生活对比内地 本文仅代表2023年查阅相关资料…

「C/C++ 01」计算结构体/类的大小和内存对齐

目录 一、计算结构体的大小 二、计算类的大小 三、内存对齐 一、计算结构体的大小 计算结构体的大小要遵循内存对齐规则:即从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个&#x…

LVGL自定义滑动

触摸和编码器都可以操作 typedef struct {lv_obj_t* obj;int16_t x;int16_t y;int16_t width;int16_t height; }pos_and_size_t;typedef struct {lv_obj_t* obj;lv_coord_t height;lv_coord_t width;lv_coord_t width_pad;lv_coord_t height_pad;lv_coord_t child_widget;lv_co…

监控操作台为生活提供安全保障

在科技日新月异的现代社会,监控操作台已成为我们生活中不能缺少的一部分。它犹如一座城市的守护神,默默无闻地守护着我们的安全,确保着每一刻的平安。今天,和北京嘉德立一同走进这个神秘的世界,揭开监控操作台的神秘面…

(十四)Servlet教程——Servlet中HttpSession的使用

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,相应地也增加了服务器的存储压力。 1. 什么是Session Session是另外一种记录客户端状态的机制,不同的是Cookie保存在客户…

线程池嵌套导致的死锁问题

1、背景 有一个报告功能,报告需要生成1个word,6个excel附件,总共7个文件,需要记录报告生成进度,进度字段jd初始化是0,每个文件生成成功进度加1,生成失败就把生成状态置为失败。 更新进度语句&…

Vue入门到关门之Vue项目工程化

一、创建Vue项目 1、安装node环境 官网下载,无脑下一步,注意别放c盘就行 Node.js — Run JavaScript Everywhere (nodejs.org) 需要两个命令 npm---->pipnode—>python 装完检查一下,hello world检测,退出crtlc 2、搭建vu…

Linux:浏览器访问网站的基本流程(优先级从先到后)

浏览器访问网站的基本流程(优先级从先到后) 首先查找浏览器是否存在该网站的访问缓存 其次查找本机的域名解析服务器 windows:C:\Windows\System32\drivers\etc\hostsLinux:/etc/hosts 使用外部的域名解析服务器解析&#xff…

逆向第一步 去掉debugger(无任何门槛小白可学习)

准备工具 1.ReRes 地址:ReRes 用法: 用法 2.nodepad 地址:nodepad 注意下载后缀为.x64.exe版本的 我这里下的npp.8.6.5.Installer.x64.exe 3给nodepad装上JSTool插件 下载 可省略下叙详细步骤点此链接直接下载 JSToolNpp 然后到导…

Go语言基本语法(三)指针

什么是指针 在Go语言中,"指针是一种存储变量内存地址的数据类型",意味着指针本身是一个特殊的变量,它的值不是数据本身,而是另一个变量在计算机内存中的位置(地址)。形象地说,就像存…

Avalonia .NET构建Linux桌面应用

目录 👻前言 💻安装Avalonia 📦创建项目 📚在win下运行 ​🔑打包发布​编辑 📻在linux下运行 环境WIN10 VS2022 debian 👻前言 Avalonia 是一个用于创建跨平台用户界面 (UI) 的开源框架…

C++——STL容器——vector

vector是STL容器的一种,和我们在数据结构中所学的顺序表结构相似,其使用和属性可以仿照顺序表的形式。vector的本质是封装了一个动态大小的数组,支持动态管理容量、数据的顺序存储以及随机访问。 1.前言说明 vector作为容器,应该…

对6个默认成员函数的总结

前言:本篇文章是对六大默认成员函数的自我总结,不适合刚入门的新人学习。适合想进一步深入了解六大默认成员函数的人学习。 1.构造函数:给对象初始化的函数,相当于之前写的Init函数。 构造函数的特性: 对内置类型不…

深度解析:人工智能作画算法的原理与技术

引言 在数字艺术的探索中,人工智能(AI)作画算法以其独特的创造性和艺术性引起了广泛的兴趣。这些算法不仅仅是简单的图像处理工具,它们背后蕴藏着复杂的神经网络和深度学习模型。本文将深入探讨AI作画算法的原理与技术&#xff0…

day15 学一下Tailwindcss(java转ts全栈/3r教室)

目前距离全栈差得最多的是前端,而对于前端主要是CSS一直不熟悉,觉得很复杂写起来总是不上道,所以特别关注下Tailwindcss吧,其他前端框架可以先放放,多说无益直接用tailwindcss做个页面试试 看下文档:Tailwi…

【LeetCode刷题记录】104. 二叉树的最大深度

104 二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入&#xff…

HarmonyOS开发案例:【排行榜页面】

介绍 本课程使用声明式语法和组件化基础知识,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,使用Builder创建排行列表布局内容,使用装饰器State、Prop、Link来管理组件状态。最后我们点击…