数据分区的策略

在之前的数据复制当中,我们有一个前提就是数据量不会很大,但是随着公司的发展,再加上埋点等各种数据收集的发展,数据量会爆发式的增长,那么单台服务器很难处理这么庞大的数据了。数据必须分布在各个服务器上,这就是数据分区(partition),在不同的数据系统有着不同的叫法,比如在MongoDB、Elasticsearch、SolrCloud被称为shard,HBase被称为region,Cassandra和Riak被称为vnode,名称虽多但是本质确实一样的。当数据分布在各个服务器时,对性能也会有很大的提高,因为对数据的读取压力会由多台服务器分担。在下面的讨论中,我们会先讨论如何数据分区的方法,再去看看数据热点的rebalancing,最后会讨论如何将请求发送到正确的partition上。

那么进入正题了。

首先来看看主流的数据分区的方法,可以分为两大类,一个是基于主键,另一个则关于索引。良好的数据分区方法可以有效避免数据热点的产生,所以首先我们先来讨论下如何根据主键进行分区。

1.最容易想到的就是根据key range对数据进行处理,例如有一堆书,我们可以根据数名的拼音的首字母开头对书进行分类,或者是根据书的类目,例如历史,科学之类的。对于查询而言,我们会更容易的根据key range的分类对数据进行定位。但是不恰当的range选择会使得数据热点诞生的更难以察觉,例如自然科学的数目显然会比大众读物少,那么对于存放大众读物的服务器压力会更大。

2.那么我们如何避免数据热点呢?这时我们就会想到hash函数,在理论上来说合理的划分hash值的range可以使数据平均,最出名的方法就是一致性hash。同样的我们失去了数据的有序性,也就是对于范围查找的效率就不会那么令人满意了。

3.基于上面两点,很多数据库在设计时会考虑key和hash值的综合处理,保证在某一主题下的相对有序和数据平均。

讨论完了数据分区的方法,我们再来看看索引如何分区到对应的服务器。

1.我们可以把索引放置在对应的服务器,每个服务器存储着对应分区的索引,在查询的时候会把请求发到存储着分区的所有服务器,等待着结果的返回。(local index)

2.我们把索引全部整合在一起,只要将查询发布到对应的索引的存储服务器,那么我们就可以立马知道数据存储在哪些服务器上。(global index)

简单看完数据分区的方法,我们来看看随着数据压力的增长如何对数据进行rebalancing。

1.最简单暴力的方式就是对到来的数据进行hash,根据hash值/n余数的放到对应的分区。简单是简单了,但是一个节点坏了,就意味着需要重新运算和数据迁移。在生产这是绝对不允许的。

2.我们可以给在每个节点存储很多分区,每个分区固定大小,对于数据的分配可以根据分区的大小就将重新分配到新的节点,而不需要大量移动数据了。但是对于分区的大小就需要有慎重考虑了,过大的分区会使得rebalancing和数据回复需要支付昂贵的代价,太小就会overhead。

3.对于固定大小的分区,那么我们可以选择由数据系统进行动态分区,当分区大小超过某种程度时,会自动分裂成两块。动态分区最大的好处就是可以是的分区大小很好的适应服务器存储。

最后我们看看如何在数据分区的情况下处理数据请求。我们可以抽象为三种方法:

1.允许client可以发送请求给任何一个节点,每个节点存储着本身分区的数据以及其它节点存储数据的信息。

2.先将数据发送给一个中间件,中间件存储着各个节点的信息,由中间件将数据请求分发到对应的节点。

3.可能最不招人喜欢的方法就是client存储着各个节点的信息,client可以将数据直接发送到对应的节点。

这样我们就简单的讨论完了数据分区的各个方面,不过我们在数据复制中遇到的问题在分区中依然会存在,那就不讨论了。

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2018-02-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

操作系统核心原理-2.一些基本概念

  从概念上讲,计算机的结构是总线型的:布置一根总线将各种硬件设备挂在总线(Bus)上。

815
来自专栏杨建荣的学习笔记

Greenplum数据仓库迁移小记

迁移无小事,所以从开始计划将公司的Greenplum集群迁移,到最后落地,整个过程虽然说不上是波折,但是也算是有不少的故事,各种准备和协调。

2253
来自专栏java一日一条

测试代码时你会犯的 11 个错误

我遇到的大多数开发人员都不怎么热衷于测试。有些会去做测试,但大多数都不测试,不愿意测试,或者勉而为之。我喜欢测试,并且比起编写新的代码,愉快地花更多的时间在测试...

732
来自专栏FreeBuf

一文了解安卓APP逆向分析与保护机制

3月17日,安卓巴士全球开发者论坛在重庆举办,网易资深安全工程师钟亚平出席交流活动,并做《安卓APP逆向与保护》的演讲。在分享中,他介绍了 Android Ap...

2293
来自专栏高性能服务器开发

微信、陌陌等著名IM软件设计架构详解

https://blog.csdn.net/justinjing0612/article/details/38322353

4173
来自专栏JavaEdge

分布式MySQL集群方案

1.7K6
来自专栏阮一峰的网络日志

全文Feed的终极解决方案

但是,世界上的大部分Feed,都是摘要Feed,甚至是标题Feed。我们只好自己动手,制作全文Feed。

1772
来自专栏大数据文摘

技术连载:LinkedIn大数据后台如何运作-1

17011
来自专栏hotqin888的专栏

golang语言的办公工作流的包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

2472
来自专栏QQ音乐前端团队专栏

自己动手打造前端性能监控系统

我们从三个各方面,前端上报,数据收集和入库,数据展示来介绍了如何打造一个测速系统。

1.1K10

扫码关注云+社区

领取腾讯云代金券