Database数据库切片模式

数据库切片模式关注的实现水平伸缩。切分是从单个数据库到平分数据访问两个或更多数据库切片。每个切片有和原始数据库相同的Schema。大多数据分布在每个切片每一行。从切片合并起来的数据和原始数据库一样。切片也被近似等同于水平分区(Horizontal Partitioning),网上很多地方也用水平分区来指代切片,二者之间实际上还是有区别的。的确,切片 的思想是从分区的思想而来,但数据库分区基本上是数据对象级别的处理,比如表和索引的分区,每个子数据集上能够有不同的物理存储属性,还是单个数据库范围内的操作,而切片是能够跨数据库,甚至跨越物理机器的。

上下文(Context)

数据库切片有效应对下面的挑战:

    1. 应用数据库查询超过单个数据库结点的查询能力.
    2. 应用数据库更新超过单个数据库事务处理能力,导致不可接受相应时间或超时。
    3. 应用数据库网络带宽超过单个数据库结点的带宽页导致不可接受相应时间或超时。
    4. 应用数据库存储需求已超过单个数据库结点容量。

机制

   传统(非共享)数据库部署在单个服务器结点上。任何数据库运行在单个结点受限于当前结点容量。争夺的资源如CPU,内存,磁盘速度,数据尺寸,和网络带宽能损害数据库能力来处量相关的数据库活动。过分的争夺还可能使数据库承受不了。当单个结点不再够用时有很多潜在的方法为了实现一个应用数据库伸缩。一些例子包括:分布式查询加载到从结点,按数据类型拆分到多个数据库与垂直伸缩的数据库服务器。处理查询加载(非写/更新),从结点是从主数据复制;从结点是只读与典型事务一致。另一个选项是按数据类型拆分到多个数据库,如存货清单数据在一个数据库中,雇员数据在另一个数据库中。每个结点包含数据子集叫做切片。总体地,所有切片中数据呈现一个完整逻辑数据库。在数据库服务继承切片时,切片集合出现在单个数据库连接字符串中。这个抽象很好简化了应用程序编程模型。

如上图所示,数据行分布到切片,维护着相同的结构,上面一个切片存储id=1,2,另一个存储id=3,4,5的记录。

切分和策略

像很多其他技术一样,进行切分时也需要作出部分妥协。因为切片不是一项本地数据库技术 — 也就是说,必须在应用程序中实现 —在开始切片之前需要制定出您的切分策略。进行切分时主键和跨切分查询都扮演重要角色,主要通过定义您不可以做什么实现。

主键

切片利用多个数据库,其中所有数据库都独立起作用,不干涉其他切片。因此,如果您依赖于数据库序列(如自动主键生成),很有可能在一个数据库集中将出现同一个主键。可以跨分布式数据库协调序列,但是这样会增加系统的复杂程度。避免相同主键最安全的方法就是让应用程序(应用程序将管理切分系统)生成主键。

跨切片查询

大部分切分实现不支持跨切片查询,这就意味着,如果您想利用不同切分的两个数据集,就必须处理额外的长度。(有趣的是,Amazon 的 SimpleDB 也禁止跨域查询)例如,如果将美国客户信息存储在切片1中,还需要将所有相关数据存储在此。如果您尝试将那些数据存储在切片2中,情况就会变得复杂,系统性能也可能受影响。这种情况还与之前提到的一点有关 — 如果您因为某种原因需要进行跨切分连接,最好采用一种可以消除重复的方式管理键!

很明显,在建立数据库前必须全面考虑切分策略。一旦选择了一个特定的方向之后,您差不多就被它绑定了 — 进行切分后很难随便移动数据了。

一个策略示例

因为切分将您绑定在一个线型数据模型中(也就是说,您无法轻松连接不同切分中的数据),您必须对如何在每个切分中对数据进行逻辑组织有一个清晰的概念。这可以通过聚焦域中的主要节点实现。如在一个电子商务系统中,主要节点可以是一个订单或者一个客户。因此,如果您选择 “客户” 作为切分策略的节点,那么与客户有关的所有数据将移动至各自的切分中,但是您仍然必须选择将这些数据移动至哪个切分。对于客户来说,您可以根据所在地(欧洲、亚洲、非洲等)切分,或者您也可以根据其他元素进行切分。这由您决定。但是,您的切分策略应该包含将数据均匀分布至所有切分的方法。切分的总体概念是将大型数据集分割为小型数据集;因此,如果一个特定的电子商务域包含一个大型的欧洲客户集以及一个相对小的美国客户集,那么基于客户所在地的切分可能没有什么意义。

注意

比如类似交易记录的历史表信息,如果一条记录中既包含卖家信息与买家信息,如果随着时间推移,买、卖家会分别与其它用户继续进行交易,这样不可避免的两个买卖家的信息会分布到不同的数据库切片上,而这时如果针对买卖家查询,就会跨越更多的切片,开销就会比较大。

切片并不是数据库扩展方案的银弹,也有其不适合的场景,比如处理事务型的应用就会非常复杂。对于跨不同DB的事务,很难保证完整性,得不偿失。

在进行切分之前,一定要确定应用程序的规模和增长对其有利。切分的成本(或者说缺点)包括对如何存储和检索数据的特定应用程序逻辑进行编码的成本。进行切分后,您多多少少都被锁定在您的切分模型中,因为重新切分并非易事。

如果能够正确实现,切分可以用于解决传统 RDBMS 规模和速度问题。切分对于绑定于关系基础架构、无法继续升级硬件以满足大量可伸缩数据存储要求的组织来说是一个非常成本高效的决策。

时间: 2024-10-15 12:14:13

Database数据库切片模式的相关文章

PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

看PostgreSQL9的官方文档,我越看越迷糊,这表空间,数据库,模式,表,用户,角色之间的关系怎么在PostgreSQL里这么混乱呢?经过中午的一个小实验,我逐渐理清了个中来龙去脉.下面我来还原我的试验,并循序讲清其中关系. 首先,实验出角色与用户的关系    在PostgreSQL中,存在两个容易混淆的概念:角色/用户.之所以说这两个概念容易混淆,是因为对于PostgreSQL来说,这是完全相同的两个对象.唯一的区别是在创建的时候: 1.我用下面的psql创建了角色kanon:   CRE

数据库的模式

     三级模式结构:外模式.模式和内模式 一.模式(Schema) 定义:也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图. 理解: ① 一个数据库只有一个模式; ② 是数据库数据在逻辑级上的视图; ③ 数据库模式以某一种数据模型为基础; ④ 定义模式时不仅要定义数据的逻辑结构(如数据记录由哪些数据项构成,数据项的名字.类型.取值范围等),而且要定义与数据有关的安全性.完整性要求,定义这些数据之间的联系. 二.外模式(External Schema) 定义:也

数据库归档模式

背景:新话单功能上线后,生产环境之前未配置定时任务产生话单,导致数据库有2000多万条的记录等待生成话单,定时任务配置正确后,由于环境开启了数据库归档模式,而生成话单的过程又在不断的update和delete行为轨迹表中的数据,导致产生大量的归档日志,必须实时监控磁盘空间. Oracle数据库的归档模式一般在开发.测试环境默认是不设置的的,主要是为了节省磁盘空间,在生产环境上,设置日志模式并自动归档主要是为了保证系统安全,恢复数据. (一)Oracle数据库进行日志的自动归档需要满足两个条件:

关系型数据库的模式和映像

数据库的模型 数据库的模型从数据库技术出现至今一共有3种比较通用的模型 1.层次结构模型 最早使用层次结构模型的是IBM公司的IMS,即数据库管理信息系统.层次模型类似于倒置的树型,一个父表可以有多个子表,但是没一个字表都对应着一个父表. 2.网状结构模型 网状结构模型是对层次结构模型的改进,网状结构模型打破了层次结构模型使用的限制,可以更全面第描述数据库中表之间的关系,可以一个父表没有子表,也可以一个字表有多个父表,还可以设置两个表之间的多种关系 3.关系结构模型 关系结构模型可以是在层次结构

cxGrid 增加序号 (非数据库绑定模式) (测试通过)

cxGrid 增加序号 (非数据库绑定模式) ----------------------------------- 1. 选在 adoQuery 控件 , 鼠标右键菜单中 选择 Fields Editor 2. 在  adoQuery 控件 Fields Editor 中 鼠标右键菜单  (1)  Add all fields (2)  New field  --->  Name ==>     curRowNo                         Type    ==>

查看数据库恢复模式

SELECT recovery_model,recovery_model_desc FROM sys.databases WHERE name ='' 查看数据库恢复模式

数据库三级模式

外模式(用户模式) 外模式又称子模式或用户模式,对应于用户级.它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示.外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据.用户可以通过外模式描述语言来描述.定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(Data Manipulation Language,DML)对这些数据记录进行.外模式反映了数据库的用户观. 概念模式(逻辑模式) 模式又称概念模式或逻辑模式,对应于概念级.它是由数据库设计者

MVC学习之数据库开发模式:代码优先实例介绍

数据库开发模式之代码优先主要有以下几步: 1.在Models文件夹中创建需要的表所对应的类 2.创建数据上下文类 3.在webConfig文件中配置数据库连接节点 4.添加控制器和相应的视图文件 5.在控制器的动作中创建数据上下文实例,通过实例操作数据库数据 具体步骤如下所示: 1.在Models文件夹中创建所需表对应的类 namespace CodeFirst.Models { public class book { public int Id { get; set; } public str

MVC学习之数据库开发模式:三种开发模式总结:

先介绍下三种开发模式的使用方法: 1.数据库优先: 数据库开发之:数据库优先主要步骤: 1.在数据库中建立好数据库和所需要得到表 2.选中Models文件夹,添加新项目--数据--ADO.NET实体数据模型……在生成数据库页面选着从数据库中生成 在完成2之后,会在web.config里面自动生成数据库连接字符串 3.创建控制器和对应的视图页面 4.在控制器中创建数据上下文实例对象,该对象是通过连接数据库字符串的名字来创建的. 2.代码优先: 数据库开发之代码优先步骤: 1.在Models文件夹中