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

2024-04-30 23:28

本文主要是介绍公开课—京东生产环境海量数据架构优化实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 读多写少——主库用来写,从库用来读
  • 单库的写压力太大——数据库的垂直和水平拆分
  • 分表怎么分呢?
    • 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.chinasem.cn/article/950188

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模