首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据分区的策略

数据分区的策略

作者头像
哒呵呵
发布2018-08-06 14:20:18
4510
发布2018-08-06 14:20:18
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

在之前的数据复制当中,我们有一个前提就是数据量不会很大,但是随着公司的发展,再加上埋点等各种数据收集的发展,数据量会爆发式的增长,那么单台服务器很难处理这么庞大的数据了。数据必须分布在各个服务器上,这就是数据分区(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可以将数据直接发送到对应的节点。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档