一、引言
随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失。通过负载均衡策略,有效的降低了单台机器的访问负载,降低了宕机的可能性;通过集群方案,解决了数据库宕机带来的单点数据库不能访问的问题;通过读写分离策略更是最大限度了提高了应用中读取(Read)数据的速度和并发量。目前国内的大型互联网应用中,大量的采用了这样的数据切分方案,Taobao,Alibaba,Tencent,它们大都实现了自己的分布式数据访问层(DDAL)。以实现方式和实现的层次来划分,大概分为两个层次(Java应用为例):JDBC层的封装,ORM框架层的实现。下面兄弟连教育(www.lampbrother.net
)来解析基本原理和概念
二、基本原理和概念
2.1基本原理:
人类认知问题的过程总是这样的:what(什么)-?why(为什么)-?how(怎么做),接下来,本文将就这三个问题展开讨论和研究:
2.1.1什么是数据切分
"Shard"这个词英文的意思是"碎片",而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏中。"Sharding"姑且称之为"分片"。Sharding不是一门新技术,而是一个相对简朴的软件理念。众所周知,MySQL5之后才有了数据表分区功能,那么在此之前,很多MySQL的潜在用户都对MySQL的扩展性有所顾虑,而是否具备分区功能就成了衡量一个数据库可扩展性与否的一个关键指标(当然不是唯一指标)。数据库扩展性是一个永恒的话题,MySQL的推广者经常会被问到:如在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类的处理,是如何办到的呢?答案是:Sharding。Sharding不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(ScaleOut,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的I/O能力限制,解决数据库扩展性问题。
通过一系列的切分规则将数据水平分布到不同的DB或table中,在通过相应的DB路由或者table路由规则找到需要查询的具体的DB或者table,以进行Query操作。这里所说的“sharding”通常是指“水平切分”,这也是本文讨论的重点。具体将有什么样的切分方式呢和路由方式呢?行文至此,读者难免有所疑问,接下来举个简单的例子:我们针对一个Blog应用中的日志来说明,比如日志文章(article)表有如下字段:
article_id(int),title(varchar(128)),content(varchar(1024)),user_id(int)
面对这样的一个表,我们怎样切分呢?怎样将这样的数据分布到不同的数据库中的表中去呢?其实分析blog的应用,我们不难得出这样的结论:blog的应用中,用户分为两种:浏览者和blog的主人。浏览者浏览某个blog,实际上是在一个特定的用户的blog下进行浏览的,而blog的主人管理自己的blog,也同样是在特定的用户blog下进行操作的(在自己的空间下)。所谓的特定的用户,用数据库的字段表示就是“user_id”。就是这个“user_id”,它就是我们需要的分库的依据和规则的基础。我们可以这样做,将user_id为1~10000的所有的文章信息放入DB1中的article表中,将user_id为10001~20000的所有文章信息放入DB2中的article表中,以此类推,一直到DBn。这样一来,文章数据就很自然的被分到了各个数据库中,达到了数据切分的目的。接下来要解决的问题就是怎样找到具体的数据库呢?其实问题也是简单明显的,既然分库的时候我们用到了区分字段user_id,那么很自然,数据库路由的过程当然还是少不了user_id的。考虑一下我们刚才呈现的blog应用,不管是访问别人的blog还是管理自己的blog,总之我都要知道这个blog的用户是谁吧,也就是我们知道了这个blog的user_id,就利用这个user_id,利用分库时候的规则,反过来定位具体的数据库,比如user_id是234,利用该才的规则,就应该定位到DB1,假如user_id是12343,利用该才的规则,就应该定位到DB2。以此类推,利用分库的规则,反向的路由到具体的DB,这个过程我们称之为“DB路由”。
当然考虑到数据切分的DB设计必然是非常规,不正统的DB设计。那么什么样的DB设计是正统的DB设计呢?
我们平常规规矩矩用的基本都是。平常我们会自觉的按照范式来设计我们的数据库,负载高点可能考虑使用相关的Replication机制来提高读写的吞吐和性能,这可能已经可以满足很多需求,但这套机制自身的缺陷还是比较显而易见的(下文会提及)。上面提到的“自觉的按照范式设计”。考虑到数据切分的DB设计,将违背这个通常的规矩和约束,为了切分,我们不得不在数据库的表中出现冗余字段,用作区分字段或者叫做分库的标记字段,比如上面的article的例子中的user_id这样的字段(当然,刚才的例子并没有很好的体现出user_id的冗余性,因为user_id这个字段即使就是不分库,也是要出现的,算是我们捡了便宜吧)。当然冗余字段的出现并不只是在分库的场景下才出现的,在很多大型应用中,冗余也是必须的,这个涉及到高效DB的设计。
分享到:
相关推荐
《MySQL数据库原理及应用》是一门深入探讨关系型数据库管理系统MySQL的课程,旨在教授学生如何设计、创建和管理数据库,以及如何在实际应用场景中高效利用MySQL。教案详细涵盖了该课程的所有章节,为教学提供了全面...
《MySQL数据库原理及应用》从教学实际出发,系统地介绍了MySQL数据库的有关原理和基本操作,主要内容包括数据库技术概述、MySQL概述、数据库基本操作、数据表、索引、结构化查询语言SQL、视图、触发器、存储过程和...
《MySQL数据库原理及应用(第2版)(微课版)》是一本深入浅出介绍MySQL技术的教材,配合配套教案,旨在帮助学生和学习者全面理解和掌握数据库设计与管理的核心概念。 该教程可能涵盖以下关键知识点: 1. **数据库...
在《MySQL数据库原理及应用(第2版)(微课版)》中,我们通常会深入探讨数据库的基本概念、设计原则以及实际操作技巧。这份教学资料包含了一个Mysql数据库的备份文件,为学习者提供了实践平台,便于理解和掌握...
本PPT将深入探讨MySQL的基本原理、功能特性和应用实践。 1. **数据库基础** - 数据库的概念:存储和管理数据的系统,提供数据的组织、存储、检索、更新和删除等功能。 - 关系数据库模型:基于关系理论,以表格...
数据库原理及应用_MySQL 实验任务及指导书 MySQL 是一种流行的关系数据库管理系统(RDBMS),广泛应用于各种 Web 应用程序和企业级应用程序。MySQL 的实验任务及指导书旨在帮助学生掌握 MySQL 的基础知识和基本...
首先,我们要了解MySQL的基本概念。MySQL是一个开源、免费的关系型数据库管理系统(RDBMS),广泛应用于互联网行业,支持多种操作系统,并以其高效、稳定和易于扩展的特点深受开发者喜爱。其核心功能包括数据存储、...
- 熟练掌握索引的使用和事务的基本概念 #### 二、课程主要内容 ##### 1. MySQL InnoDB存储引擎原理与缓存组件参数优化实战 从MySQL 5.5版本开始,默认使用InnoDB作为存储引擎。InnoDB因其出色的事务处理能力和...
理解这些基本概念和操作是使用MySQL的基础。 在应用方面,实训将涉及数据的插入、更新和删除操作,以及复杂的查询技术,如联接(JOIN)、子查询、集合操作(UNION、INTERSECT、EXCEPT)。还会介绍事务处理,理解...
《MySQL数据库原理及应用(第2版)(微课版)》是一套全面介绍MySQL数据库系统的核心知识与实际应用的教学资料。本课程旨在帮助学习者深入理解MySQL的内部机制,掌握其基本操作,并能将其应用于实际项目开发中。以下...
最后,了解数据库管理系统的设计和架构,如MySQL的InnoDB存储引擎的工作原理,以及如何配置和调整MySQL服务器以提高性能,这些都是高级数据库管理的知识点,可能会在习题中有所涉及。 综上所述,《数据库原理及应用...
总的来说,这个压缩包为数据库系统原理和MySQL的学习提供了一套完整的练习和解答,对于想要提升数据库理论知识和实践技能的人来说,无疑是一份宝贵的学习资源。通过深入研究这些习题答案,你可以更好地理解数据库的...
这篇鲁班学院的MySQL底层原理分析学习笔记将深入探讨MySQL的核心机制,帮助读者理解数据存储、查询优化、事务处理以及并发控制等关键概念。 1. **存储引擎**:MySQL支持多种存储引擎,如InnoDB(事务安全,支持行级...
本报告还介绍了MYSQL数据库管理系统的基本概念和特点,以及MYSQL数据库系统在图书管理系统中的应用。报告的目的是为了介绍数据库系统原理的基本概念和设计方法,旨在帮助读者更好地理解数据库系统的设计和实现。 ...
### MySQL索引背后的数据结构及算法原理 #### 数据结构及算法基础 索引在数据库中的作用至关重要,它能够显著提高数据...未来,随着数据库技术的不断发展,索引的设计和优化方法也会随之演变,但基本原理仍然适用。
### MySQL 事务的基本使用——基本原理及特点 ACID #### 一、事务的概念与作用 在数据库管理系统中,事务(Transaction)是指作为一个工作单元的一系列操作。这些操作要么全部完成,要么全部都不进行,以此来确保...
在介绍完组提交的基本概念和过程后,我们进一步探讨在不同场景下组提交的实现细节。当binlog关闭时,Redo Log的组提交可以显著提高性能。但如果开启了binlog,MySQL则使用二阶段提交机制来保证Redo Log和binlog的...
这些是MySQL数据库原理与应用的一些基础知识点,对于期末考试复习来说,深入理解和实践这些概念是非常重要的。除此之外,还要熟悉SQL语句的编写,了解如何创建、修改和删除表,以及如何进行复杂的查询操作,包括JOIN...
本资料旨在提供一个入门级别的概述,帮助你理解数据库的基本概念和工作原理。 首先,我们需要了解什么是数据库。数据库是一个有组织的数据集合,它能够以结构化的方式存储信息,并通过特定的查询语言来访问这些信息...