- 浏览: 649827 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (820)
- java开发 (110)
- 数据库 (56)
- javascript (30)
- 生活、哲理 (17)
- jquery (36)
- 杂谈 (15)
- linux (62)
- spring (52)
- kafka (11)
- http协议 (22)
- 架构 (18)
- ZooKeeper (18)
- eclipse (13)
- ngork (2)
- dubbo框架 (6)
- Mybatis (10)
- 缓存 (28)
- maven (20)
- MongoDB (3)
- 设计模式 (3)
- shiro (10)
- taokeeper (1)
- 锁和多线程 (3)
- Tomcat7集群 (12)
- Nginx (34)
- nodejs (1)
- MDC (1)
- Netty (7)
- solr (15)
- JSON (8)
- rabbitmq (32)
- disconf (7)
- PowerDesigne (0)
- Spring Boot (31)
- 日志系统 (6)
- erlang (2)
- Swagger (3)
- 测试工具 (3)
- docker (17)
- ELK (2)
- TCC分布式事务 (2)
- marathon (12)
- phpMyAdmin (12)
- git (3)
- Atomix (1)
- Calico (1)
- Lua (7)
- 泛解析 (2)
- OpenResty (2)
- spring mvc (19)
- 前端 (3)
- spring cloud (15)
- Netflix (1)
- zipkin (3)
- JVM 内存模型 (5)
- websocket (1)
- Eureka (4)
- apollo (2)
- idea (2)
- go (1)
- 业务 (0)
- idea开发工具 (1)
最新评论
-
sichunli_030:
对于频繁调用的话,建议采用连接池机制
配置TOMCAT及httpClient的keepalive以高效利用长连接 -
11想念99不见:
你好,我看不太懂。假如我的项目中会频繁调用rest接口,是要用 ...
配置TOMCAT及httpClient的keepalive以高效利用长连接
第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
随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的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
发表评论
-
mysql列转行函数GROUP_CONCAT
2024-12-23 19:42 65mysql列转行函数是什么 GROUP_CONCAT(expr ... -
mysql字段限定在某一范围取值
2023-12-15 15:02 441mysql字段限定在某一范围取值 -
mysql查询动态行转动态列,并使用mybatis执行
2023-04-02 22:56 744mysql查询动态行转动态列,并使用mybatis执行 My ... -
MySQL 正则表达式 通过正则匹配字符、替换特定字符、返回特定字符
2022-12-29 14:54 428MySQL 正则表达式 通过正则匹配字符、替换特定字符、返回特 ... -
MySQL InnoDB update锁表问题Record Locks
2022-12-20 12:26 322MySQL InnoDB update锁表问题Record L ... -
oracle 使用flashback(闪回)恢复误删除的数据 或 误删除的表
2022-09-02 19:44 315oracle 使用flashback(闪回)恢复误删除的数据 ... -
数据库面试题
2022-04-06 21:48 249分布式事务解决方案之TCC 分布式事务解决方案——Seata ... -
面试题
2022-02-11 11:38 286Java面试题目大汇总 数据库事务的隔离级别从低到高的顺序依 ... -
mysql相关问题 WAL机制、crash safe如何实现、redo log作用
2019-07-16 23:43 606https://www.jianshu.com/p/cd914 ... -
MySQL -- 内存使用监控详解
2019-06-12 13:59 692第一步: 配置performance_schema使它开启内存 ... -
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregate
2018-01-01 12:17 1318https://www.cnblogs.com/lonelyw ... -
MySQL使用profile分析SQL执行状态
2017-08-24 09:49 579http://blog.csdn.net/staricqxyz ... -
blocked because of many connection errors; unblock with 'mysqladmin flush-hosts
2017-06-21 16:56 741错误:Host is blocked becaus ... -
MySQL半同步复制配置
2017-05-08 14:14 786MySQL半同步复制配置 http://blog.csdn.n ... -
mysql.sock的作用
2017-04-18 11:29 547Mysql有两种连接方式: (1),TCP/IP ... -
Linux下源码安装MySQL 5.6
2017-04-16 20:30 667http://blog.sina.com.cn/s/blog_ ... -
docker中mysql初始化及启动失败解决办法
2017-04-12 20:56 1872http://blog.csdn.net/rznice/art ... -
MySQL数据库自动生成并修改随机root密码的脚本
2017-03-25 15:10 1057http://blog.csdn.net/yumushui/a ... -
centos6.5下yum安装mysql5.5和php5.6
2017-03-22 14:34 569http://www.cnblogs.com/SQL888/p ... -
Linux平台卸载MySQL和PHP
2017-03-22 13:58 441http://www.cnblogs.com/kerrycod ...
相关推荐
### 分库、数据库水平切分实现原理解析 #### 一、引言 随着互联网的飞速发展,海量数据的存储与访问已成为大型系统设计的关键挑战之一。在高并发、大数据背景下,传统的单体数据库已难以满足业务需求,特别是在...
本文将重点介绍水平切分中的关键技术——分库、分表、主从复制、集群及负载均衡等,探讨这些技术的实现原理及其应用场景。 #### 二、基本原理与概念 ##### 2.1 数据切分概述 数据切分(Data Sharding)是一种常见...
【数据库水平切分实现原理解析】 随着互联网的发展,海量数据的存储与访问已成为系统设计的关键挑战。面对每天数十亿的页面访问量(PV),数据库的高负载问题日益突出,严重影响了系统的稳定性和扩展性。水平切分...
2. **分库分表原理**:分库分表是数据库水平扩展的一种策略,通过将一个大表的数据分散到多个数据库或表中,以减轻单一数据库的压力,提高系统的读写性能和并发能力。Sharding-JDBC提供了基于哈希、范围、精确匹配等...
标题"sharding-jdbc之——分库分表实例完整源码.zip"提到了"sharding-jdbc",这是一个用于Java的分布式数据库中间件,它提供了分库分表的功能,帮助解决大数据量下的性能瓶颈问题。"分库分表"是将一个大表的数据分散...
### MySQL 数据库水平切分的实现原理解析 #### 第1章 引言 随着互联网技术的迅猛发展,海量数据的存储与访问已成为系统设计的关键挑战之一。在高流量应用场景中,例如大型电商平台或社交网络平台,每日数十亿次页面...
数据库分库分表的几种方式主要包括垂直分库、垂直分表、水平分库和水平分表。垂直分库是按照业务的不同进行数据库的分割,每个数据库只包含部分业务的数据;垂直分表是将一个表按照字段划分成多个表,通常按照数据的...
### 单KEY业务,数据库水平切分架构实践 #### 用户前台侧:“建立非uid属性到uid的映射关系”最佳实践 在面对大量的用户数据时,为了提高数据库系统的响应速度和处理能力,需要采取合适的数据库水平切分策略。水平...
数据库分库分表是应对大数据量和高并发场景下的常用策略,目的是为了减轻单个数据库的负担,提高系统的整体性能和稳定性。随着互联网业务的发展,单个关系型数据库的存储容量、连接数和处理能力往往难以满足需求。当...
工具结合这两者,能够迅速生成精确的SQL脚本,使数据库管理员能够轻松地实现分库分表架构。 在最新的版本更新中,该工具新增了支持分库不分表的脚本生成功能,满足了那些只需要通过数据库级别的分片来解决性能问题...
分库分表是一种常见的数据库垂直切分和水平切分策略,用于解决单一数据库性能瓶颈问题。垂直切分是根据业务逻辑将数据分散到多个数据库中,通常依据表的相关性或访问频率来进行。而水平切分则是按照某个字段(如用户...
ShardingJDBC作为一个轻量级的Java库,能够在不修改现有数据库架构和业务代码的情况下,仅通过配置即可实现分库分表。它具备良好的兼容性,可以与任何Java应用无缝集成,包括但不限于Spring、MyBatis等。在本项目中...
"spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...
本示例“springmvc分库分表实际例子”提供了一个基于SpringMVC实现的实战项目,旨在帮助开发者了解如何在实际应用中进行数据库的分库分表操作。下面我们将详细探讨相关知识点。 1. **SpringMVC**:SpringMVC是...
本文着重讨论的是水平分库分表,即不改变表结构的情况下,将表中的数据分散到不同的数据库或表中。 ##### 2.2 水平分库分表的关键问题 水平分库分表的核心在于确保每个表中的数据ID唯一,并且能够根据唯一的ID映射...
数据库分库分表是为了解决数据库单库单表承载数据量过大而导致的性能瓶颈问题,其工作原理是将数据按照特定的规则分布存储在多个数据库或表中,以此达到提升性能、可扩展性和可用性的目的。分库分表在Java中的实现,...
分库分表是数据库水平扩展的一种常见策略,它通过将数据分散到多个数据库或表中,来减轻单个数据库的压力,提高系统的并发处理能力和整体性能。 **分库** 是将一个大数据库拆分成多个小数据库,每个数据库负责一...
数据库分库分表是应对大数据量和高并发场景下的重要技术策略,旨在提高数据库系统的性能、可用性和可扩展性。随着互联网应用的发展,单个数据库往往难以承受日益增长的数据量和用户访问压力,这时就需要采用分库分表...
分库分表是一种常见的数据库垂直切分和水平切分方法,其目标是解决单个数据库因数据量过大或访问压力过高而导致的性能瓶颈问题。垂直切分是根据业务功能将表拆分成不同的数据库,而水平切分则是按照一定的规则(如...