【性能设计篇】数据库拓展

news2024/9/20 16:36:58

前两篇文章介绍了分布式存储的机制,为保证数据的高性能以及可拓展,采用分片/分区机制。为保证数据的高可用性,采用复制/镜像机制存储数据。一份数据存储多份。而这两种方式在数据中,就是分片/分区机制。分库分表/读写分离。

读写分离 CQRS

读写分离是最简单数据库拓展的方式,主要应对的场景是读多写少,可以有效的把业务做相应的隔离。
在这里插入图片描述

读写分离的形势可能不同,一主多从(一主一从,一主两从/多从)以及可能数据备份的方式,主备等方式。图中就是一个写库,两个从库,写的时候都写主库,读的时候都写从库。
好处
1.实现起来比较容易,数据库的master-slave 配置和服务框架里的读写分离比较成熟,应用比较快
2.可以很好的把业务隔离开来,经历的公司都是所有数据表在同一个库中,当这个数据库出现问题 负载比较高时,可能会拖垮所有业务,所以需要进行数据的拆分。将一些大表,配置表进行隔离开来。
3.可以有效分担数据的读操作,大多数的业务都是读耗费性能。
坏处
1.写库存在单点故障,如果写库不可用,那么对于一些高可用的业务,比如订单 支付系统,影响比较大。
2.数据库主从同步存在一定的延时,不实时,需要强一致性的读写操作需要写到从库上。
以下是主从复制的流程图
在这里插入图片描述

读写分离的目的主要是提高数据库的读操作的能力
以上的方式是比较简陋的,

读写分离CQRS
CQRS(Command and Query Responsibility Segregation) 命令和查询职责分离
用户对于一个系统的动作一个是 增删改,另一个是查询,主要数据回显,或者数据分析。
命令 不会返回数据项,但是会影响数据结果,返回执行命令

  • 查询 不应影响数据,但是会返回数据
  • 指责明确,可以跟好的追逐系统中哪些行为或者操作修改了系统的状态变化。

分库分表 Sharding

在这里插入图片描述

影响数据库性能来说是两点,一个是对数据库的操作,另一个是数据库本身的容量
前者我们可以通过减少多表join,或者合理建立索引,如果大量查询可以用es查询,比如日志,如果要做数据报表要使用hoddop处理。
但是对于数据库本身的容量是有一定的限制,比如单表5KW的级别的时候,数据查询是非常慢的。本身服务可以进行拆分成分布式的,那么数据库页可以拆分成分布式的,具体形态就是分库分表。

说到分库分表,其实比较就离不开两个事情,一个是分库分表的策略,另一个是数据中间层。
分库分表的策略,一般老说会按照时间维度,每月 每天创建一张表,或则地理位置,或者用户%操作散列哈希。库的力度其实比较大,我们可以按照业务域进行划分,比如订单域,支付域,库存域等拆分,都需要结合具体的业务进行拆分。
数据库中间层,其实这个数据中看层的目的就是为了屏蔽底层的分库分表后,一个SQL是不需要关注分库分表后的操作的。具体功能就是需要解析SQL的能力,以及多表联查 事务操作上也是有一定的难度,XA的两阶段事务提交,这个东西复杂度比较高,一般都是基础架构组进行开发的。

设计重点

一般来说,如果只是数据库层面的分库分表,其实并没有做到彻底,要做的事情是服务和数据一起拆分,一个服务一个数据库,对外只提供接口层面的访问。先做服务化的拆分在进行分片操作,分片分为垂直分片和水平分片。
比如订单系统有专门的订单数据库,支付有专门的支付库,而不是一个数据库,所有的表都存储在一个数据库中,这样非常不利于管理,而且别的系统读取你系统的数据,出现问题,你可可能要背锅。服务和数据库要一起拆分
分库分表后,如何保证全局的唯一id,一般使用雪花算法。
比如在真实开发中,如果上下业务系统需要相关数据,最好是通过通信的API的方式将数据返回,而不应该直接读取数据库。比如订单直接读取支付数据库。另一个读写分离虽然可以提高读的性能,但是当出现大量数据更新导致主从延迟,就会出现从库获取不到最新的数据,影响上下游业务系统。所以平时在高峰期不要频繁更新大量数据,刷数据。

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

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

相关文章

掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别

Flutter动机是什么,解决啥痛点?优势在哪里? 介绍Flutter的历史背景和运行机制,并以界面渲染过程为例与你讲述其实现原理。 1 Flutter的历史背景 为不同的操作系统开发拥有相同功能的应用程序,开发人员只有两个选择&…

gitTortoise图形化工具下载步骤

一,简介 本文主要介绍如何下载安装gitTortoise图形化工具来管理和提交代码。 二,步骤介绍 2.1 安装包下载 下载地址:https://download.tortoisegit.org/tgit/ 打开后,界面如下: 点击选择最新的稳定release版本&am…

二分查找算法及实现

概念 二分查找算法也成为折半查找,是一种非常高效的工作于有序数组的查找算法. 实现 需求 现有一个有序数组 arr [1,2,3,4,5,6,7,8,9], 目标值target 2 ,要求返回目标值target在数组arr中的索引,没有则返回-1; 代码实现 private int binarySearch(int[] arr, int target)…

Android加快你的编译速度

工欲善其事,必先利其器。如果每次运行项目都要花费5-10分钟,那人的心态都要崩了。 Gradle构建流程 Gradle 的生命周期可以分为大的三个部分:初始化阶段(Initialization Phase),配置阶段(Configuration Pha…

Linux学习之网络管理和配置文件

在CentOS 7中有两种网络配置方法:SysV(也称为Sys 5)和Systemd。 SysV的命令如下: service network start|stop|restart|status chkconfig --list network Systemd的命令如下: systemctl list-unit-files NetworkManage…

Linux->线程同步

目录 前言: 1 线程同步引入 2 条件变量 2.1 线程饥饿 2.2 条件变量接口 2.3 添加条件变量 3 生产者和消费者模型 前言: 本篇主要讲解了关于线程同步的相关知识,还有生产者和消费者模型的认识和使用。 1 线程同步引入 在讲解线程同步之…

【Unity3D】基于深度和法线纹理的边缘检测方法

1 前言 边缘检测特效中使用屏后处理技术,通过卷积运算计算梯度,检测每个像素周围像素的亮度差异,以识别是否是边缘像素;选中物体描边特效中也使用了屏后处理技术,通过 CommandBuffer 获取目标物体渲染后的模板纹理&…

学习spring: 1.引子

问题 我们来看一段代码: package org.malred;import org.malred.entity.Car; import org.malred.entity.Tire;/*** Hello world!**/ public class App {public static void main(String[] args) {Car car new Car();Tire lt new Tire();car.setLeftTire(lt);Tire rt new T…

状态估计器

文章目录 [toc] 1.状态空间模型1.1.连续状态空间模型1.2.离散状态空间模型 2.矩阵微积分3.二次规划4.概率论4.1.期望与方差4.2.独立事件4.3.向量随机变量4.4.噪声与协方差矩阵4.5.条件概率 5.最小二乘估计5.1.加权最小二乘估计5.2.递推最小二乘估计5.3.状态向量和协方差随时间变…

深入理解WebSocket,让你入门音视频

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想…

Android 使用okhttp监控网络数据

这里使用Okhttp写了一个demo来监听网络请求过程中的一系列数据,包括当前网络类型、请求体、响应体大小,url,请求方式,当然还有本次核心获取域名解析时长,建立连接时长,保持连接时长,请求总时长这…

《C++ Primer》--学习6

IO库 IO类 为了支持使用宽字符的语言,标准库定义了一组类型和对象来操纵 wchar_t 类型的数据。宽字符版本的类型和函数的名字以一个 w 开始。wcin wcout 和 wcerr 是分别对应 cin cout 和 cerr 的宽字符版本对象 IO类型之间的关系 类型 ifstream 和 istringstream…

Vuex 状态管理 —— 核心store

在上一篇当中讲到关于接口请求函数获取数据,拿到 response.data ,简化调用,那么在拿到请求的响应数据之后呢?在前面讲到组件间的通信当中,如父子通信(父传子props,子传父$emit)以及组件与组件之前不能通过直接通信&…

【33】用 Docker 部署 Prometheus + Grafana 监控平台

一. Docker部署Prometheus 1.1 下载prom/prometheus镜像 docker pull prom/prometheus 1.2 启动prometheus容器 docker run -itd --nameprometheus -p 9090:9090 prom/prometheus 打开本地http://localhost:9090/ 说明启动成功 1.3 将容器的配置文件复制出来 docker cp pr…

深入理解深度学习——GPT(Generative Pre-Trained Transformer):在不同任务中使用GPT

分类目录:《自然语言处理从入门到应用》总目录 GPT预训练语言模型作为一个标准的语言模型,其输入和输出是固定的,即输入一个词序列,输出该词序列的下一个词。《深入理解深度学习——GPT(Generative Pre-Trained Transf…

GAMES101 笔记 Lecture06 Rasterization2(Antialiasing and Z-Buffering)

目录 Antialiasing(反走样)Sampling is Ubiquitous in Computer Graphics(采样在计算机图形学中无处不在)Sampling Artifacts(Errors or Mistakes or Inaccuracies) in Computer Graphics(在计算机图形学中采样的瑕疵)Jaggies(Staircase Pattern)锯齿Moire Pattern in Imaging(…

[进阶]TCP通信实现BS架构,网站开发的原理,线程池优化BS架构

代码演示如下: 服务端 public class Server {public static void main(String[] args) throws Exception{System.out.println("服务端开启!");//1.创建ServerSocket的对象,同时为服务端注册端口。ServerSocket serverSocket new…

Wang tile(王浩瓷砖)算法解决贴图平铺重复问题

Wang tile(王浩瓷砖) 大家好,我是阿赵。这次来解决一个贴图重复的问题。 一、问题 做一篇很大面积的草地,一般思路是建立一个地面的面片,然后在材质球里面给他做一个Tiling平铺,增大重复次数。这样整个地面都可以被草地的贴图铺满…

Spring Boot 如何使用 @Validated 注解进行数据校验

Spring Boot 如何使用 Validated 注解进行数据校验 在开发应用程序时,数据校验通常是不可避免的。Spring Boot 提供了许多选项来验证应用程序中的数据,其中一个选项是使用 Validated 注解。本文将介绍如何使用 Validated 注解进行数据校验,并…

操作系统-操作系统结构

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…