【Java八股文总结】之读写分离分库分表

news2024/9/25 19:22:36

文章目录

  • 读写分离&分库分表
    • 一、读写分离
      • 1、何为读写分离
      • 2、读写分离会带来什么问题?如何解决?
      • 3、如何实现读写分离?
      • 4、主从复制原理
    • 二、分库分表
      • 1、为什么要进行分库分表?
      • 2、何为分库?
      • 3、何为分表?
      • ★4、垂直和水平拆分?
        • 1、数据库的垂直&水平拆分?
        • 2、表的垂直&水平拆分?
      • 5、什么时候需要分库分表?
      • 6、分库分表会带来什么问题?
      • 7、分库分表使用什么?
      • 8、分库分表后,数据如何迁移?
      • 9、分库分表后,ID键如何处理?

读写分离&分库分表

一、读写分离

1、何为读写分离

读写分离主要是为了 将对数据库的读写操作分散到不同的数据库节点上。 这样的话,就能够小幅提升写性能,大幅提升读性能。
在这里插入图片描述
一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。主库和从库之间会进行数据同步,以保证从库中数据的准确性。这样的架构实现起来比较简单,并且也符合系统的写少读多的特点。

2、读写分离会带来什么问题?如何解决?

在这里插入图片描述
在这里插入图片描述

3、如何实现读写分离?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、主从复制原理

MySQL binlog(binary log即二进制日志文件)主要记录了MySQL数据库中数据的所有变化(数据库执行的所有DDL和DML语句)。因此,我们根据主库的MySQL binlog日志就能够将主库的数据同步到从库中。
在这里插入图片描述
在这里插入图片描述

二、分库分表

1、为什么要进行分库分表?

当MySQL中一张表的数据量过大的时候,不便于存储,因此我们需要分库分表。

2、何为分库?

分库 就是将数据库中的数据分散到不同的数据库上,可以是垂直拆分也可以是水平拆分。
下面这些操作都涉及到了分库:
①你将数据库中的用户表和用户订单表分别放在两个不同的数据库。
②由于用户表数据量太大,你对用户表进行了水平切分,然后将切分后的2张用户表分别放在两个不同的数据库。

3、何为分表?

分表 就是 对单表的数据进行拆分 ,可以是垂直拆分,也可以是水平拆分。

★4、垂直和水平拆分?

1、数据库的垂直&水平拆分?

垂直分库:为依据,不同表到不同库,每个库的表结构和数据都不一样=,合起来是全量数据。(如用户表和用户订单表放到不同数据库)
水平分库:
字段==为依据,一个库的数据拆分到多个库,每个库的表结构一致,数据不一致,合起来是全量数据。(如用户表的1-100000条记录在1号数据库,100001-200000条记录在2号数据库)

2、表的垂直&水平拆分?

垂直分表: 以字段为依据(对列拆分),不同字段分到不同表,每个表结构和数据不一致,合起来是全量数据。(如将用户信息表的1-10列抽取出来作为一张表,10-20列抽取出来作为另一张表)
水平分表: 以字段为依据(对行拆分),一张表数据拆分到多张表,每个表结构一致,数据不一致,合起来是全量数据。(如将用户信息表的1-100000条记录作为表1,100001-200000条记录作为表2,这样就可以避免单一表数据量过大对性能造成影响)
在这里插入图片描述

5、什么时候需要分库分表?

遇到下面几种场景可以考虑分库分表:
①单表的 数据达到千万级别以上 ,数据库读写速度比较缓慢(分表)。
②数据库中的数据占用的空间越来越大,备份时间越来越长(分库)。
③应用的并发量太大(分库)。

6、分库分表会带来什么问题?

引入分库分表之后,会给系统带来什么挑战呢?
① join操作:同一个数据库中的表分布在了不同的数据库中,导致无法使用 join操作。这样就导致我们需要手动进行数据的封装,比如你在一个数据库中查询到一个数据之后,再根据这个数据去另外一个数据库中找对应的数据。(不同数据库的表无法使用join操作,需要手动封装数据)
② 事务问题:同一个数据库中的表分布在了不同的数据库中,如果单个操作涉及到多个数据库,那么数据库自带的事务就无法满足我们的要求了。(不同数据库表操作,无法保证事务
③ 分布式id:分库之后,数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了。我们如何为不同的数据节点生成全局唯一主键呢?这个时候,我们就需要为我们的系统引入分布式id了。(不同数据库表操作,无法使用数据表的自增主键,得使用分布式id

7、分库分表使用什么?

ShardingSphere 项目(包括Sharding-JDBC、Sharding-Proxy和 Sharding-Sidecar)是当当捐入 Apache 的,目前主要由京东数科的一些巨佬维护。
在这里插入图片描述

8、分库分表后,数据如何迁移?

停机迁移,将老库的数据利用脚本文件更新到新库中。
双写方案,对老库的更新操作(增删改),同时也要写入新库(双写)。如果操作的数据不存在于新库的话,需要插入到新库中。这样就能保证,咱们新库里的数据是最新的。
在迁移过程,双写只会让被更新操作过的老库中的数据同步到新库,我们还需要自己写脚本 将老库中的数据和新库的数据做比对。如果新库中没有,那咱们就把数据插入到新库。如果新库有,旧库没有,就把新库对应的数据删除 (冗余数据清理)。重复上一步的操作,直到老库和新库的数据一致为止。

9、分库分表后,ID键如何处理?

分库分表后不能每个表的ID都是从1开始,所以需要一个 全局ID ,设置全局ID主要有以下几种方法:
(1)UUID:
优点:本地生成ID,不需要远程调用,全局唯一不重复
缺点占用空间大,不适合作为索引。

(2)数据库自增ID:
在分库分表表后使用数据库自增ID,需要一个专门用于生成主键的库,每次服务接收到请求,先向这个库中插入一条没有意义的数据,获取一个数据库自增的ID,利用这个ID去分库分表中写数据。
优点:简单易实现。
缺点:在高并发下存在瓶颈。

(3)Redis生成ID:
优点不依赖数据库,性能比较好。
缺点:引入新的组件会使得系统复杂度增加

(4)Twitter的snowflake雪花算法: 是一个64位的long型的ID,其中有1bit是不用的,41bit作为毫秒数,10bit作为工作机器ID,12bit作为序列号。
1bit:第一个bit默认为0,因为二进制中第一个bit为1的话为负数,但是ID不能为负数。
41bit:表示的是时间戳,单位是毫秒。
10bit:记录工作机器ID,其中5个bit表示机房ID,5个bit表示机器ID。
12bit:用来记录同一毫秒内产生的不同ID。

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

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

相关文章

Github+Markdown(1)

报错配置 如果报错如下:Failed to connect to github.com port 443: Timed out 解决方案: 在C:\Users\m00585487\.gitconfig文件中,添加如下内容 [http "https://github.com"] proxy http://m00585487:J!f42022proxyhk.huawei…

基础SSM框架搭建

SSM框架一、注入依赖二、配置web.xml三、springmvc-common.xml配置四、mybatis-config.xml配置五、log4j.properties日志文件配置六、jdbc.properties连接信息七、applicationContext.xml配置八、UserDao.xml案例九、UserService接口十、UserServiceImpl实现十一、MyConverter十…

【表白程序】盛开的玫瑰代码

我挥舞着键盘和本子,发誓要把世界写个明明白白。 今天带来的是盛开的玫瑰,希望大家喜欢! 简介 HTML5 SVG线条玫瑰花动画特效是一款基于svg绘制卡通玫瑰花动画,先用线条勾画出花的现状,在生成颜色过程特效。 利用所学…

如何提取图片中文字?安利这几个图片转文字提取的方法

在我们工作学习中,有没有遇到过需要将图片中的文字信息给记录下来的情况,一般这种时候你是怎么做的呢?是根据图片手动输入吗?如果是在文字少量的情况下,可以这样操作,可是如果文字较多的话,手动…

iOS 16.1新功能尝鲜:如何在iPhone上启用实时活动?

近日,苹果发布了iOS 16.1正式版,在本次更新中,苹果推出了全新“实时活动”功能,用户能在iPhone锁定屏幕上查看到更多信息,如果是iPhone 14 Pro机型,实时活动信息还将在灵动岛同步显示。 那么,i…

用HTML+CSS+JS做一个漂亮简单的游戏网页——全屏游戏美术大赛作品(4个滚动页面)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

[论文阅读] Adversarial Learning for Semi-Supervised Semantic Segmentation

[论文地址] [代码] [BMVC 18] Abstract 我们提出了一种使用对抗性网络进行半监督性语义分割的方法。虽然大多数现有的判别器都是在图像层面上对输入图像进行真假分类的训练,但我们以完全卷积的方式设计了一个判别器,以区分预测的概率图和考虑到空间分辨…

盘点一下分布式模式下的服务治理和监控优化方案

什么是服务治理? 相信每一个软件公司(企业)都希望可以确保开发及项目运行流程可以顺利,但是如果要完美完结那么需要其中会有很多的因素存在。包括,最佳实践、架构原则、服务治理以及其他决定性的因素。而其中服务治理…

网络入侵检测 Network Intrusion Detection System (NIDS)

网络入侵检测 Network Intrusion Detection System--NIDS网络入侵检测 Network Intrusion Detection System (NIDS)1.学习内容2.数据集说明3.NIDS组件4.基于SDN的网络入侵检测5.实验步骤下载数据集下载代码配置环境结构目录运行程序训练结果6.总结参考论文数据集申明&#xff1…

JVM垃圾回收——CMS垃圾收集器

目录 一、什么是CMS垃圾收集器 二、CMS垃圾收集的过程 三、CMS收集器的不足 四、CMS收集器的参数配置 一、什么是CMS垃圾收集器 虽然HotSpot虚拟机已经在jdk14中移除了CMS垃圾收集的参数,但是考虑到还有很多开发是基于jdk8开发的,所以还是有必要了解…

leetcode17. 电话号码的字母组合

文章目录题目思考代码和注释总结题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 来源:力扣(…

【计算机毕业设计】5.网上书店系统maven源码

一、系统截图(需要演示视频可以私聊) 摘要 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化、网络化和电子化。网上销售,它将是直接市场营销的最新形式。本论文是以构建网上书店系统为…

善网ESG周报(第一期)

ESG报告: 诺基亚最新ESG报告已出炉 报告显示,诺基亚的ESG战略着重于环境、工业数字化、安全和隐私、缩小数字鸿沟、以及企业责任。 Lazada 发布首份ESG报告:为东南亚六国创造约110万经济机会 报告提出,Lazada在区域赋能方面、…

BGP进阶:BGP 综合实验二

实验拓扑及说明 设备编号及互联线路如图所示;所有设备的互联地址段采用10.1.xy.0/24,其中xy为设备编号,x为编号较小的设备,y为编号较大的设备。例如R2及R3之间的直连链路,网段为10.1.23.0/24,这条链路上R2的…

2023年系统规划与设计管理师-第一章信息的综合知识

1. 思维导图 2.信息补充 2.1 信息的传输模型 2.2 信息质量的七大属性 2.3 信息化的基本内涵 2.4 电子商务类型 2.5 电子商务类型 2.6 电子商务的特征 2.7 电子商务的基础设施 2.8 加快商务发展的基本原则 2.9 企业信息化 2.10 信息系统的组成部分 2.11 信息系统的生命周期 2.12…

世界杯 | 中国首次承建世界杯主赛场,基建狂魔用BIM征服世界杯

hi,家人们,我是建模助手。 呐,一如既往地,这次世界杯中国除了球队,其他基本都去了卡塔尔,我可不是在搞幽默,本次世界杯可真是中国元素满满—— 包括但不限于Made in China的纯电大巴、无人驾驶地…

技术分享 | 无人驾驶汽车的眼睛

根据智能化程度的不同,自动驾驶被分为5个等级:L1辅助驾驶、L2部分自动驾驶、L3有条件自动驾驶、L4高度自动驾驶、L5完全自动驾驶,即真正的无人驾驶。 日渐活跃于公众视野的“无人驾驶”概念,往往是指L3及以上级别的自动驾驶。目前…

深度解析为什么做深度学习,都用python,而不用java或者c++

前言 Python是解释语言,这让写程序方便不只一点。举例来说,在C等编译语言里写一个矩阵乘法,需要自己分配操作数(矩阵)的、分配结果的内存、手动对BLAS接口调用gemm、最后如果没用smart pointer还得手动回收内存空间。P…

看完这篇SpringBoot让我在阿里成功涨薪40%,感谢

前言: SpringBoot的好处是把Java2EE的各项技术的整合变得非常的简单,但是也有它的缺点,它的封装性太强,如果你想了解SpringBoot底层的原理,你必须对SpringMvc、Spring注解等比较了解,你才能更好的去了解Sp…

Jenkins项目中有中文文件出错处理

jenkins build的时候报 ... Malformed input or input contains unmappable characters... 提示是由于项目中有中文文件名,乱码处理不了 ERROR: Build step failed with exception java.nio.file.InvalidPathException: Malformed input or input contains unmappab…