`

数据库水平切分的实现原理解析——分库,分表

 
阅读更多
第1章 引言
随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。
  • 水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失
  • 负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能性
  • 集群方案:解决了数据库宕机带来的单点数据库不能访问的问题
  • 读写分离策略:最大限度了提高了应用中读取数据的速度和并发量

第2章 基本原理和概念
什么是数据切分
"Shard" 这个词英文的意思是"碎片",而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏中。"Sharding" 姑且称之为"分片"。Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。通过一系列的切分规则将数据水平分布到不同的DB或table中,在通过相应的DB路由或者table路由规则找到需要查询的具体的DB或者table,以进行Query操作。“sharding”通常是指“水平切分”,这也是本文讨论的重点。接下来举个简单的例子:我们针对一个Blog应用中的日志来说明,比如日志文章(article)表有如下字段:


面对这样的一个表,我们怎样切分呢?怎样将这样的数据分布到不同的数据库中的表中去呢?我们可以这样做,将user_id为1~10000的所有的文章信息放入DB1中的article表中,将user_id为10001~20000的所有文章信息放入DB2中的 article表中,以此类推,一直到DBn。这样一来,文章数据就很自然的被分到了各个数据库中,达到了数据切分的目的。

接下来要解决的问题就是怎样找到具体的数据库呢?其实问题也是简单明显的,既然分库的时候我们用到了区分字段user_id,那么很自然,数据库路由的过程当然还是少不了user_id的。就是我们知道了这个blog的user_id,就利用这个user_id,利用分库时候的规则,反过来定位具体的数据库。比如user_id是234,利用刚才的规则,就应该定位到DB1,假如user_id是12343,利用该才的规则,就应该定位到DB2。以此类推,利用分库的规则,反向的路由到具体的DB,这个过程我们称之为“DB路由”。

平常我们会自觉的按照范式来设计我们的数据库,考虑到数据切分的DB设计,将违背这个通常的规矩和约束。为了切分,我们不得不在数据库的表中出现冗余字段,用作区分字段或者叫做分库的标记字段。比如上面的article的例子中的user_id这样的字段(当然,刚才的例子并没有很好的体现出user_id的冗余性,因为user_id这个字段即使就是不分库,也是要出现的,算是我们捡了便宜吧)。当然冗余字段的出现并不只是在分库的场景下才出现的,在很多大型应用中,冗余也是必须的,这个涉及到高效DB的设计,本文不再赘述。

参考:http://www.cnblogs.com/zhongxinWang/p/4262650.html
分享到:
评论

相关推荐

    数据库分库技巧

    本文将重点介绍水平切分中的关键技术——分库、分表、主从复制、集群及负载均衡等,探讨这些技术的实现原理及其应用场景。 #### 二、基本原理与概念 ##### 2.1 数据切分概述 数据切分(Data Sharding)是一种常见...

    数据库水平切分的实现原理解析

    【数据库水平切分实现原理解析】 随着互联网的发展,海量数据的存储与访问已成为系统设计的关键挑战。面对每天数十亿的页面访问量(PV),数据库的高负载问题日益突出,严重影响了系统的稳定性和扩展性。水平切分...

    sharding-jdbc之——分库分表实例完整源码

    2. **分库分表原理**:分库分表是数据库水平扩展的一种策略,通过将一个大表的数据分散到多个数据库或表中,以减轻单一数据库的压力,提高系统的读写性能和并发能力。Sharding-JDBC提供了基于哈希、范围、精确匹配等...

    sharding-jdbc之——分库分表实例完整源码.zip

    标题"sharding-jdbc之——分库分表实例完整源码.zip"提到了"sharding-jdbc",这是一个用于Java的分布式数据库中间件,它提供了分库分表的功能,帮助解决大数据量下的性能瓶颈问题。"分库分表"是将一个大表的数据分散...

    MYSQL 数据库水平切分的实现原理解析

    ### MySQL 数据库水平切分的实现原理解析 #### 第1章 引言 随着互联网技术的迅猛发展,海量数据的存储与访问已成为系统设计的关键挑战之一。在高流量应用场景中,例如大型电商平台或社交网络平台,每日数十亿次页面...

    MySQL 分库分表的实现原理及演示案例

    数据库分库分表的几种方式主要包括垂直分库、垂直分表、水平分库和水平分表。垂直分库是按照业务的不同进行数据库的分割,每个数据库只包含部分业务的数据;垂直分表是将一个表按照字段划分成多个表,通常按照数据的...

    单KEY业务,数据库水平切分架构实践

    ### 单KEY业务,数据库水平切分架构实践 #### 用户前台侧:“建立非uid属性到uid的映射关系”最佳实践 在面对大量的用户数据时,为了提高数据库系统的响应速度和处理能力,需要采取合适的数据库水平切分策略。水平...

    数据库分库分表思路.docx

    数据库分库分表是应对大数据量和高并发场景下的常用策略,目的是为了减轻单个数据库的负担,提高系统的整体性能和稳定性。随着互联网业务的发展,单个关系型数据库的存储容量、连接数和处理能力往往难以满足需求。当...

    php mysql分库分表实例

    分库分表是一种常见的数据库垂直切分和水平切分策略,用于解决单一数据库性能瓶颈问题。垂直切分是根据业务逻辑将数据分散到多个数据库中,通常依据表的相关性或访问频率来进行。而水平切分则是按照某个字段(如用户...

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    ShardingJDBC作为一个轻量级的Java库,能够在不修改现有数据库架构和业务代码的情况下,仅通过配置即可实现分库分表。它具备良好的兼容性,可以与任何Java应用无缝集成,包括但不限于Spring、MyBatis等。在本项目中...

    数据分库分表之二叉树分库分表

    本文着重讨论的是水平分库分表,即不改变表结构的情况下,将表中的数据分散到不同的数据库或表中。 ##### 2.2 水平分库分表的关键问题 水平分库分表的核心在于确保每个表中的数据ID唯一,并且能够根据唯一的ID映射...

    MySQL 分库分表的实现原理及演示案例.zip

    分库分表是数据库水平扩展的一种常见策略,它通过将数据分散到多个数据库或表中,来减轻单个数据库的压力,提高系统的并发处理能力和整体性能。 **分库** 是将一个大数据库拆分成多个小数据库,每个数据库负责一...

    springmvc分库分表实际例子

    本示例“springmvc分库分表实际例子”提供了一个基于SpringMVC实现的实战项目,旨在帮助开发者了解如何在实际应用中进行数据库的分库分表操作。下面我们将详细探讨相关知识点。 1. **SpringMVC**:SpringMVC是...

    数据库分库分表

    数据库分库分表是应对大数据量和高并发场景下的重要技术策略,旨在提高数据库系统的性能、可用性和可扩展性。随着互联网应用的发展,单个数据库往往难以承受日益增长的数据量和用户访问压力,这时就需要采用分库分表...

    47_来来来!咱们聊一下你们公司是怎么玩儿分库分表的?.zip

    分库分表是一种常见的数据库垂直切分和水平切分方法,其目标是解决单个数据库因数据量过大或访问压力过高而导致的性能瓶颈问题。垂直切分是根据业务功能将表拆分成不同的数据库,而水平切分则是按照一定的规则(如...

    数据库分库分表的技术演进与最佳实践.docx

    数据库分库分表的技术演进与最佳实践 在移动互联网时代,海量数据的产生对数据库的存储和查询提出了很大的挑战。面对如此庞大的数据量,单一的数据库表已经无法满足需求,而数据库分库分表技术则是解决这个问题的...

    spring动态数据源+mybatis分库分表

    "spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...

    Oracle分库分表分区学习日志.docx

    水平切分分为库内分表和分库分表,根据表内数据的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只能包含一部分数据。 三、分表与分区的差别 分表是将一张大表的多个字段拆分成几张小表...

Global site tag (gtag.js) - Google Analytics