分布式存储数据库的Key的随机分布(RP)和顺序分布(OPP)
在分布式存储数据库的世界中,无论是基于Key/Value的数据库还是Column Base(比如HBase)的数据库,都有一个重要的因子------Key,或者叫RowKey。我们总是根据Key来快速的获取存储的数据。毫不夸张的说,Key是读数据的基础。
对于Key的存储,有两种截然不同的分布方式,我们称之为:随机分布(RP)和顺序分布(OPP)
RP和OPP之间并没有绝对的优劣,不能直接断定谁比谁好,只能说是否适合当前的业务场景。在这篇文章中我们希望能够讨论一下两种方式的优劣:
OPP
我们先来讨论OPP,因为我们可能更喜欢这种方式,而且这种存储方式思想比较传统和简单。*OPP的意思是顺序分布,Key在分布式节点中是严格排序的。*比如200一定是位于100和300之间的。这一特性带来了以下的优缺点。
优点:
1. 容易分片。*我们能很容易的将大量的数据分成N片,只需要知道每一片的StartKey和EndKey。根据分片表我们可以很容易的定位任何一个Key。*分片对于分布式系统来说是一个非常重要的功能,它意味着我们能不能将大量的数据分而治之(分治算法,二分查找等算法就可以使用了)。
2. *快速区间扫描。*这可能是OPP对于RP的一个绝对优势。比如给我一个StartKey和一个EndKey,我可以给你扫出区间内的所有数据。这种方式在很多应用中都会用到,但RP却无法快速完美的做到。
举个例子,有一个问题跟踪系统每天要记录大量的Log,每一条Log的Key是当时的时间。有一天问题发生了,管理员希望查看当天所有的Log。OPP很容易做到这件事,它从开始点一条一条往下读,直到结束点。RP就傻眼了,当天的Log被散落在各个节点中,更严重的是它不知道当天有多少Log。它只能作出如下回答:
1) 告诉我一个具体时间,我给你一条Log.
2) 等等我,我要扫描全部的Log,之后我会给你一份当天Log的Report.
缺点:
1. 目前我只想到了负载均衡问题。
对于这个缺点我们从“写入数据”和“读取数据”两个方面来看:
1. 写入数据
有一种写入方式可以让基于OPP的分布式数据库完全发挥不了威力。就是刚才那个记Log的系统,将时间作为Key,连续不断的写入。由于时间在不断增长,每一次写入都添加在数据的末尾。这意味着什么?对于分片系统来说只有最后一片在不断增加,也就是说只有管理最后一片的节点在工作,其它节点完全干瞪眼帮不上忙。这时候分布式系统退化成了单节点的系统,再也没什么优势可言。
2. 读取数据
假设我们有一批Key需要读取数据。如果使用RP,无论这些Key是怎样的内容,读取的操作都会被很均匀的分布到各个节点。但对于OPP来说如果不凑巧这一批Key是连续的,属于同一个分片,同样的事情发生了,只有一个节点在工作,其他的干瞪眼。
RP
讨论完OPP之后我们会更容易讨论RP,因为基本上RP的缺点就是OPP的优点,RP的优点敲好是OPP的缺点。RP使用Consistent Hash(一致性哈希)解决了分片问题,从此以后负载均衡成了RP最大的资本,无论是读还是写,RP总是能充分的使用每个节点。同样区间扫描依然是RP的致命伤。
了解完基本概念之后我们来看看一些经典数据库的选择:
HBase:毫无疑问HBase是OPP的忠实支持者。有了HDFS的支持,HBase不在担心数据冗余问题,大胆的使用OPP来构建系统。对于负载均衡的问题,HBase的回答是:对不起,我们就是这个样子的!
Dynamo:讨论Dynamo可能稍稍有点过时了,但他毕竟是Cassandra的前身,奠定了很多基础的思想。Dynamo可以说是RP的忠实支持者,在Amazon系统中的成功应用使得它坚信基于Key/Value的系统可以解决绝大多数问题。对于RP的区间扫描问题,Dynamo的回答是:开什么玩笑,你能在HashMap中扫描区间吗?
Cassandra,这个可以说是近两年的后起之秀了,继承了Dynamo和BigTable的优点。但在RP还是OPP的选择上它却模棱两可。它两种方式都提供,爱用啥用啥,但只能选一样哦。
扯了这么多,估计大家也都明白了,用RP还是OPP关键看应用,也许把RP和OPP分开,各弄一套,适合不同应用才是最佳选择。
分布式存储数据库的Key的随机分布(RP)和顺序分布(OPP)的更多相关文章
- 如何从mysql数据库中取到随机的记录
如何从mysql数据库中取到随机的记录 一.总结 一句话总结:用随机函数newID(),select top N * from table_name order by newid() ----N是一个 ...
- (转)Gamma分布,Beta分布,Multinomial多项式分布,Dirichlet狄利克雷分布
1. Gamma函数 首先我们可以看一下Gamma函数的定义: Gamma的重要性质包括下面几条: 1. 递推公式: 2. 对于正整数n, 有 因此可以说Gamma函数是阶乘的推广. 3. 4. ...
- 161104、NoSQL数据库:key/value型之levelDB介绍及java实现
简介:Leveldb是一个google实现的非常高效的kv数据库,能够支持billion级别的数据量了. 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计.特别是LSM算法.LevelDB ...
- postgresql数据库primary key约束/not null约束/unique约束及default值的添加与删除、列的新增/删除/重命名/数据类型的更改
如果在建表时没有加primary key约束.not null约束.unique约束.default值,而是创建完表之后在某个字段添加的话 1.primary key约束的添加与删除 给red_pac ...
- 使用SQL语句从数据库一个表中随机获取数据
-- 随机获取 10 条数据 SQL Server:SELECT TOP 10 * FROM T_USER ORDER BY NEWID() ORACLE:SELECT * FROM (SELECT ...
- Redis数据库之KEY的操作与事务管理
目的 了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,主要培养对KEY的操作命令运用的能力.重点掌握对KEY信息的管理.事务常规管理和事务回滚操作. KEYS命令的练习,对K ...
- Oracle数据库-primary key/foreign key和references关系
主要介绍一下个人对主键(primary key).外键(foreign key).候选键(Candidate key).超键(super key).references的总结 概念: 主键:用户选择元 ...
- 数据库表A中随机X条数据满足N条件的数据插入到表B中
select * into c FROM a TABLESAMPLE (5 PERCENT) select top 5 per * into c from a order by newid() se ...
- 解决Code First MySql数据库 Specified key was too long; max key length is 767 bytes异常
需要给DbContext加上如下特性: [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public cla ...
随机推荐
- Asp.net Mvc中利用ValidationAttribute实现xss过滤
在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...
- 工作框架各种使用整理 -- 展示数据列表并做update
<!--ProductCategory.xml--> <?xml version="1.0" encoding="UTF-8"?> &l ...
- SharePoint 读取 Site Columns 的数据并绑定到DropdownList
public void GetSiteColumns(DropDownList ddl, String siteColumn) { var fields = new SPSite(ProjectCon ...
- Hibernate原生SQL映射MySQL的CHAR(n)类型到String时出错
今天在用Hibernate通过原生SQL和ResultTransformer映射时,出现数据类型不匹配的错误.但是通过Entity映射,没有问题.在网上找了好多答案,终于解决了. 核心代码: Stri ...
- android 入门笔迹(1)
环境搭建JDK,JRE,Android SDK,ADT,Eclipse,安卓模拟器AVD xml控制UI界面 Java代码控制UI界面 XML与Java混合控制UI界面 UI:userinter ...
- iOS开发小技巧--定时器的使用技巧
一.定时器的使用技巧 -- 定义好了定时器后,添加两个方法,一个是添加定时器的方法,另一个是移除定时器的方法. 使用的时候也要注意,一定先移除之前的timer,然后再添加timer
- 100735G
很明显,我们构造出一个串后,无非就是两个结果:最长的是黑的,最长的是白的,因此选两个中小的就可以了 #include<iostream> using namespace std; int ...
- Oracle-函数Decode进行多值判断
decode函数比较表达式和搜索字,如果匹配,返回结果:如果不匹配,返回default值:如果未定义default值,则返回空值 Decode函数的语法结构如下: decode (expression ...
- node.js-概念
官方网站:http://nodejs.cn/ 1.Node 是一个服务器端 JavaScript 解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不 ...
- js-处理千分符
<html> <head> <title> JS千分位处理 </title> </head> <script> functi ...