数据库主从复制,读写分离,分库分表理解 (数据库架构演变)

2023-10-31

主从复制

主从复制, 主要是针对MySQL数据库的高可用性, 容灾性上面.     

是叫做高可用性?

高可用性可以简单的理解为容灾性, 稳定性, 针对故障,风险情况下的处理, 备案, 策略. 

指系统无中断地执行其功能的能力,代表系统的可用性程度

高可用性通常通过提高系统的容错能力来实现

最常见的容错手段有哪些?

备份, 简单来讲就是备份. 很容易想嘛, 当你不小心删除掉了自己最新的拍的照片, 急得要死,突然柳暗花明又一村我去,在自己的网盘上发现了备份.

说到备份策略: 本文的主从复制, 就是一个备份策略, 从服务器,甚至可以叫做备份服务器,   怎么容灾, 很简单, 主机挂掉, 迅速提拔一台从机成为新的主机, 其他的从机成为这台新主机的从机.

说到这个备份, 其实redo log不也是用于容灾数据恢复的嘛. 本质上也是一种备份, 对数据操作的一个备份嘛. 写日志文件备份, 写日志数据库备份. (策略模式, 不同的备份容灾策略) 

首先需要理解主从复制是什么?

就是master主MySQL数据库将数据更新同步刷新复制到slave从MySQL数据库上去。一个主库可以对应多个从库. 从库和主库之间建立MySQL链接通道.

主库复制到从库中的是什么? 是更新操作, 写操作. 也就是insert update delete的操作对应更新到从库上. 这个是在MySQL Server层次上面的。通过binary log二进制日志实现主从复制.

  bin log 记录的是对MySQL数据库执行的写操作(写事件) eg: update insert delete 

  1. 将数据库的数据更新(做的什么操作, 操作的修改) 写入到主MySQL数据库所在服务器上的bin log 日志中.
  2. slave机器通过I/O线程连接master机器, 然后开启一个binlog dump process将bin log中的内容(写事件)传输备份到slave机器上. 
  3. 传输到slave从机器上之后通过从机上面的IO线程将从bin log传输而来的数据(写事件)临时存储在relay log(中继日志)上  (中继缓冲, 缓存)
  4. MySQL从服务器上会启动一个sql从线程, 从relay log 中继日志中读取写事件写sql, 并且将其重放似的重新执行在slave MySQL数据库上, 来保持数据一致性. 

思考: 为什么要存在relay log?  且为什么relay log放在OS缓存中?

存在relay log,本质上就是作为一个缓冲. 写事件的回放执行, 是需要时间的, 所以必须将从master机器上传输过来的bin log 二进制日志(记录的跟新写操作)临时存储在relay log缓存中. 

说白了, 就是为了异步刷新写操作到master主机上嘛, 没有这个中继日志的缓冲, 数据得不到临时存储, 就需要同步传输且执行这些写事件sql. 但是明显同步会阻塞住IO线程的拷贝)

缓存池, 缓存技术, 线程池, 任务线程池, 这种都是一个异步解耦, 都是为了临时缓存任务, 异步可以避免提供任务线程(主动方, 生产者方)的阻塞, 提升性能. 

relay log 放入OS缓存中是为了降低relay log的开销, 降低此处的IO操作开销, 提升性能.

思考开启主从复制之前是否需要保证主从库的数据一致性?   是需要的, 如果主从库同时创建初始化, 从库需要做的事情是需要能找到主库的bin log二进制日志. (用于回放同步的磁带操作录像)

如果master机器提前开启了一段时间了, 存在一定的业务数据了, 此时创建的slave机器则需要先备份mysqldump主库的数据, 然后再将其导入source到从库中,使其在开启主从复制之前保证数据一致.

从库要可以作为主库的一个备份库,备用库, 我们首先应该保证的是主库有的数据, 从库中有, 数据一致之后才能进行主从复制(主从库的数据同步.) 

主从数据库的配置.  自己去实现一下主从数据库的配置对我们来说是有必要的, 但是可恶的是,我本意是先要用云服务器作为master机器, 本地主机作为slave机器. 但是我发现我在学校里面ipconfig之后看到的是一个局域网ip. 所以master机器ping不通我这个局域网ip, 所以我只能留着回去老家的时候再尝试.  ----  立下flag。

读写分离

如果说主从复制就是简单的备份, 容灾操作, 提升高可用性的.

那读写分离就是从高并发的角度来思考的. 提升抗压, 并发性能. 一台机器扛不住, 就来多台机器集群来扛住.

读写部署在不同的主从机器上, 一般而言数据写操作是比较少的, 大多都是读取操作比较多. 所以往往是一台master机器负责写sql, 并且及时将这些写操作回放同步到slave从机上去.  (主从复制)多台slave机器就负责执行sql读请求.

说白了就是一个服务器集群, 这个也是一个经典的MySQL数据库服务器的集群模型. 一台master主机仅仅负责所有的sql写事件请求的执行服务, N台slave从机负责所有的sql读事件请求的执行服务.

这些请求的分发操作,依赖的是中间的一台反向代理服务器MyCat.

  

读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份(主从复制)的同时也实现了数据库性能的优化,以及提升了服务器安全。

读写分离模型(1-N, N-M):

想一想如果master机器挂掉了, 我们应该怎样处理. 针对这种集群,最需要关注的就是监控的这些上游的真正提供业务服务的这些主机的存活情况, 以及硬件配置好坏. 监控存活可以通过维护心跳包.

如果真的master机器挂掉了. 采取的方法是,将slave机器群中的一台提升为master机器, 其他的slave机器转而成为新的master机器的从机. 

还可能是一个反向代理服务器监控着两个master或者多个maser. 这个时候,两个master之间也可以来个主从复制, 互为主从, 要是一个集群挂掉了,从集群还可以顶替正常工作, 做一个容灾.

配置, 同样立下flag回老家完成, 加油, 立下的flag还是要实现的, 现在不研究配置, 将来去了公司谁管你配置. 加油,干掉一个配置是一个, 积累经验.

分库分表

分库分表的必要性? 原因? 还是一个流量的上升,单机写性能下降,业务需求促使架构的发展.

数据库架构的一个扩展演变, 最开始的时候大多数项目运用单机数据库就足够了,但是随着服务器的流量越来越大, 出现了读写分离. 多个从库副本负责数据库的读操作, 主库负责写. Master和slave通过主从复制, 保证数据的同步一致性. slave从库可以水平扩展, 所以对于读请求的处理是不成什么大问题的.

但是随着用户量级的进一步提升,写操作的压力越来越大,哪怕我们开启了读写分离, 性能依然下降的很严重. 这个时候我们就必须进行一个分库分表操作.

分库分表到底是个啥意思?

就是说将存放大量数据的表或库中的数据分散到不同主机上, 使得单个主机的数据量减小,  而实现的一个大数据量下的分散压力,提升数据库性能, 切分操作.   --- 切分后如何对数据的快速定位成为了关键的问题?    如何保证数据定位? 操作定位? 定位请求应该到那一台主机上. 数据在那一台主机上. 

切分方式: 垂直切分/纵向扩展.本体拆分(大库拆小库. 大表拆小表. ), 水平切分   (分库 + 分表) 

单库太大

单库处理能力有限、所在服务器上的磁盘空间不足、遇到IO瓶颈,需要把单库切分成更多更小的库

单表太大

CURD效率都很低、数据量太大导致索引膨胀、查询超时,需要把单表切分成多个数据集更小的表

垂直分库, 按照业务分类进行划分, 每个业务独有一个数据库 (将拆分出来的库分散在多个数据库服务器上. 纵向扩展) 

垂直分库

业务间解耦,不同业务的数据进行独立的维护、监控、扩展

垂直分表

也就是“大表拆小表”,基于列字段进行。 一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。 一般是针对几百列的这种大表,也避免查询时,数据量太大造成的“跨页”问题.   

例如: 一个order表有很多字段, 把长度较大且访问不频繁的字段, 拆分出来创建一个单独的扩展表work_extend进行存储.

核心表存储的是访问频次比较高, 且字段比较短的数据. 可以加载更多数据到内存中, 增加查询的命中率, 以此来提高数据库性能.

水平分表

针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面 去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈,不建议采用。 (只是减少了单表的数据量,但是本质上还是在一个库中, 还在竞争同一个物理机的CPU、内存、网络IO)。  (水平分表,只是将数据拆拿出几行拆分成不同的表. 并不是拆分列.) 

水平分库分表

将分出来的表放到不同的库(多个服务器上去)中. 使得单个表的数据量变小,达到分布式的效果。真正解决了高并发时单库数据量过大的问题,提升系统稳定性和负载能力。

数据应该去往哪个表的问题?

不论是竖直方向上的分库分表. 还是水平方向上的一个分库分表. 都需要定位数据应该去哪里,我能想到的就是一个hash的方式

至于分库分表的一个配置也是留着回老家处理. ( 对于分库分表,小杰仅浅显理解, 感觉理解还不够深入, 浮于表层. 明显表述不清, 以后如果有机会真正实践几次分库分表的部署,希望能又更升入的清晰理解. )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库主从复制,读写分离,分库分表理解 (数据库架构演变) 的相关文章

  • java中如何围绕另一个移动对象旋转一个对象?

    我对 Java 很陌生 想要编写一个简单的太阳系统 其中月球绕地球旋转 地球绕太阳旋转 一切正常 除了月亮不想正确移动 由于地球偏离月球的初始位置 月球的自转半径会根据该距离而增大 同样 当地球接近月球惯性位置时 自转半径会减小 如果初始位
  • JSP重定向和传值

    我有一个 JSP 其中我重定向到另一个 jsp 例如 我在该jsp中没有任何其他数据 我想将值从该jsp index jsp 传递到重定向jsp login jsp 我将如何做到这一点 这里的 logonInput 是在struts con
  • lombok - 多个镜头中的 @Builder 模式

    I use Builder of 龙目岛项目 https github com rzwitserloot lombok 所以考虑我有这个例子 Builder public class Client private Getter Setter
  • x.person 上的 @OneToOne 或 @ManyToOne 引用未知实体:y.Person - 继承问题

    我的 Hibernate 架构有问题 我有一个 MappedSuperClass 人员 一名员工和一名客户 gt Person class MappedSuperclass Audited public class Person exten
  • HQL 中的日期比较(不带时间戳)

    我必须比较 hibernate hql 查询中的两个日期 我在 java bean 中使用 java util Date 并在 mysql 数据库中使用时间戳作为数据类型 select t from Task t where t modif
  • 带有 spring-kafka 的 Kafka 死信队列 (DLQ)

    最好的实施方式是什么死信队列 DLQ Spring Boot 2 0 应用程序中的概念 使用 spring kafka 2 1 x 来处理无法处理的所有消息 KafkaListener某些bean发送到某些预定义的Kafka DLQ主题的方
  • Java 创建 Thread 实例时会发生什么

    我有一个关于 Java 线程和操作系统线程的问题 我读了Java 线程与 Pthreads https stackoverflow com questions 5269535 java threads vs pthreads and Jav
  • Java HttpURLConnection:内容长度计算

    我目前正在为 bitbucket issues RESTful API 开发一个库 我取得了很大的进步 现在我要解决这个部分更新问题 http confluence atlassian com display BBDEV Issues Is
  • 如何用java对jpg进行像素化?

    我正在尝试使用 Java 6 对 JPEG 进行像素化 但运气不佳 它需要使用 Java 而不是像 Photoshop 这样的图像处理程序 并且它需要看起来像老派 像这样 有谁能够帮助我 使用java awt image javadoc h
  • 需要 php pdo 内爆数组并在 mysql 中插入多行

    基于this https stackoverflow com questions 4629022 how to insert an array into a single mysql prepared statement w php and
  • 两个 mysql_fetch_array 语句

    是否有任何原因导致我无法在一个 while 循环中包含两个处理两个不同 mysql 查询结果的 mysql fetch array 语句 原因是我有两个来自 mysql 数据库的查询结果 每个结果包含两列 如下所示 Query 1 Date
  • 从外部 clojar 导入/使用资源

    我想做的是将一个大文件 MIDI 声音字体 打包到一个独立的 Maven repo clojar 中 然后能够以编程方式将其拉下来并从单独的项目中使用它 事实证明 这个看似简单的任务比我想象的要复杂 理想的情况是 如果有一种方法可以直接访问
  • 如何对JConsole的密码文件的密码进行加密

    我正在使用 JConsole 访问我的应用程序 MBean 并使用 password properties 文件 但根据 Sun 的规范 该文件仅包含明文格式的密码 com sun management jmxremote password
  • Java反序列化中避免重复对象

    我有两个列表 list1 和 list2 其中包含对某些对象的引用 其中某些列表条目可能指向同一对象 然后 由于各种原因 我将这些列表序列化为两个单独的文件 最后 当我反序列化列表时 我想确保我不会重新创建超出需要的对象 换句话说 List
  • 在Java中一个接一个地播放WAV文件

    我正在尝试玩几个WAV http en wikipedia org wiki WAV文件一个接一个 我尝试了这个方法 for String file audioFiles new AePlayWave file start 但这会同时播放它
  • GAE - Eclipse 中的开发服务器未更新?

    我在 Eclipse 上使用 Google AppEngine 开发服务器 我的本地网页似乎没有更新 直到我在开发服务器上进行了多次重新启动 使用 Eclipse 中的 运行 或 调试 按钮 我究竟做错了什么 基本流程是 更改 java 文
  • 对于每个抛出异常的语句,try/catch 是否被视为反模式?

    我目前正在审查同事的 Java 代码 我看到很多情况下 每个可能抛出异常的语句都被封装在自己的 try catch 中 其中 catch 块都执行相同的操作 哪个操作与我的问题无关 对我来说 这似乎是一种代码味道 我记得读到过它是一种常见的
  • SAXParseException:找不到元素“定义”的声明

    我对 camunda 和 DMN 完全陌生 我试图在 spring boot 中运行 DMN 示例 链接在这里 https github com camunda camunda bpm examples tree master dmn en
  • 跳过一行GridBagLayout

    我在 JFrame 上使用 GridBagLayout 我希望能够跳过一两行 但将这些行显示为空白 然后在这些行后面有一个按钮 我在文档中找不到任何方法来执行我所描述的操作 有谁知道我可以执行此操作的任何方法吗 发现它比添加空组件干净得多
  • 尝试访问从资产复制到数据\数据\的数据库中的DatabaseHelper时出现空指针异常

    我有一个数据库助手类 代码如下 这个助手的类任务是将数据库从应用程序附带的资产文件夹复制到我的应用程序的 data data 中 以便我可以使用它 一旦我将数据库放入 data data 我能够 我想添加它并执行 CRUD 操作 并且该数据

随机推荐

  • windows11 打开chrome浏览器闪屏黑屏问题

    windows11 家庭版打开chrome浏览器的时候 电脑闪屏 甚至长时间黑屏 不得不重启 修复方法 在Google Chrome中禁用 平滑滚动 1 打开chrome 然后输入在地址栏输入 chrome flags 2 搜索名为Smoo
  • 8招搞定XenServer虚拟机优化

    XenServer是一款虚拟机软件 他的免费版本功能相对强大 相比VMware的ESXi来说 所以现在很多企业简单应用上都会用这款软件 以减小开支 VMware收费实在是太贵了 一般的企业是承担不起的 一般虚拟化之后 一台宿主机上面都会运行
  • 也说MSDN

    看到iCynosure在介绍 MSDN使用经验 忍不住也进来加两句 平时很喜欢在IE里面用alt D来切换到地址栏 但是MSDN Explorer不支持这个快捷方式 经过一番研究发现可以通过Option里面的keyboard来自定义快捷键
  • react基础04--redux 管理数据

    react基础04 redux 管理数据 1 介绍 2 方法 案例 在多个组件中使用Store中的数据 规范 store 写法 修改Store中的数据 refs属性获取元素对象 redux thunk 中间件 3 注意事项 4 说明 1 介
  • 怎么在蓝桥杯多拿点分

    蓝桥杯常考的算法有 1 枚举 暴力 2 递归 3 贪心 4 搜索 dfs和bfs 等基础算法 难度比较大的是动态规划 严格按要求输出 不要画蛇添足地打印类似 请您输入 的多余内容 能用到的函数 比如sort next permutation
  • Matplotlib可视化(2)设置pyplot的rcParams

    pylot使用rc配置文件来自定义图形的各种默认属性 称之为rc配置或rc参数 通过rc参数可以修改默认的属性 包括窗体大小 每英寸的点数 线条宽度 颜色 样式 坐标轴 坐标和网络属性 文本 字体等 rc参数存储在字典变量中 通过字典的方式
  • 2.线程常见方法

    Java多线程文章目录 目录 设置优先级 join方法 sleep方法 sleep 实现秒表功能 常见面试题 setDaemon方法 设置优先级 同优先级别的线程 采取的策略就是先到先服务 使用时间片策略 如果优先级别高 被CPU调度的概率
  • Clion-安装

    Clion安装 1 注册Jetbraions账号 https www jetbrains com 2 学生认证使用 baipiao 一年 https www jetbrains com shop eform students 3 下载Min
  • Postman提取返回值

    json响应结果 Postman是做接口测试的 但是很多接口并不是直接就能测试的 需要一些预处理 比如登录的时候 需要传递一个token 如果是网页测试 一般打开登录页面的时候就会自动生成一个token 如果返回的是json格式 用Post
  • 4 SpringBoot整合RocketMQ实现消息发送和接收

    我们使用主流的SpringBoot框架整合RocketMQ来讲解 使用方便快捷 最终项目结构如下 具体步骤如下 第一步 我们新建一个父项目rocketmq test pom类型 主要是依赖管理 包括版本的管理 以及管理module子项目 p
  • pygame库基础模块汇总

    目录 1 安装 2 使用 3 display显示模块 4 draw模块 5 event模块 event可以判断的事件 键盘事件key 6 font模块 7 time模块 8 基本框架 Pygame 是一个专门用来开发游戏的 Python 模
  • Qt+OpenGL——屏幕坐标转OpenGL归一化后的坐标

    OpenGL在显示图形时是将坐标转化为以屏幕中心为原点的一个坐标系 屏幕显示区域的x y轴的取值区间都是 1 1 如图 Qt界面的坐标系是以左上角为原点的坐标系 将鼠标点击的点转化为OpenGL坐标的算法较为简单 不再赘述直接以代码的形式进
  • 100个经典C语言程序(益智类)

    100个经典C语言程序 益智类 1 绘制余弦曲线 在屏幕上用 显示0 360度的余弦函数cos x 曲线 问题分析与算法设计 利用cos x 的左右对称性 将屏幕的行方向定义为x 列方向定义为y 则0 180度的图形与180 360度的图形
  • C语言中的指针的新认识(一)

    从开始学习C语言到现在遇到最难的问题始终是指针的问题 所以希望每次都有新的体会 然后再记录下来 能看到自己的成长 最近知道的一个新的体会 指针指向的是一个地址 所以指针所要给的值也是一个地址 所以有了这样一个值 int a 0 int p
  • 反向代理神器 Nginx Proxy Manager 快速部署(Docker-compose)

    快速部署 本文将使用 NginxProxyManager 中文版 介绍NginxProxyManager基于Docker compose的快速部分方法 GitHub xiaoxinpro nginx proxy manager zh Doc
  • Vue <router-link>标签绑定@click点击事件失败

    失败原因 router link标签本身会阻止click事件 使用常规的 click绑定点击事件自然会失败 解决方案 click之后添加native修饰符
  • 弹性伸缩:云计算中的自动资源调度

    弹性伸缩是什么 它又在云计算中是如何工作的 随着云计算技术的不断发展 弹性伸缩作为其核心特性之一 越来越受到人们的关注 那么 弹性伸缩到底是什么呢 它又是如何工作的呢 首先 让我们来了解一下弹性伸缩的定义 在云计算中 弹性伸缩是指一种可根据
  • python中XPath与bs4的简单使用

    XPath是XML路径语言 它是一种用来确定XML文档中某部分位置的语言 在python爬虫方面的学习中 xpath至关重要 它与正则相比具有明显的优势 下面将介绍在python中xpath的简单使用 安装方法不必多说 与其他第三方库的安装
  • 如何利用小程序打造私域流量池,实现粉丝经济增长

    随着电商行业的发展 私域流量运营已成为新趋势 小程序已成为私域流量运营的重要组成部分 本文将探讨如何利用小程序打造私域流量池 实现粉丝经济增长 一 私域流量池的定义 私域流量池指企业拥有的用户数据 社群和平台 通过私域流量池 企业可以更好地
  • 数据库主从复制,读写分离,分库分表理解 (数据库架构演变)

    主从复制 主从复制 主要是针对MySQL数据库的高可用性 容灾性上面 是叫做高可用性 高可用性可以简单的理解为容灾性 稳定性 针对故障 风险情况下的处理 备案 策略 指系统无中断地执行其功能的能力 代表系统的可用性程度 高可用性通常通过提高