MySQL的分片(一)——分布式数据库概述

2023-11-07

系统分析:OLAP or OLTP?

在互联网时代,海量数据的存储与访问成为系统设计与使用的瓶颈问题,对于海量数据处理,按照使用场景,主要分为两种类型:联机事务处理(OLTP)和联机分析处理(OLAP)。

  联机事务处理(OLTP)也称为面向交易的处理系统,其基本特征是原始数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果。

  联机分析处理(OLAP)是指通过多维的方式对数据进行分析、查询和报表,可以同数据挖掘工具、统计分析工具配合使用,增强决策分析功能。 

OLTP和OLAP的比较。OLTP面向实时交易类,实时要求性高,查询分析功能偏弱。OLAP面向统计分析类,实时性要求一般,涉及到大范围扫描,JOIN,聚合查询等,要求有比较高的查询分析能力。

MySQL适合OLTP类型的系统,因为MySQL的分析支持比较弱,适合高并发的小的查询操作。在进行数据库技术选型及选择解决方案之前,必须对系统是OLTP还是OLAP做出准确的判断。

 

技术选型:关系型数据库 or NoSQL数据库 ?

针对上面两类系统有多种技术实现方案,存储部分的数据库主要分为两大类:关系型数据库与NoSQL数据库。

关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据。主流的Oracle、DB2、MS SQL Server和MysSQL都属于这类传统数据库。

NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键值存储 (memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库(MongoDB、 CouchDB)、面向列的数据库(Cassandra、HBase),每种NoSQL都有其特有的使用场景及优点。

Oracle,MySQL等传统的关系数据库非常成熟并且已大规模商用,为什么还要用NoSQL数据库呢?主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足日益增长的海量数据存储 及其性能要求,所以才会出现了各种不同的NoSQL 产品,NoSQL 根本性的优势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高。

下面分析下两者的特点,及优缺点:

虽然在云计算时代,传统数据库存在着先天性的弊端,但是 NoSQL 数据库又无法将其替代,NoSQL 只能作为传统数据的补充而不能将其替代,所以规避传统数据库的缺点是目前大数据时代必须要解决的问题。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷,但是由于目前开源或者商用的传统数据库基本不支持大规模自动扩展,所以就需要借助第三方来做处理,那就是下面要讲的数据切分,下面就来分析一下如何进行数据切分。

数据切分:解决单库瓶颈

在同一个数据库中的数据分散存放到多个数据库(主 机)上面,以达到分散单台设备负载的效果。数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。

 垂直切分

按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分。

一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:

系统被切分成了用户、订单交易、支付几个模块。

一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。

但是往往系统之有些表难以做到完全的独立,存在这扩库 join的情况,对于这类的表,就需要去做平衡,是数据库让步业务,共用一个数据源,还是分成多个库,业务之间通过接口来做调用。在系统初期,数据量比较少,或者资源有限的情况下,会选择共用数据源,但是当数据发展到了一定的规模,负载很大的情况,就需要必须去做分割。

一般来讲业务存在着复杂 join 的场景是难以切分的,往往业务独立的易于切分。如何切分,切分到何种程度是考验技术架构的一个难题。

下面来分析垂直切分的优缺点:

    优点:

  • 拆分后业务清晰,拆分规则明确;
  • 系统之间整合或扩展容易;
  • 数据维护简单。

    缺点:

  • 部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度;
  • 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高;
  • 事务处理复杂。

水平切分

另外一种则是根据 表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图:

拆分数据就需要定义分片规则。关系型数据库是行列的二维模型,拆分的第一原则是找到拆分维度。比如: 从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就需要按照会员结合日期来拆分,不同的数据按照会员ID做分组,这样所有的数据查询 join 都会在单库内解决;如果从商户的角度来讲,要查询某个商家某天所有的订单数,就需要按照商户 ID 做拆分;但是如果系统既想按会员拆分,又想按商家数据,则会有一定的困难。如何找到合适的分片规则需要综合考虑衡量。

  几种典型的分片规则包括:

  • 按照用户ID求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中;

  • 按照日期,将不同月甚至日的数据分散到不同的库中;

  • 按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中。 如图,切分原则都是根据业务找到适合的切分规则分散到不同的库,下面用用户ID求模举例:

   优点:

  • 拆分规则抽象好,join 操作基本可以数据库做;
  • 不存在单库大数据,高并发的性能瓶颈;
  • 应用端改造较少;
  • 提高了系统的稳定性跟负载能力。

    缺点:

  • 拆分规则难以抽象;
  • 分片事务一致性难以解决;
  • 数据多次扩展难度及维护量大;
  • 跨库join性能较差;

    前面讲了垂直切分跟水平切分的不同跟优缺点,会发现每种切分方式都有缺点,但共同的特点缺点有:

  •  引入分布式事务的问题;
  • 跨节点 Join 的问题;
  • 跨节点合并排序分页问题;
  • 多数据源管理问题。

    针对这些问题的讨论和解决方案会在下一篇说到。

    数据切分解决传统数据库的缺陷,又有了 NoSQL 易于扩展的优点。

MySQL:做分布式数据库的优势

关于Oracle和MySQL的对比。

关于这两数据库的全方位的多维度的优劣对比,比较有经验的数据库开发人员应该能列举出很多来,我身为一名普通的应用开发人员,写不出什么硬核的分析对比,只能大概表达一些我的理解。

Oracle简单概括:功能,性能,稳定,人才;MySQL简单概括:灵活,简单,便宜,开源。

Oracle的发展历史是MySQL的两倍以上,现在已经是很成熟的商业数据库系统。Oracle为用户提供了非常丰富强大的功能,可编程和分析函数的支持都做到非常完善,还有无限的行级锁,最高级别的隔离级别,完全的事务支持,成熟的热备工具,稳定可靠但复杂的高可用配置,还有大批有经验的DBA人才,总之,如果你想要一个稳定可靠并且性能强大的数据库单集群,那Oracle是完美的。But,如果使用分布式解决方案,昂贵的Oracle也会给你带来惊人的license费用,Oracle的功能看上去丰富而全面,但是那都是要钱的,有时候我们并不需要其中的很多东西,Oracle缺少可定制化的灵活性。

MySQL有开源和灵活的优势,轻便的MySQL虽然功能性没有Oracle强大,但是作为数据库,最重要和核心的功能都做的很好。MySQL非常灵活,针对每个表都能指定不同的存储引擎,InnoDB引擎支持依赖于索引的行级锁;同时MySQL提供了简单高速的主从复制配置,能提供快速冗余的专业集群服务器;MySQL的开源特性,让互联网团队可以自研支持MySQL协议的代理中间件来支持实现MySQL的分布式集群,同时可以灵活定制修改MySQL细节功能,目前基于MySQL的分布式数据库基本都是采用这一方式。

下一篇将分享一些MySQL分片的问题讨论。

本文参考:

《MyCat权威指南》http://www.mycat.io/document/mycat-definitive-guide.pdf

 

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

MySQL的分片(一)——分布式数据库概述 的相关文章

  • 在 MySQL 中创建布尔列并将 false 作为默认值?

    我想在 MySQL 中创建一个表boolean默认值为的列false 但它默认接受 NULL 你必须指定0 意思是假 或1 意思是 true 作为默认值 这是一个例子 create table mytable mybool boolean
  • 如何使用 PATCH 更新简单的数据库字段?

    我是 php 和 API 的新手 我正在尝试学习这些方法 但我无法执行 PATCH 或 PUT 来更新我的简单 mysql 数据库 我使用了以下代码 if isset PATCH con mysqli connect localhost r
  • MYSql 前 10 名及其他总计

    我的查询运行良好 但我只需要前 10 个供应商 然后我需要将所有剩余的总计放在 所有其他 行中 如果没有单独的查询 我该如何做到这一点LIMIT 10 18446744073709551615 SELECT VENDOR fullname
  • MySql 从另一个表中减去一个表

    我有两个表 A 包含所有数据 表 B 从 A 中随机选择 25 的数据创建 所以 A 和 B 具有完全相同的列 也没有独特的列 我想做的是从 A 中减去 B 有什么想法吗 查看所有行A除了那些在B SELECT FROM A WHERE f
  • 将此 MySQL 查询转换为 PyGreSQL

    我正在开发一个 Ruby 应用程序 它使用 mysql 函数 XOR 和 BIT COUNT 不过 我现在需要在运行 PyGreSQL 的 Heroku 上运行该应用程序 我找不到任何可以帮助我的 PyGreSQL 文档 那么任何人都可以翻
  • MySQL 选择第一个字符在哪里

    如何选择单元格的第一个字符并使用它来定义返回的内容 看看MySQL 字符串 和 控制流 功能 http dev mysql com doc refman 5 1 en functions html 例如 SELECT IF LEFT myF
  • MySQL 和 MariaDB 数据库有什么区别?

    我已经使用 XAMPP 很长时间了 很惊讶 XAMPP 已经从 MySQL 切换到了 MariaDB https www apachefriends org index html https www apachefriends org in
  • 使用 PHP 显示 Mysql 中的图像

    这就是我的数据库中的表的样子 我正在尝试显示我存储的图像 它是 mimetype longblob 当我运行代码时 它会给我一个带有 的小框 没有错误 只是那个框 有谁知道错误是什么以及如何修复它 Display Index Display
  • 重新启动我的 sql 时,jenkins 失败“sudo:不存在 tty,并且未指定 Askpass 程序 抱歉,请重试。”

    我刚刚配置了 jenkins 在预构建步骤中我尝试重新启动 jenkins 但最终出现以下错误 Commencing build of Revision c5b9f8daac092efc5396d80f568a2cf89ae8b697 or
  • MySQL:为什么 IN 子句中的第 5 个 ID 会极大地改变查询计划?

    给出以下两个查询 Query 1 SELECT log id FROM log WHERE user id IN 188858 188886 189854 203623 204072 and type in 14 15 17 ORDER B
  • Python MySQL 模块

    我正在开发一个需要与 MySQL 数据库交互的 Web 应用程序 但我似乎找不到任何真正适合 Python 的模块 我特别寻找快速模块 能够处理数十万个连接 和查询 所有这些都在短时间内完成 而不会对速度产生重大影响 我想我的答案将是游戏领
  • 有什么方法可以在MySQL中的表名位置使用变量吗?

    我想在表名称位置使用变量 例如 SELECT FROM targetTableName 然而它会出错 有什么方法可以在MySQL中的表名位置使用变量吗 您显示的查询不起作用有两个原因 插入到查询中的用户定义变量将被视为使用字符串文字 而不是
  • MySQL 错误“连接过多”

    我正在将 MySQL 5 0 用于由 GoDaddy linux 托管的网站 我正在对我的网络应用程序进行一些测试 突然我注意到页面刷新速度非常慢 最后 经过漫长的等待 我到达了一个页面 上面写着 MySQL 错误 连接太多 它指向我连接到
  • MySQL如何在没有过程/函数的情况下执行命令块

    我尝试在 MySQL Workbench 上运行一段 SQL 命令 就像在 SQL Server 上一样 但它告诉我 声明在此位置无效 我在网上看到了各种这样的例子 我真的不明白为什么会出现这个错误 一些提示 代码 其中 SQL Serve
  • Laravel 4 - JOIN - 相同的列名

    我目前使用此代码从数据库中检索所需的数据 query DB table packages gt join assigned packages function join use id join gt on packages id assig
  • MySQL 存储过程、Pandas 和“执行多个语句时使用 multi=True”

    注意 正如下面 MaxU 所建议的 该问题特定于 mysql connector 如果您使用 pymysql 则不会出现该问题 希望这可以帮其他人省去一些麻烦 使用Python Pandas 和mySQL 根本无法让存储过程返回结果 更不用
  • Navicat 中的 MySQL 视图 - 如何定义“主键”?

    当我在 Navicat 中定义视图时 经常会收到以下消息 xxx 没有主键 对此表的更新将使用以下伪语句完成 UPDATE xxx SET ModifiedFieldsAndValues WHERE AllFieldsAndOldValue
  • sql连接一个表中的两个字段

    我有一个预订表 其中有两个人 我想将 person 1 作为一行返回 将 person 2 作为新行返回 但该人的 id 与人员表相关 这是我所得到的 但没有提取预订信息 SELECT people FROM select booking
  • 在评论中查找不同风格的日期

    我还有一个问题要问preg match 我有一个表 其中评论的日期写在评论本身内 手动 现在我需要提取该日期并将其放置在不同的列中 我发现评论和日期的样式如下 id warning sent warning date 6109 2011 0
  • 选择列表包含非聚合列

    自从更新 MySQL 以来 我注意到以下查询失败 SELECT u p name as plan COUNT u id as totalprojects FROM users u LEFT JOIN plans p ON p id acce

随机推荐

  • Python实现PSO粒子群优化算法优化LightGBM回归模型(LGBMRegressor算法)项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 视频讲解 如需数据 代码 文档 视频讲解可以直接到文章最后获取 1 项目背景 PSO是粒子群优化算法 Particle Swarm Optimization 的英文缩写 是一种基于种群的
  • UNDERSTANDING THE ATTENTION ECONOMY

    Platforms profit by maximizing the amount of time users spend looking at and clicking on advertisements Our Attention Is
  • 记事本vx小程序(待完善)

    基础功能 页面 image pages image 111 jpg 背景 textAreaDes 输入的内容 revise 是不是修改 id btnDown 保存按钮 if this data textAreaDes length 0 re
  • Jmeter怎么实现接口关联?

    用于接口测试时 后一个接口经常需要用到前一次接口返回的结果 应该如何获取前一次请求的结果值 应用于后一个接口呢 拿一个登录的例子来说明如何获取 1 打开jmeter 新建一个测试计划 在测试计划里新建一个线程组 新建一个登录的http请求
  • 数据结构视频教程 -《数据结构C++ 复旦大学》

    整个视频打包下载地址 史上最全的数据结构视频教程系列分享之 数据结构C 复旦大学 转载请保留出处和链接 更多优秀资源请访问 我是码农 数据结构是计算机科学与技术专业 计算机信息管理与应用专业 电子商务等专业的基础课 是十分重要的核心课程 所
  • 如何在Android 应用程序中实现 Excel 自动化功能?只需Aspose就搞定

    在本文中 将学习如何在您的 Android 应用程序中实现 Excel 自动化功能 阅读本文后 将能够以编程方式在您的 Android 应用程序中从头开始创建 Excel XLSX 或 XLS 文件 此外 本文还将介绍如何更新现有 Exce
  • Git第七讲 Eclipse 安装Git插件以及使用

    1 1git插件下载卸载 git插件下载可以直接help Install new software 输入git http download eclipse org egit updates 下载列表的git插件 或者在eclipse mak
  • Rotary Position Embedding (RoPE, 旋转式位置编码)

    RoPE为苏剑林大佬之作 最早应用于他自研的RoFormer Rotary Transformer 属于相对位置编码 效果优于绝对位置编码和经典式相对位置编码 出自论文 RoFormer Enhanced Transformer with
  • Python中的len()函数

    函数 len 1 作用 返回字符串 列表 字典 元组等长度 2 语法 len str 3 参数 str 要计算的字符串 列表 字典 元组等 4 返回值 字符串 列表 字典 元组等元素的长度 5 实例 5 1 计算字符串的长度 gt gt g
  • python编程 报错解决:“AttributeError: ‘str‘ object has no attribute ‘decode‘”

    简介 在做django项目遇到了如题的报错 通过搜索分析是encode decode的问题 我的decode encode并没有出现在我编写的代码中 而是在D python Lib site packages django db backe
  • web项目打包到上线教程_web项目打包,发布以及部署

    如何将 web 工程打包 war 和解包 war 1 打包 war 进入 工程 应用的根目录 比如 webapps myjspweb 2 把整个 web 应用打包为 myjspwar war 文件 命令如下 jar cvfmyjspweb
  • jmeter常用线程组设置策略

    目录 一 前言 二 单场景基准测试 1 介绍 2 线程组设计 3 测试结果 三 单场景并发测试 1 介绍 2 线程组设计 3 测试结果 四 单场景容量 爬坡测试 1 介绍 2 线程组设计 3 测试结果 五 混合场景容量 并发测试 1 介绍
  • 踩坑了,BigDecimal 使用不当,造成 P0 事故!

    大家好 我是东哥 可能对于刚入门的新手不太理解P0的概念 下面简单解释一下 P0属于最高级别事故 比如崩溃 页面无法访问 主流程不通 主功能未实现 或者在影响面上影响很大 即使bug本身不严重 目录 背景 事故 分析 总结 工具分享 背景
  • 【Kubernetes系列】Kubernetes组件介绍

    概述 kubernetes中文文档 https kubernetes io zh docs home kubernetes中文社区 https www kubernetes org cn docs kubernetes的本质是一组服务器集群
  • PCL 网格投影曲面重建算法

    目录 一 算法原理 1 算法概述 二 代码实现 三 结果展示 一 算法原理 1 算法概述 类GridProjection实现了网格投影曲面重建算法 详细信息参考Polygonizingextremal surfaces with manif
  • Ubuntu16.04 64位系统下面安装JDK1.7

    1 去到官网下载jdk 点击打开链接 2 安装WinSCP工具连接到linux系统上面在 usr lib里面新建一个jvm文件夹 然后把下载的jdk 7u79 linux x64 tar gz上传到jvm里面 3 解压刚上传的jdk 7u7
  • 计算机视觉的定义,应用及整个系统

    定义 计算机视觉是使用计算机及相关设备对生物视觉的一种模拟 它的主要任务就是通过对采集的图片或视频进行处理以获得相应场景的三维信息 就像人类和许多其他类生物每天所做的那样 计算机视觉是一门关于如何运用照相机和计算机来获取我们所需的 被拍摄对
  • Linux查看当前目录下文件及文件夹的大小

    使用场景 查看服务器磁盘空间使用情况 快速定位当前目录下的大文件夹 快速找出大文件 推荐一个比较好用的命令 du h max depth 1 当前参数讲解 h 以可读性较好的方式显示尺寸 例如 1K 1M 1G max depth N 显示
  • objc学习笔记-基础

    1 xcode 4 3 3以后 NSAutoreleasePool 的用法发生改变 由 NSAutoreleasePool pool NSAutoreleasePool alloc init pool drain 变为 autoreleas
  • MySQL的分片(一)——分布式数据库概述

    系统分析 OLAP or OLTP 在互联网时代 海量数据的存储与访问成为系统设计与使用的瓶颈问题 对于海量数据处理 按照使用场景 主要分为两种类型 联机事务处理 OLTP 和联机分析处理 OLAP 联机事务处理 OLTP 也称为面向交易的