高性能(二)

news2024/10/6 8:28:44

三、读写分离和分库分表

1.读写分离

1.1 概述

将数据库的读写操作分散到不同的数据库节点上

在这里插入图片描述

  • 通常一主多从一台主数据库负责写,多台从数据库负责读。

  • 主库和从库之间会进行数据同步,以保证从库中数据的准确性。

1.2 问题及解决

1.2.1 问题

主从同步延迟

主库写完数据后同步到从库之前主从数据不一致

1.2.2 解决

(1)强制将读请求路由到主库处理

  • 适合将必须获取最新数据的读请求都交给主库处理

  • 方案:Sharding-JDBC
    通过Sharding-JDBC的HintManager分片键值管理器强制使用主库

HintManager hintManager = HintManager.getInstance();
hintManager.setMasterRouteOnly();
// 继续JDBC操作

(2)延迟读取

  • 适合对数据比较敏感的场景,在写请求后避免立即读操作
    如:支付成功后跳转到一个支付成功页面,点击返回后才返回自己的账户。

1.3 如何实现读写分离

1.3.1 常规步骤

(1)部署一主多从数据库
(2)主从复制

保证主从数据库之间的数据是实时同步的

(3)主库处理写请求,从库处理读请求

1.3.2 项目实现方式

(1)代理方式

在这里插入图片描述

  • 应用和数据中间加一个代理层,并处理应用程序所有的数据请求

  • 代理层负责读写请求,将他们路由到对应的数据库中

  • 中间件
    MySQL Router(官方)、Atlas(基于 MySQL Proxy)、Maxscale、MyCat。

(2)组件方式

引入第三方组件处理读写请求(推荐)

如:sharding-jdbc,引入jar包即可使用,非常方便且节省很多运维成本

官方链接:
sharding-jdbc 关于读写分离的操作

1.4 主从复制原理

1.4.1 概述

  • MySQL binlog(binary log 即二进制日志文件)主要记录了MySQL数据库中数据的所有变化(数据库执行的所有 DDL 和 DML 语句)

  • 根据主库的 MySQL binlog 日志就能够将主库的数据同步到从库中。

备注: binlog 还能帮助我们实现数据恢复。

1.4.2 步骤

在这里插入图片描述

(1)主库将数据库中变化写入到binlog中
(2)从库链接主库
(3)从库创建一个I/O线程向主库请求更新的binlog
(4)主库会创建一个binlog dump线程来发送binlog,从库的I/O线程负责接收
(5)从库的I/O线程将接收的binlog写入到relay log中
(6)从库的SQL线程读取relay log同步到本地数据库(执行SQL)

1.4.3 延伸

(1)阿里开源canal
实现MySQL数据库之间或与其他数据源如elasticsearch之间的数据同步,底层也是依赖binlog,原理模拟MySQL主从复制过程

(2)Redis也是通过主从复制实现读写分离

详见我另一篇博客,链接:
数据库及缓存之Redis(一)




2.分库分表

解决数据库存储数据量过大问题

2.1 分库

2.1.1 概念

将数据库中的数据分散 到不同的数据库中

2.1.2 分类

(1)垂直分库
  • 把单一数据库按照业务划分,不同业务使用不同的数据库

  • 举例
    将数据库中的用户表、订单表、商品表分别单独拆分为用户数据库、订单数据库、商品数据库

在这里插入图片描述

(2)水平分库
  • 把同一个表按一定规则拆分到不同的数据库中,每个库可以位于不同的服务器上,实现水平扩展,解决单表的存储和性能瓶颈问题

  • 举例
    订单表数据量太大,订单表水平切分后的2张表分别放在不同数据库

在这里插入图片描述

2.2 分表

对单表的数据进行拆分

在这里插入图片描述

2.2.1 垂直拆分

(1)对数据列拆分,把一张列比较多的表拆分为多张表
(2)举例

将用户信息表中一些单独列抽出来作为一张表

2.2.2 水平拆分

(1)对数据行拆分,把一张行比较多的表拆分为多张表,解决单一表数据量过大的问题。
(2)举例

将用户信息表拆分为多个用户信息表,避免单一表数据量过大造成性能下降

备注: 为了提升性能,通常会选择拆分后的多张表放在不同数据库中,即水平分表和水平分库结合

2.3 分库分表的场景

(1)单表的数据达到千万级别以上,数据库读写速度比较缓慢。
(2)数据库中的数据占用的空间越来越大,备份时间越来越长。
(3)应用的并发量太大

2.4 常见的分片算法

分片算法主要解决了数据被水平分片之后,数据究竟该存放哪个表的问题。

2.4.1 哈希分片

求指定key(如id)的哈希,然后根据哈希值确定数据应被放置在哪个表中。

适合随机读写而不适合经常需要范围查询的场景

2.4.2 范围分片

按照特性的范围区间(如时间、ID区间)来分配数据

  • 适合经常进行范围查找而不适合随机读写的场景
    因为数据未被分散容易出现热点数据的问题

  • 举例
    如将id 为 1~299999 的记录分到第一个库,300000~599999 的分到第二个库。

2.4.3 地理位置分片

根据地理位置(城市、地域)来分配数据

很多 NOSQL数据库都支持

2.4.4 融合算法

灵活组合多种分片算法

如将哈希分片和范围分片组合

2.5 分库分表问题

2.5.1 无法join操作

  • 同一个数据库中的表分布在不同的数据库中无法使用join操作

  • 需要在一个数据库中查询到一个数据再去另外一个数据库汇总查询对应的数据

2.5.2 事务问题

  • 同一个数据库中的表分布在不同的数据库中,单个操作涉及到多个数据库,数据库自带的事务无法解决

2.5.3 分布式ID

  • 分库后,数据遍布在不同服务器上的数据库中,数据库的自增主键已经没办法满足生成的主键唯一。

  • 需要引入分布式ID

2.5.4 其他

  • 需要更多的数据库服务器,成本上升了

2.6 分库分表方案

ShardingSphere 项目

在这里插入图片描述

(1)包括 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar,由京东数科巨佬维护
(2)功能完善

支持读写分离和分库分表、分布式事务、数据库治理等功能。

(3)生态体系完善

社区活跃,文档完善,更新和发布比较频繁

入门可以看看下面这篇文章:
《芋道 Spring Boot 分库分表入门》

2.7 分库分表数据迁移

2.7.1 停机迁移

  • 系统使用的人数非常少的时候,如凌晨 2 点,挂公告系统要维护升级预计 1 小时。

  • 再写个脚本老库的数据写到新库中

2.7.2 双写方案

针对不能停机迁移场景

原理如下:

(1)对老库的更新操作(增删改),同时也要写入新库(双写)
(2)还需要自己写脚本将老库中的数据和新库的数据做比对
  • 在迁移过程,双写只会让被更新操作过的老库中的数据同步到新库

  • 如果新库中没有,那咱们就把数据插入到新库

  • 如果新库有,旧库没有,就把新库对应的数据删除(冗余数据清理)

(3)重复上一步的操作,直到老库和新库的数据一致为止

备注:
项目中实施双写很麻烦很容易会出现问题,建议使用数据库同步工具 Canal 做增量数据迁移(还是依赖 binlog,开发和维护成本较低)。





上一篇跳转—高性能(一)                 下一篇跳转—高性能(三)


本篇文章主要参考链接如下:

参考链接1-JavaGuide


持续更新中…

随心所往,看见未来。Follow your heart,see light!

欢迎点赞、关注、留言,一起学习、交流!

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

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

相关文章

ChatGPT眼中的产品经理是这样的

在玩ChatGPT的时候,突发奇想,ChatGPT对产品经理的认知是啥样呢?于是我找了几个大家都比较关注的产品经理问题,看看ChatGPT是如何回答的。1、产品经理可以干一辈子嘛?2、产品经理的核心竞争力是啥?3、产品经…

【本周特惠课程】深度学习6大模型部署场景(Pytorch+NCNN+MNN+Tengine+TensorRT+微信小程序)速成!...

前言欢迎大家关注有三AI的视频课程系列,我们的视频课程系列共分为5层境界,内容和学习路线图如下:第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用…

操作系统——1.操作系统的概念、定义和目标

目录 1.概念 1.1 操作系统的种类 1.2电脑的组成 1.3电脑组成的介绍 1.4操作系统的概念(定义) 2.操作系统的功能和目标 2.1概述 2.2 操作系统作为系统资源的管理者 2.3 操作系统作为用户和计算机硬件间的接口 2.3.1用户接口的解释 2.3.2 GUI 2.3.3接…

代码随想录第十一天(459)

文章目录459. 重复的子字符串答案思路暴力破解移动匹配459. 重复的子字符串 也不知道为啥这个提示简单题…… 答案思路 暴力破解 例如:abcabc 移位一次:cabcab 移位两次:bcabca 移位三次:abcabc 现在字符串和原字符串匹配了…

搭建Vue版Ant Design Pro后台管理系统

搭建Vue版Ant Design Pro后台管理系统 此文章通过基于Vue实现的Ant DesignPro脚手架快速构建一个后台管理系统的前端 相关文档链接 1、【Ant Design Pro of Vue 官方文档】2、【Vue 官方文档】3、【Vue Router 官方文档】 Ant Design Pro相关系列文章: 一、AntDesig…

Ansible中常用的模块

目录 一、Ansible Ad-Hoc命令集 1 Ad-hoc 使用场景 2 Ansible的并发特性 3 Ansible-doc用法 4 ansible命令运行方式及常用参数 5 ansible的基本颜色代表 6 ansible中的常用模块 command模块 shell模块 script模块 copy模块 fetch模块 unarchive模块 archive模块…

Spring3之控制反转(IOC)

简介 控制反转(Inversion of Control, 缩写为IoC), 是面向对象编程中的一种设计原则, 可以用来减低计算机代码之间的耦合度;其中最常见的方式叫做依赖注入(Dependency Injection, 简称DI), 还有一种方式叫 “赖查找” (Dependency Lookup); 通过控制反转, 对象在被创建的时候,…

CData Drivers for Acumatica

CData Drivers for Acumatica Acumatica的CData驱动程序为用户提供了使用AcumaticaERP数据的便捷途径,该数据来自商业智能、分析、定制应用程序、报告以及ETL。通过JDBC、ADO.NET和ODBC等标准驱动程序,以及与PowerShell、Power BI、Excel、SSIS等流行应用…

java微信小程序音乐播放器分享系统

随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,音乐播放器小程序被用户普遍使用,为方便用户能够可以随时进行音乐播放器小程序的数据信息管理,特开发了基于音乐播放器小程序…

计算之变:联想问天给中国智能IT基础设施划下新起点

“冥昭瞢暗,谁能极之?冯翼惟象,何以识之?”屈原在《天问》中喊出了心中的困惑,用无数个问题,展现了中国人对世界的探索精神和好奇心。人对时空无限性的追问,伴随的是对有限性的焦灼感。幸好&…

JZ50、JZ57、JZ56

文章目录JZ50 第一个只出现一次的字符题目描述:具体实现:JZ57 和为S的两个数字题目描述:具体实现:JZ56 数组中只出现一次的两个数字题目描述具体实现:JZ50 第一个只出现一次的字符 题源 👉 第一个只出现一…

在线预览PDF文件、图片,并且预览地址不显示文件或图片的真实路径。

实现在线预览PDF文件、图片,并且预览地址不显示文件或图片的真实路径。1、vue使用blob流在线预览PDF、图片(包括jpg、png等格式)。1、按钮的方法:2、方法详细:(此方法可以在发起请求时携带token&#xff0c…

Data2Vec:视觉、语音和语言的语境化目标表征的高效自监督学习

Efficient Self-supervised Learning with Contextualized Target Representations for Vision, Speech and Language (视觉、语音和语言的语境化目标表征的高效自监督学习) 论文:efficient-self-supervised-learning-with-contextualized-t…

【Hello Linux】Linux工具介绍 (gcc/g++ gdb)

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具gcc/g 以及gbd Linux工具介绍gcc / ggcc / g的作用为什么语言要经过这四步才能变为可执行指令gcc / g语法预处理编…

机器学习强基计划8-1:图解主成分分析PCA算法(附Python实现)

目录0 写在前面1 为什么要降维?2 主成分分析原理3 PCA与SVD的联系4 Python实现0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型&#xf…

MATLAB | 情人节来绘制更立体的玫瑰花吧

又是一年情人节,今年带来一款更有立体感的玫瑰: 曲面的函数表达式来自: http://www.bugman123.com/Math/index.html 这个网站,上面还有很多其他帅气的玩意。 基础绘制 xlinspace(0,1,300); thetalinspace(-2*pi,15*pi,300); [x,theta]meshg…

【历史上的今天】2 月 14 日:第一台通用计算机面世;IBM 成立;Julia 公开发布

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 2 月 14 日,在 1819 年的今天,打字机和第一台 QWERTY 布局键盘的发明者克里斯托弗肖尔斯(Christopher Sholes)出…

API文档自动生成工具

一、参考资料 从Python源码注释,自动生成API文档 二、问题引入 不管是开源还是闭源,要让所有人都能读懂你的代码这太难了,所以文档是很重要的。大部分情况,我们不希望维护一份代码再加上一份文档,这样做很容易造成文…

Springboot扩展点之InitializingBean

前言InitializingBean这个扩展点,其实在Springboot扩展点之BeanPostProcessor中已经简单有所涉及,而这篇文章的将重点分析其功能特性、实现方式和工作原理。功能特性1、Spring中提供了InitializingBean接口,帮助用户实现一些自定义的初始化操…

为什么学了模数电还是看不懂较复杂的电路图

看懂电路并不难。 (1) 首先要摆正心态,不要看到错综复杂的电路图就一脸懵逼,不知所错。你要明白,再复杂的电路也是由一个个的基本电路拼装出来的。 (2) 基础知识当然是少不了的,常用的基本电路结构搞搞清楚。 (3) 分析电路之前先要…