一种以ID特征为依据的数据分片(Sharding)策略

假如您有一个应用程序,随着业务越来越有起色,系统所牵涉到的数据量也 就越来越大,此时您要涉及到对系统进行伸缩(Scale)的问题了。一种典型的 扩展方法叫做“向上伸缩(Scale Up)”,它的意思是通过使用更好的硬件来提 高系统的性能参数。而另一种方法则叫做“向外伸缩(Scale Out)”,它是指 通过增加额外的硬件(如服务器)来达到相同的效果。从“硬件成本”还是“系 统极限”的角度来说,“向外伸缩”一般都会优于“向上伸缩”,因此大部分上 规模的系统都会在一定程度上考虑“向外”的方式。由于许多系统的瓶颈都处在 数据存储上,因此一种叫做“数据分片(Database Sharding)”的数据架构方 式应运而生,本文便会讨论这种数据架构方式的一种比较典型的实现方式。

简介

数据分片,自然便是将整体数据分摊在多个存储设备(下文统称为“数据分 区”或“分区”)上,这样每个存储设备的数据量相对就会小很多,以此满足系 统的性能需求。值得注意的是,系统分片的策略有很多,例如常见的有以下几种 :

根据ID特征:例如对记录的ID取模,得到的结果是几,那么这条记录就放在 编号为几的数据分区上。

根据时间范围:例如前100万个用户数据在第1个分区中,第二个100万用户数 据放在第2个分区中。

基于检索表:根据ID先去一个表内找到它所在的分区,然后再去目标分区进 行查找。

……

在这些数据分片策略之中没有哪个有绝对的优势,选择哪种策略完全是根据 系统的业务或是数据特征来确定的。值得强调的是:数据分片不是银弹,它对系 统的性能和伸缩性(Scalability)带来一定好处的同时,也会对系统开发带来 许多复杂度。例如,有两条记录分别处在不同的服务器上,那么如果有一个业务 是为它们建立一个“关联”,那么很可能表示“关联”的记录就必须在两个分区 内各放一条。另外,如果您重视数据的完整性,那么跨数据分区的事务又立即变 成了性能杀手。最后,如果有一些需要进行全局查找的业务,光有数据分片策略 也很难对系统性能带来什么优势。

数据分片虽然重要,但在使用之前一定要三思而后行。一旦踏上这艘贼船, 往往不成功便成仁,很难回头。在我的经验里,一个滥用数据分片策略而事倍功 半的项目给我留下了非常深刻的印象(当然也有成功的啦),因此目前我对待数 据分片策略变得愈发谨慎。

那么现在,我们便来讨论一种比较常见的数据分片策略。

策略描述

这里我先描述一个极其简单的业务:

系统中有用户,用户可以发表文章,文章会有评论

可以根据用户查找文章

可以根据文章查找评论

那么,如果我要对这样一个系统进行数据分片又该怎么做呢?这里我们可以 使用上面提到的第一种方式,即对记录的ID取模,并根据结果选择数据所在的分 区。根据后两条业务中描述的查询要求,我们会为分区策略补充这样的规则:

某个用户的所有文章,与这个用户处在同一数据分区内。

某篇文章的所有评论,与这篇文章处在用一数据分区内。

您可能会说,似乎只要保证“相同用户文章在同一个数据分区内”就行了, 不是吗?没错,不过我这里让文章和用户在同一个分区内,也是为了方便许多额 外的操作(例如在关系数据库中进行连接)。那么假设我们有4个数据分区,那 么它们内部的条目可能便是:

分区0 分区1
User 4

Article 8

Article 12

Comment 4

Comment 16

User 12

Article 4

User 1

Article 5

Article 9

Comment 13

Comment 17

User 5

Article 13

分区2 分区3
User 2

Article 10

Article 14

Comment 6

Comment 10

User 10

Article 4

User 7

Article 7

Article 11

Comment 3

Comment 15

User 11

Article 4

时间: 2024-08-04 01:19:54

一种以ID特征为依据的数据分片(Sharding)策略的相关文章

sql-2个名字一样,但是id不一样的数据,想合并成一条,java该怎么写?

问题描述 2个名字一样,但是id不一样的数据,想合并成一条,java该怎么写? 图片说明 如图,这条数据放在一个list里面,想把名字一样的2条数据合并成一条,即变成 1,2 机加工 13 机加工(立式) 二条变成一条数据,中间用,分割id. 请问应该怎么写java语句或者sql语句?! 解决方案 你这算什么数据,根本就是文本,毫无规律可言. 你人知道1 2 13是id, 机加工是名字,但是计算机哪里知道.你先得用正则表达式或者什么办法,把你的字符串转换成准确无误的两列,名字.id,并且去掉乱七

对象-SSH中怎么实现根据id删除一条数据?求大神!!

问题描述 SSH中怎么实现根据id删除一条数据?求大神!! 如题,小白一枚,主要是this.getHibernateTemplate().delete();方法只能传对象,个人感觉太复杂,自己如果写一个删除不用它里面的方法应该怎么写? 解决方案 public void delete(int id){ String hql="delete Person as p where p.id=?"; Query query=session.createQuery(hql); query.setI

mysql实现合并同一ID对应多条数据的方法_Mysql

本文实例讲述了mysql实现合并同一ID对应多条数据的方法.分享给大家供大家参考,具体如下: 如 : CREATE TABLE `c_classuser_tab` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Classid` int(11) DEFAULT NULL, `Username` varchar(100) DEFAULT NULL, `studentid` varchar(100) DEFAULT NULL, `College` varchar(1

spring mvc-在springmvc中做一个根据id删除一条数据的功能,出现500问题,代码如下,请大神指教

问题描述 在springmvc中做一个根据id删除一条数据的功能,出现500问题,代码如下,请大神指教 Model层代码 package com.pengyou.model; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Generat

一种基于NoSQL的地图瓦片数据存储技术

一种基于NoSQL的地图瓦片数据存储技术 陈超 ,王亮,闫浩文,仇阿根,李玉祥,朱芳菲 本文首先介绍了NoSQL(非关系型数据库)的起源与发展,对比其与关系型数据库的优缺点,提出了基于NoSQL的地图瓦片数据存储策略,通过实验对比分析了面向文档型的NoSQL数据库产品Mongo DB与SQL Serv-er 2000在瓦片入库与并发访问性能上的差异.研究结果表明,Mongo DB在海量空间数据存储与并发访问方面具有明显的高效性. 一种基于NoSQL的地图瓦片数据存储技术

四种数据库随机获取10条数据的方法_Access

四种数据库随机获取10条数据的方法 SQL Server: 复制代码 代码如下: SELECT TOP 10 * FROM T_USER ORDER BY NEWID() ORACLE: 复制代码 代码如下: SELECT * FROM (SELECT * FROM T_USER ORDER BY DBMS_RANDOM.RANDOM()) WHERE RONUM <= 10 MySQL: 复制代码 代码如下: SELECT * FROM T_USER  ORDER BY  RAND() LIM

NaEPASC:一种新颖且高效的云数据公开审计机制

NaEPASC:一种新颖且高效的云数据公开审计机制 研究目的:随着云计算的广泛深入,越来越多用户选择云来存储数据.由于用户在本地可能不再保存任何数据副本,云中数据的完整性难以有效判定.另外,同一用户可能需要存储多份数据到云中,因此简化密钥管理也成为一个关键问题.本文尝试设计一种满足云存储环境的.基于身份的数据完整性验证机制,以检测云中数据的正确性. 创新要点:参考基于身份的签名机制,提出一种基于身份的数据完整性验证模型,包括私钥生成服务器.用户.云存储服务器及第三方审计.该机制不仅能够有效检测数

分片(Sharding)的全局ID生成

 这里最后redis生成ID的文章已经过时,新的请参考: http://blog.csdn.net/hengyunabc/article/details/44244951 前言 数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求: 不能有单点故障. 以时间为序,或者ID里包含时间.这样一是可以少一个索引,二是冷热数据容易分离. 可以控制ShardingId.比如某一个用户的文章要放在同一个分片内,这样查询效率高,修

《BI项目笔记》增量ETL数据抽取的策略及方法

原文:<BI项目笔记>增量ETL数据抽取的策略及方法 增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将业务系统中的变化数据按一定的频率准确地捕获到:性能,不能对业务系统造成太大的压力,影响现有业务.目前增量数据抽取中常用的捕获变化数据的方法有:a.触发器:在要抽取的表上建立需要的触发器,一般要建立插入.修改.删除三个触发器,每当源表中的数据发生