随着互联网时代,特别是移动互联网的到来,形形色色的企业都在将自己的系统平台快速升级迭代,以此作为向互联网转型的一部分。
在此背景下,这类应用平台所依赖的数据库系统就需要支持突然增加的巨量交易数据,但是在这种情况下单体的数据库往往会很快过载,而用于扩展数据库最常见的技术手段就是“数据分片”。
因此今天我将为你介绍什么是分片,以及如何将其用于扩展数据库。同时,我还会回顾常见分片架构的优缺点,以使用 TiDB 为例,和你探讨如何在分布式数据库中实现分片。
数据分片概论
分片是将大数据表分解为较小的表(称为分片)的过程,这些分片分布在多个数据库集群节点上。分片本质上可以被看作传统数据库中的分区表,是一种水平扩展手段。每个分片上包含原有总数据集的一个子集,从而可以将总负载分散在各个分区之上。
数据分片的方式一般有两种。
如下图所示,水平和垂直这两个概念来自原关系型数据库表模式的可视化直观视图。
图 1 可视化直观视图
该理论应用在数据库计算能力上往往被表述为:如果数据库处理能力遇到瓶颈,最简单的方式是持续提高系统性能,如更换更强劲的 CPU、更大内存等,这种模式被称为垂直扩展。当持续增加资源以提升数据库能力时,垂直扩展有其自身的限制,最终达到边际平衡,收益开始递减。
而此时,对表进行水平分片意味着可以引入更多的计算能力处理数据与交易。从而,将边际递减扭转为边际递增状态。同时,通过持续地平衡所有节点上的处理负载和数据量,分片模式还可以获得 1+1>2 的效果,即集群平均处理能力大于单节点处理能力。
这样就使得规模较小、价格便宜的 服务器 组成的水平扩展集群,可能比维护一台大型商用数据库服务器更具成本效益。这也是第一讲中“去 IOE 运动”的核心技术背景。
除了解决扩展难题,分片还可以缓解计划外停机,大大降低系统 RTO(目标恢复时间)。即使在计划内的停机期,如果没有分片的加持,数据库整体上还是处于不可访问状态的,这就无法满足业务上对 SLO(目标服务级别)的要求。
如果分片可以如我们所希望的那样正常工作,它就可以确保系统的高可用。即使数据库集群部分节点发生故障,只要其他节点在其中运行,数据库整体仍可对外提供服务。当然,这还需要复制与一致性服务的保证,我们会在之后课时中进一步探讨。
总而言之,分片可以增加数据库集群的总容量并加快处理速度,同时可以使用比垂直扩展更低的成本提供更高的可用性。
分片算法
分片算法一般指代水平分片所需要的算法。经过多年的演化,其已经在大型系统中得到了广泛的实践。下面我将介绍两种最常见的水平分片算法,并简要介绍一些其他的分片算法优化思路。
哈希分片
哈希分片,首先需要获取分片键,然后根据特定的哈希算法计算它的哈希值,最后使用哈希值确定数据应被放置在哪个分片中。数据库一般对所有数据使用统一的哈希算法(例如 ketama),以促成哈希函数在服务器之间均匀地分配数据,从而降低了数据不均衡所带来的热点风险。通过这种方法,数据不太可能放在同一分片上,从而使数据被随机分散开。
这种算法非常适合随机读写的场景,能够很好地分散系统负载,但弊端是不利于范围扫描查询操作。下图是这一算法的工作原理。
范围分片
范围分片根据数据值或键空间的范围对数据进行划分,相邻的分片键更有可能落入相同的分片上。每行数据不像哈希分片那样需要进行转换,实际上它们只是简单地被分类到不同的分片上。下图是范围分片的工作原理。
范围分片需要选择合适的分片键,这些分片键需要尽量不包含重复数值,也就是其候选数值尽可能地离散。同时数据不要单调递增或递减,否则,数据不能很好地在集群中离散,从而造成热点。
范围分片非常适合进行范围查找,但是其随机读写性能偏弱。
融合算法
这时我们应该意识到,以上介绍的哈希和范围的分片算法并不是非此即彼,二选一的。相反,我们可以灵活地组合它们。
例如,我们可以建立一个多级分片策略,该策略在最上层使用哈希算法,而在每个基于哈希的分片单元中,数据将按顺序存储。
这个算法相对比较简单且灵活,下面我们再说一个地理位置算法。
地理位置算法
该算法一般用于 NewSQL 数据库,提供全球范围内分布数据的能力。
在基于地理位置的分片算法中,数据被映射到特定的分片,而这些分片又被映射到特定区域以及这些区域中的节点。
然后在给定区域内,使用哈希或范围分片对数据进行分片。例如,在美国、中国和日本的 3 个区域中运行的集群可以依靠 User 表的 Country_Code 列,将特定用户(User)所在的数据行映射到符合位置就近规则的区域中。
那么以上就是几种典型的分片算法,下面我们接着讨论如何将分片算法应用到实际的场景中。
手动分片 vs 自动分片
手动分片,顾名思义,就是设置静态规则来将数据根据分片算法分散到数据库节点。这一般是由于用户使用的数据库不支持自动的分片,如 MySQL、Oracle 等。这个问题可以在应用层面上做数据分片来解决,也可以使用简单的数据库中间件或 Proxy 来设置静态的分片规则来解决。
手动分片的缺点是数据分布不均匀。数据分布不均可能导致数据库负载极其不平衡,从而使其中一些节点过载,而另一些节点访问量较少。
因此,最好避免在部分节点上存储过多数据,否则会造成这些节点成为访问热点,进而导致其运行速度降低,甚至使服务器崩溃。此外,当整体数据集过小时,也会导致这个问题,因为集群中只有部分节点才有数据。
这在开发和测试环境中是可以接受的,但在生产环境中是不可以接受的。因为数据分布不均,热点以及将数据存储在太少的分片上,都会导致数据库集群内的节点计算资源耗尽,造成系统不稳定。
但如果精心设计,且数据分布变化不大,采用手动分片也是一个较为简单、维护成本低廉的方案。
而使用自动分片意味着计算节点与分片算法可以相互配合,从而使数据库进行弹性伸缩。
使用基于范围的分片很容易实现自动分片:只需拆分或合并每个分片。
假设现在有一个范围为 [1,100)的分片,我们想要将它分裂为两个范围,先选择 50 作为切分点;然后将该区域分为 [1,50)和 [50,100)之后,将两个区域移动到两台不同的数据库节点中,从而使系统负载达到平衡。
基于范围的分片可能会带来读取和写入热点,我们可以通过拆分和移动分片消除这些热点。
而使用基于哈希的分片的系统实现自动分片代价很高昂。我们现在使用上面图 1 中的例子来说明。
当前系统有 4 个节点,然后添加一个新的数据库节点。在哈希函数中,“ n”从 4 更改为 5,这会导致较大的系统抖动。尽管你可以使用像 Ketama 这样的一致性哈希算法来尽可能减少系统抖动,但数据迁移与再平衡操作还是必须要有的。
这是因为在应用哈希函数后,数据是随机分布的,并且调整散列算法肯定会更改大多数数据的分布情况。
自动分片是分布式数据库的主流功能,所有主要的分布式数据库,甚至数据库中间件都在尝试自动分片。下面我将结合几个案例来说明。
分片算法案例
数据分片是数据库中间件的核心功能,且该领域开源项目较多。我这里以 Apache ShardingShpere 的分片内容为例,向你介绍分片算法的相关实践案例。
分片键生成
ShardingShpere 首先提供了分布式的主键生成,这是生成分片键的关键。由于分布式数据库内一般由多个数据库节点参与,因此基于数据库实例的主键生成并不适合分布式场景。
常用的算法有 UUID 和 Snowfalke 两种无状态生成算法。
UUID 是最简单的方式,但是生成效率不高,且数据离散度一般。因此目前生产环境中会采用后一种算法。下图就是用该算法生成的分片键的结构。
图 4 分片键结构
灵活的分片算法
为了保证分片计算的灵活性,ShardingShpere 提供了标准分片算法和一些工具,帮助用户实现个性化算法。
用户通过以上多种分片工具,可以灵活和统一地制定数据库分片策略。
自动分片
ShardingShpere 提供了 Sharding-Scale 来支持数据库节点弹性伸缩,该功能就是其对自动分片的支持。下图是自动分片功能展示图,可以看到经过 Sharding-Scale 的特性伸缩,原有的两个数据库扩充为三个。
图 5 自动分片功能展示
自动分片包含下图所示的四个过程。
图 6 自动分片过程
从图 6 中可以看到,通过该工作量,ShardingShpere 可以支持复杂的基于哈希的自动分片。同时我们也应该看到,没有专业和自动化的弹性扩缩容工具,想要实现自动化分片是非常困难的。
以上就是分片算法的实际案例,使用的是经典的水平分片模式。而目前水平和垂直分片有进一步合并的趋势,下面要介绍的 TiDB 正代表着这种融合趋势。
垂直与水平分片融合案例
TiDB 就是一个垂直与水平分片融合的典型案例,同时该方案也是 HATP 融合方案。
其中水平扩展依赖于底层的 TiKV,如下图所示。
图 7 TiKV
TiDB 的水平扩展依赖于 TiFlash,如下图所示。
图 8 TiFlash
从图 8 中可以看到 TiFlash 是 TiKV 的列扩展插件,数据异步从 TiKV 里面复制到 TiFlash,而后进行列转换,其中要使用 MVCC 技术来保证数据的一致性。
上文所述的 Region 会增加一个新的异步副本,而后该副本进行了数据切分,并以列模式组合到 TiFlash 中,从而达到了水平和垂直扩展在同一个数据库的融合。这是两种数据库引擎的融合。
以上的融合为 TiDB 带来的益处主要体现在查询层面,特别对特定列做聚合查询的效率很高。TiDB 可以很智能地切换以上两种分片引擎,从而达到最优的查询效率。
总结
今天先是详细介绍了分片的原理,以及多种常用的分片技术;而后分析了手动分片与自动分片的区别,要知道数据分片的未来是属于自动分片的。
最后,我通过两个著名的开源项目介绍了分片技术是如何应用到分布式数据库中的。其中 TiDB 所展示的 HATP 融合两个分片模式的技术路线,可以被看作是未来分片模式发展的趋势。
sql和orcale的区别是什么
一简介美国Orcale公司研制的一种关系型数据库管理系统,是一个协调服务器和用于支持任务决定型应用程序的开放型RDBMS。 它可以支持多种不同的硬件和操作系统平台,从台式机到大型和超级计算机,为各种硬件结构提供高度的可伸缩性,支持对称多处理器、群集多处理器、大规模处理器等,并提供广泛的国际语言支持。 Orcale是一个多用户系统,能自动从批处理或在线环境的系统故障中恢复运行。 系统提供了一个完整的软件开发工具Developer2000,包括交互式应用程序生成器、报表打印软件、字处理软件以及集中式数据字典,用户可以利用这些工具生成自己的应用程序。 Orcale以二维表的形式表示数据,并提供了SQL(结构式查询语言),可完成数据查询、操作、定义和控制等基本数据库管理功能。 Orcale具有很好的可移植性,通过它的通信功能,微型计算机上的程序可以同小型乃至大型计算机上的Orcale,并且能相互传递数据。 另外Orcale还具有与C语言的接电子表格、图形处理等软件。 Orcale属于大型数据库系统,主要适用于大、中小型应用系统,或作为客户机/服务器系统中服务器端的数据库系统。 二.浅析SQL Server 与Oracle区别随着信息技术的飞速发展,数据处理不仅在数量上要求越来越大,而且在质量上也要求越来越高。 操作系统的稳定对数据库来说是十分紧要的,在数据库可操作平台上,Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案。 客户可以利用很多种第三方应用程序、工具。 对开发商来说是很大的支持。 而SQL Server却只能在Windows上运行了,这个就显得比较单调了,但SQL Sever在Window平台上的表现,和Windows操作系统的整体结合程度,使用方便性,和Microsoft开发平台的整合性都比Oracle强的很多。 但Windows操作系统的稳定性及可靠性大家是有目共睹的,再说Microsoft公司的策略目标是将客户都锁定到Windows平台的环境当中,只有随着Windows性能的改善,SQL Server才能进一步提高。 从操作平台这点上Oracle是完全优胜于SQL Server的了。
mongodb分片后怎么取数据
分片是MongoDB提供的一种机制,其可以将大型的集合分割保存到不同的服务器上。 与其他的分区方案相比,MongoDB几乎能自动为我们完成所有事情。 只要我们进行简单的配置,并告诉MongoDB要分配的数据,它就可以自动维护数据在不同服务器之间的平衡。 同时根据需要增减服务器,MongoDB也会自动移动平移已有数据。 分片机制提供了如下三种优势1. 对集群进行抽象,让集群“不可见”。 MongoDB自带了一个叫做mongos的专有路由进程。 mongos就是掌握统一路口的路由器,其会将客户端发来的请求准确无误的路由到集群中的一个或者一组服务器上,同时会把接收到的响应拼装起来发回到客户端。 2.保证集群总是可读写。 MongoDB通过多种途径来确保集群的可用性和可靠性。 将MongoDB的分片和复制功能结合使用,在确保数据分片到多台服务器的同时,也确保了每分数据都有相应的备份,这样就可以确保有服务器换掉时,其他的副本可以立即接替坏掉的部分继续工作。 3.使集群易于扩展。 当系统需要更多的空间和资源的时候,MongoDB使我们可以按需方便的扩充系统容量。 实现数据分割分片(shard)是集群中存储集合数据子集的一台或者多台服务器。 在生产环境中一个分片通常是一个副本集(replica Set)。 片键(key),MongoDB以其作为依据来确定需要在不同分片服务器之间移动的数据。 例如我们可以选择用户名(username)字段作为分片键,现有一用户名区间[“p”,”z”],那么wufengtinghai是属于这一区间的,那么数据最终会保存到与此区间对应的分片服务器上。 分配数据到分片服务器分配数据到分片服务器可以使用不同的方式,了解不同的方式可以加深我们对MongoDB使用方式的理解。 一分片一区间分配数据到分片最简单的方式莫过于一个区间一个分片。 假设我们有四个分片存储用户的相关信息,则我们可能会得到如下的分片和区间的对应关系。 这种分片方式非常简单易懂,但是在一个大型繁忙的系统中却会带来许多的不便。 假如大量的用户使用首字母在【“a”,”f”)中的名字来注册,这将会导致分片1比较大,因此需要将其一部分文档移动到分片2上,我们可以调整分片1对应区间【”a”,”c”),使分片2的区间变成【”c”,”n”)。 如果移动数据后,分片2因此过载怎么办?假设分片1和分片2各有500G数据,而分片3和分片4各自有300G数据。 那么按照这个方案,最终需要一连串的复制,总共算下来需要移动400G数据,考虑到需要在集群的服务器之间移动这些数据,可见移动数据量之大。 如果需要新加分片服务器进行水平扩展呢?假设此时每个分片上都有了500G数据,那么我们现在需要将分片4上的400G数据移动到分片5,将分片3的300G数据移动到分片4,将分片2的200G数据移动到分片3,将分片1的100G数据移动到分片2,整整移动了1T的数据!随着分片数量和数据量的增长,这种噩梦将会持续下去,因此MongoDB不会采用这种方式。 一分片多区间如果我们采用一分片多区间的方式,我们可以将分片1上的数据划分为两个区间,【”a”,”d”)包含400G数据,【”d”,”f”)包含100G数据,同样我们也可以对分片2做类似的处理,得到区间【”f”,”j”)和【“j”,”n”)。 现在我们只需要将分片1上的【”d”,”f”)数据移动到分片4,将分片2的【“j”,”n”)的数据移动到分片3。 这样我们仅仅只需要移动200G数据。 如果要添加新分片,可以从每个分片顶端取100G数据并将其移动到新的分片上,这样仅仅只需要移动400G数据即可。 MongoDB就是利用这种方式,当一个分片的数据越来越大时,其会自动分割片键区间,并将分片的数据进行分割并移动到其他分片。
数据库管理系统中为什么要设置缓冲区
。 数据库系统软件包括:(1)数据库管理系统,数据库管理系统的数据库的建立,使用和维护的软件配置。 (2)支持的DBMS运行的操作系统。 (3)一个高层次的语言和编译系统与数据库的接口,以方便应用程序的开发。 (4)数据库管理系统的核心应用程序的开发工具。 (5)数据库应用程序开发的系统为特定的应用环境。 2。 的硬件资源,整个数据库系统提出了更高的要求:(1),数据缓冲区,以存储操作系统,数据库管理系统的核心模块和应用程序需要有足够大的内存。 (2)有足够大的磁盘直接访问设备来存放数据库的数据备份有足够的磁带(或软盘)。 (3),以提供更高的信道容量,为了提高数据的传输速率。 3。 DBA的重要责任,是确保数据库的安全性和完整性的。 个人用户访问权限的数据库,所以DBA负责确定级别的保密性和数据完整性约束; DBA和重要职责是监控数据库系统的操作,在过程中出现的问题,及时处理运行。 如系统故障,数据库将因此受到不同程度的损坏,DBA必须在最短的时间内数据库恢复到正确的状态,并尽可能,或多或少会影响其他地区的电脑系统不正常运行造成影响,DBA定期数据库重新组织,以提高系统的性能,提高了用户的需求和改变DBA较大的转变,但也数据库,部分的设计,重型结构的数据库。 4。 系统分析员是负责应用系统的需求分析和规范,以及用户和DBA能够确定系统的硬件和软件配置,并参与数据库系统的概要设计。 数据库设计在数据库中的数据来确定,数据库设计模式,在各级负责。 数据库设计人员必须参加用户需求调查和系统分析,数据库设计。 在大多数情况下,数据库设计人员可以由数据库管理员提供。 应用程序员负责的应用系统模块的设计和程序的编制和调试,安装。 5。 数据库管理系统的功能:(1)数据定义(2)数据操作;(3)数据库的运行和管理;(4)数据组织,存储和管理;(5)数据库的建立和维护;(6)数据通信接口。 6。 DBMS是由下列人员组成:(1)数据定义语言及其翻译处理程序(2)数据操纵语言和编译器(或解释)程序,(3)数据库运行控制程序;(4)实用程序。 在关系模型中,实体和实体之间的关系代表。 如之间的实体研究生导师实体,导师和研究生的关系,代表一个一对多的关系。 在一个给定的应用领域中,所有的实体和关系之间的联系构成一个关系数据库。 关系模型的数据结构关系数据库模型是最流行的数据库模型,从简单的结构,其受欢迎的原因。 在关系模型中最重要的数据的结构的关系。 建立一个关系模型数据库,数据库的组合物的设计的核心。 关系涉及到设计中的一些条款,包括:关系表设计之间的关系是表的设计; 元组是一个表中的行属性表中的属性名称的属性的名称; 表中的关键字是属性组,来唯一地标识一个元组; 关系模型是描述的关系是一般表示为关系名(属性1,属性2,···,属性n)的; 外键比关键字或只是关键字的一部分的属性或属性的组合之间的关系的关系,但它也另外一个关键词之间的关系; 主表的主键,外键的表从表的外键表。 数据库的设计必须指定关键字或主码的每个关系,和的关系,关键字的价值是不是空的,是的关键字的值是空的元组的关系是不允许的存在。 在一些关系的关键字是由一个单一的属性,关键字是构成一定的关系,在这种关系中的元组的属性不能有任何一个属性的组合,只说了更多的属性的组合可以唯一地表示。 关系模型是稳定的,但这种关系随时间而改变,因为在数据库中的数据被不断更新。
发表评论