ShardingSphere实战(1)- 分库分表基础知识

news2024/9/9 1:07:26

一、为什么要分库分表

分库分表是一种数据库优化策略,主要用于解决大型应用或高并发场景下数据库性能瓶颈的问题。具体来说,分库分表可以带来以下好处:

  1. 提高性能:
  • 减少单个数据库实例的负载,避免单点性能瓶颈。
  • 当数据量增长到一定程度时,单一数据库的读写性能会受限于其硬件资源(如CPU、内存、磁盘I/O)。
  • 分散数据到多个数据库或表中可以降低每个实例的负载,从而提高查询和事务处理速度。
  1. 增强可扩展性:
  • 允许通过添加更多的数据库服务器来线性扩展存储和处理能力。
  • 支持分布式部署,利用集群的优势,提高整体系统的吞吐量和响应速度。
  1. 优化资源利用:
  • 单个数据库服务器的资源(如连接数)是有限的,分库分表可以更高效地利用这些资源。
  • 避免大量数据导致的索引深度增加,减少磁盘I/O次数,提高查询效率。
  1. 提高可用性和可靠性:
  • 分布式架构可以更好地实现故障隔离,如果某个数据库出现故障,其他数据库仍然可以正常工作。
  • 提供数据冗余,增强数据安全性和灾难恢复能力。
  1. 简化管理与维护:
  • 在某些情况下,分库分表可以使数据库管理更加简单,比如按业务模块划分数据库,便于管理和权限控制。
  1. 支持大数据分析:
  • 大数据场景下,分库分表可以支持并行处理,加速数据分析和报表生成。

然而,分库分表也带来了新的挑战,例如:

  • 复杂性增加:应用程序需要处理跨库和跨表的事务,这增加了开发和维护的难度。
  • 数据一致性:确保跨库跨表数据的一致性变得更加困难,可能需要引入分布式事务或消息队列机制。
  • 查询优化:复杂的查询可能需要在多个数据库之间进行,这要求更高的查询优化技巧和工具支持。

二、如何分库分表

分库分表的核心理念就是对数据进行切分(Sharding),以及切分后如何对数据的快速定位与查询结果整合。而分库与分表都可以从:垂直(纵向)和 水平(横向)两种纬度进行切分。
在这里插入图片描述

垂直切分

1、垂直分库

垂直分库核心理念:专库专用
在这里插入图片描述

2、垂直分表

垂直分表是基于数据表的列(字段)为依据切分的,是一种大表拆小表的模式。
例如:一张 order订单表,将订单金额、订单编号等访问频繁的字段,单独拆成一张表,把 blob 类型这样的大字段或访问不频繁的字段,拆分出来创建一个单独的扩展表 work_extend ,这样每张表只存储原表的一部分字段,再将拆分出来的表分散到不同的库中。
在这里插入图片描述

水平切分

1、水平分库

水平分库是把同一个表按一定规则拆分到不同的数据库中,每个库可以位于不同的服务器上,以此实现水平扩展,是一种常见的提升数据库性能的方式。

这种方案往往能解决单库存储量及性能瓶颈问题,但由于同一个表被分配在不同的数据库中,数据的访问需要额外的路由工作,因此系统的复杂度也被提升了。

例如下图,订单DB_1、订单DB_2订单DB_3 三个数据库内有完全相同的表 order,我们在访问某一笔订单时可以通过对订单的订单编号取模的方式 订单编号 mod 3 (数据库实例数) ,指定该订单应该在哪个数据库中操作。
在这里插入图片描述

2、水平分表

水平分表是在同一个数据库内,把一张大数据量的表按一定规则,切分成多个结构完全相同表,而每个表只存原表的一部分数据。

例如:一张 order 订单表有 900万数据,经过水平拆分出来三个表,order_1order_2order_3,每张表存有数据 300万,以此类推。
在这里插入图片描述
水平分表尽管拆分了表,但子表都还是在同一个数据库实例中,只是解决了单一表数据量过大的问题,并没有将拆分后的表分散到不同的机器上,还在竞争同一个物理机的CPU、内存、网络IO等。要想进一步提升性能,就需要将拆分后的表分散到不同的数据库中,达到分布式的效果,这就是我们常说的 分库分表
在这里插入图片描述

三、分库分表路由算法

常见的有 取模算法范围限定算法

1、取模算法

按字段取模(对hash结果取余数 (hash() mod N),N为数据库实例数或子表数量)是最为常见的一种切分方式。

还拿 order 订单表举例,先对数据库从 0 到 N-1进行编号,对 order 订单表中 work_no 订单编号字段进行取模,得到余数 i,i=0存第一个库,i=1存第二个库,i=2存第三个库…以此类推。

这样同一笔订单的数据都会存在同一个库、表里,查询时用相同的规则,用 work_no 订单编号作为查询条件,就能快速的定位到数据。

优点:
数据分片相对比较均匀,不易出现请求都打到一个库上的情况。

缺点:
这种算法存在一些问题,当某一台机器宕机,本应该落在该数据库的请求就无法得到正确的处理,这时宕掉的实例会被踢出集群,此时算法变成hash(userId) mod N-1,用户信息可能就不再在同一个库中了。

2、范围限定算法

按照 时间区间ID区间 来切分,比如:我们切分的是用户表,可以定义每个库的 User 表里只存10000条数据,第一个库只存 userId 从1 ~ 9999的数据,第二个库存 userId 为10000 ~ 20000,第三个库存 userId为 20001~ 30000…以此类推,按时间范围也是同理。

优点:

  • 单表数据量是可控的
  • 水平扩展简单只需增加节点即可,无需对其他分片的数据进行迁移
  • 能快速定位要查询的数据在哪个库

缺点:

  • 由于连续分片可能存在数据热点,比如按时间字段分片,可能某一段时间内订单骤增,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询。

四、分库分表的难点

1、分布式事务
由于表分布在不同库中,不可避免会带来跨库事务问题。一般可使用 "三阶段提交""两阶段提交" 处理,但是这种方式性能较差,代码开发量也比较大。通常做法是做到最终一致性的方案,如果不苛求系统的实时一致性,只要在允许的时间段内达到最终一致性即可,采用事务补偿的方式。

2、分页、排序、跨库联合查询
分页、排序、联合查询是开发中使用频率非常高的功能,但在分库分表后,这些看似普通的操作却是让人非常头疼的问题。将分散在不同库中表的数据查询出来,再将所有结果进行汇总整理后提供给用户。

3、分布式主键
分库分表后数据库的自增主键意义就不大了,因为我们不能依靠单个数据库实例上的自增主键来实现不同数据库之间的全局唯一主键,此时一个能够生成全局唯一ID的系统是非常必要的,那么这个全局唯一ID就叫 分布式ID

4、读写分离
不难发现大部分主流的关系型数据库都提供了主从架构的高可用方案,而我们需要实现 读写分离 + 分库分表,读库与写库都要做分库分表处理。

5、数据脱敏
数据脱敏,是指对某些敏感信息通过脱敏规则进行数据转换,从而实现敏感隐私数据的可靠保护,如身份证号、手机号、卡号、账号密码等个人信息,一般这些都需要进行做脱敏处理。


后续博客将介绍分库分表的具体实现,以及分库分表以后遇到的坑。

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

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

相关文章

【Linux从青铜到王者】tcp协议2

滑动窗口 滑动窗口是什么 上篇提到如果两端发送数据如果是一发一收那就是串行,效率很低,所以可以一次发送多个报文,一次也可以接受多个报文,可以大大的提高性能(其实是将多个段的等待时间重叠在一起了) 那么是怎么发…

Golang | Leetcode Golang题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; func lengthOfLIS(nums []int) int {if len(nums)<1{return len(nums)}dp : make([]int,len(nums))for i:0;i<len(nums);i{dp[i]1}res : 1for i:1;i<len(nums);i{for j:0;j<i;j{if nums[i] > nums[j]{dp[i] max(dp[i],dp[j…

Java 沙漏图案(Hour-glass Pattern)

给定正整数 n&#xff0c;以沙漏形式打印数字模式。示例&#xff1a; 输入&#xff1a;rows_no 7 输出&#xff1a; 1 2 3 4 5 6 7 2 3 4 5 6 7 3 4 5 6 7 4 5 6 7 5 6 7 6 7 7 6 7 5 6 7 4 5 6 7 3 4 5 6 7 2 3 4 5 6 7 1 2 3 4 5 6…

物联网平台简介与选型

前言 什么是物联网&#xff1f; 简单解释&#xff1a;把你感兴趣的事物连接到网络。 阿里云定义&#xff1a;物联网&#xff08;Internet of Things&#xff0c;简称 IoT&#xff09;是指通过互联网连接和通信的物理设备和对象的网络。它是一个由传感器、软件和通信设备组成的…

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA

解纠缠也对应于属性编辑&#xff0c;比如人脸的属性编辑&#xff0c;将人脸变微笑、变衰老&#xff0c;其中每一个属性变化也对应了一种有意义的latent direction 。想要应用这种direction可以分为两种方式&#xff1a;有监督的linear-probe&#xff08;线性探针&#xff09;和…

Logback 日志打印导致程序崩溃的实战分析

在软件开发和运维中&#xff0c;日志记录是必不可少的一环&#xff0c;帮我们追踪程序的行为&#xff0c;定位问题所在。然而&#xff0c;有时日志本身却可能成为问题的根源。本文将通过一个真实的案例来探讨 Logback 日志系统中的一个常见问题&#xff0c;当并发量大&#xff…

Vue.js常见指令

一、v-text与v-html v-text更新html元素的innerText v-html更新html元素的innerHtml 如果需要更新部分内容需要使用{{ }} 双括号差值表达式 案例&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>VUE指令 …

python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法

问题 升级新版pip 之后,不论是本地,还是使用anaconda环境,都有可能在用pip下载的时候出现错误: ModuleNotFoundError: No module named pip._internal&#xff0c;我的电脑中存在好几个版本的Python。 解决办法&#xff1a; python -m ensurepip python -m pip install --upgr…

图片及色彩编码

1、日期类 ###年份 date_format(KaTeX parse error: Expected EOF, got # at position 14: 批售月份, %Y年) #̲##季度 (CASE WHEN…批售月份, ‘%m’) IN (1,2,3) THEN ‘1季度’ WHEN date_format( 批售月份 , ′ W H E N d a t e f o r m a t ( 批售月份, %m) IN (4,5,6) TH…

【鸿蒙踩坑记录】解决:tabs滑动时,第一个和最后一个页签回弹大问题

一、背景 tabs滑动切换时&#xff0c;第一个页签右滑回弹大&#xff0c;最后一个页签左滑回弹大&#xff0c;如何关闭回弹效果 二、问题展现 图1:第一个页签右滑时回弹较大 图2:最后一个页签左滑时回弹较大 预期&#xff1a;关闭回弹效果 三、实现思路 给第一个和最后一个…

项目负责人的高效会议策略:从准备到追踪

项目负责人的高效会议策略&#xff1a;从准备到追踪 前言一、会议低效的常见陷阱二、高效会议的准备策略三、会议实施的技巧四、会议追踪的重要性结语 前言 在项目管理的世界里&#xff0c;时间就是金钱&#xff0c;效率就是生命。作为项目负责人&#xff0c;我深刻体会到了会议…

Java网络编程----UDP实现单播,组播,广播

文章开头&#xff0c;先来回忆一下 什么是UDP&#xff1f; UDP 的全称是 User Datagram Protocol&#xff0c;用户数据报协议。它不需要所谓的握手操作&#xff0c;从而加快了通信速度&#xff0c;允许网络上的其他主机在接收方同意通信之前进行数据传输。 UDP 的特点主要有…

Python 教程(七):match...case 模式匹配

目录 专栏列表前言基本语法match 语句case 语句 模式匹配的类型示例具体值匹配类型匹配序列匹配星号表达式命名变量复杂匹配 模式匹配的优势总结 专栏列表 Python教程&#xff08;一&#xff09;&#xff1a;环境搭建及PyCharm安装Python 教程&#xff08;二&#xff09;&…

智能环保气膜网球馆:大空间与防雾霾的完美结合—轻空间

在现代都市生活中&#xff0c;空气质量和空间限制成为许多体育设施的挑战。气膜技术的出现&#xff0c;为这些问题提供了卓越的解决方案。我们的智能环保气膜网球馆&#xff0c;不仅拥有宽敞的空间&#xff0c;还具备卓越的防雾霾功能&#xff0c;为体育爱好者提供了一个理想的…

牧野电火花机床联网

一、找到可选项 选择主面板中的【可选项】按钮&#xff0c;弹出来的对话框如下图所示。 二、属性设定 在左下角部分找到【属性设定】&#xff0c;如序号一所示&#xff0c;在弹出的属性设定对话框中选中【牧野EDM服务器】&#xff0c;如下图所示。 三、选则MES模式 按照上图…

苹果推送iOS 18.1带来Apple Intelligence预览

&#x1f989; AI新闻 &#x1f680; 苹果推送iOS 18.1带来Apple Intelligence预览 摘要&#xff1a;苹果向iPhone和iPad用户推送iOS 18.1和iPadOS 18.1开发者预览版Beta更新&#xff0c;带来“Apple Intelligence”预览。目前仅支持M1芯片或更高版本的设备。Apple Intellige…

Electron学习笔记(一)基础环境

目录 前言 基础环境准备 安装 Node.js 配置项目文件 通过代理服务安装 通过国内仓库安装 一些常见问题&#xff1a; 前言 一个新手学习Electron的笔记&#xff0c;记录为主&#xff0c;仅供参考。 其他文章见专栏目录。 基础环境准备 开发之前先将基础环境搭建好。 …

灯具外贸公司用什么企业邮箱好

灯具外贸公司面对海外市场的推广、产品销售、客户沟通、市场信息收集等多重需求&#xff0c;选择一个合适的企业邮箱显得尤为重要。本文将介绍灯具外贸公司为什么应选择Zoho Mail企业邮箱&#xff0c;并详细探讨其优势和功能。 一、公司背景 广东省深圳市光明新区&#xff0c…

创建 Llama-3.1-70B-Japanese-Instruct-2407 的 Ollama 模型

创建 Llama-3.1-70B-Japanese-Instruct-2407 的 Ollama 模型 1. 下载 gguf 文件2. 创建 Modelfile3. 创建 Ollama 模型4. 运行 Ollama 模型5. &#xff08;可选&#xff09;其他 Modelfile 1. 下载 gguf 文件 使用浏览器打开 https://huggingface.co/mmnga/Llama-3.1-70B-Japa…