数据分区与数据复制

分区的目的一般是提高可扩展性、容错性和集群吞吐,同一个分区会在多个节点中都有副本。

  • 容错性:一个节点挂掉,则这个节点上的分区,在其他节点上都有副本,可以查询其他的节点
  • 可扩展性:新增节点时,会有多个节点把自己的部分数据给新的节点,这些节点传输的数据比较少
  • 提高集群吞吐:数据和查询复杂会均匀的分配在所有的节点上

键-值数据的分区

一般来说,数据分区都是通过特定的key来检索对应的value,因此k-v分区是最主流的方式。

关键字区间分区
每个分区负责一个或者多个关键字区间,一般根据关键字区间值的数量和分区的个数决定。分区内部的关键字可以按照字典序等排列。这种方式的索引效率很高;缺点在于,某些访问模式下,一些key会成为热点,导致负载不均衡。

关键字哈希值分区
每个key对应一个唯一的hash值,然后通过对hash值取余等,映射到对应的分区上。优点在于可以均匀的分配key到对应的区间上,但是丧失了区间查询的特性。mint存储就是这种模式,不过每个分区都有多个对等的副本。

注意一致性Hash技术

组合索引分区
综合关键字&Hash分区的特性

负载倾斜和热点问题
某些情况下,会存在部分key的热点问题,这种一般在应用层解决。比如微博的大v有很多粉丝等。这种情况下,简单的技术是,对关键字的开头或者结尾添加一个随机数,这样写的时候,就可以把key均匀的分布到不同的节点中;但是缺陷是,查询的时候需要查询10N10^N10N个关键字,NNN是关键字的位数。

分区与二级索引

二级索引:对于非主键的内容建立的索引。二级索引带来的挑战主要是它们不能规整的映射到分区中。

基于文档的二级索引技术,mongodb等在使用,暂时不做深入研究,基本理念是

基于词条的二级索引分区
对于每个分区,建立对应的词条索引,然后异步更新对应的索引。

kv模型很少涉及到二级索引。

分区再平衡

背景:

  1. 查询压力增大,需要更多的机器分担负载
  2. 存储空间需求增加,需要更多的存储介质
  3. 节点可能出现故障,需要其他节点来接管当前的节点

分区再平衡的要求:

  1. 负载、存储&读写请求等,需要更加均匀地分布在集群地节点中
  2. 再平衡地过程中,集群应该正常提供服务
  3. 避免不必要的迁移,加快速度,减少对网络和磁盘IO的影响

之前介绍的取模策略,虽然简单,但是对动态分区再平衡不友好。因为一旦机器的总数发生变化,会导致Hash发生偏移,涉及到大量的数据迁移。

给出几个减少数据迁移的方法,分别介绍。

固定数量的分区
在创建集群的时候,确定总的分区个数,比如说是1000。假设集群有10节点,那么每个节点会分担100个分区的存储。如果新增加一个1节点,那么每个节点会分给新的节点部分分区,直到全局再平衡。

该策略的局限性:

  1. 在开始的时候,就需要固定好分区的总数。如果业务要求的分区是高度不确定的,那么该方式不容易确认分区数量
  2. 每个分区的size需要均匀,如果有分区过大或者过小,则加重再平衡的负担

动态分区
HBase的方式,分区先分配给一个节点,当分区的数据超过一个可配置的参数值时,其拆分成两个分区,每个分区承担一半的数据量。如果涉及到大量的分区删除,则会合并有关的分区。具体参考HBase的方式。

请求路由

一般这属于服务发现的问题,借助zk&etcd等都可以实现。具体技术参考zookeeper等的技术手册即可。

数据密集型应用系统设计--数据分区相关推荐

  1. 数据密集型应用系统设计--数据存储与检索

    数据结构 追加型数据库和哈希索引 数据库最简单的形式,是追加型的方式: 写入数据直接追加到文件尾部,O(1)复杂度 读取数据从文件头遍历,获取最新的数据 这种数据库,没有删除操作,所有的数据都是追加性 ...

  2. 数据密集型应用系统设计--数据复制

    简介 引入数据复制的原因: 数据距离用户更近,让用户访问延迟降低 提高容错机制,某个节点坏掉后,其备份节点仍然能提供服务 负载扩展到多台机器,提高吞吐量 复制技术的真正难点在于如何处理持续变更的数据. ...

  3. 豆瓣评分 9.7 的神书:《数据密集型应用系统设计》

    我最近在读一本好书<数据密集型应用系统设计>(也被叫做 DDIA).这真是本相见恨晚的神书. 这是怎样一本神书?豆瓣评分高达 9.7 分! 什么是「数据密集型应用系统」? 当数据(数据量. ...

  4. 数据密集型应用系统设计-第七章分布式系统的麻烦-笔记

    这阵子在看数据密集型应用系统设计书籍,自己把书籍比较重要的内容整理出来,基本一天一更,请感兴趣的朋友多多关注! 整个系列会在这几天都发布出来,可以关注一下 链接: 数据密集型应用系统设计-笔记. 文章 ...

  5. 数据密集型应用系统设计 [Designing Data-Intensive Applications]

    作者:[美] Martin Kleppmann(马丁·科勒普曼) 著,赵军平 吕云松 耿煜 李三平 译 出版社: 中国电力出版社 出版时间:2018-09-01 数据密集型应用系统设计 [Design ...

  6. Designing Data-Intensive Application《数据密集型应用系统设计》笔记

    Designing Data-Intensive Application 中译<设计数据密集型应用>又名<数据密集型应用系统设计>,我看的是冯若航在gitbook开源的翻译版本 ...

  7. 《数据密集型应用系统设计》读书笔记——第一部分 数据系统基础

    第一部分 数据系统基础 第1章 可靠.可扩展与可维护的应用系统 当今许多新型应用都属于数据密集型,而不是计算密集型.对于这些类型应用,CPU的处理能力往往不是第一限制性因素,关键在于数据量.数据的复杂 ...

  8. 《数据密集型应用系统设计》读书笔记——数据系统基础

    因为个人兴趣,想学学分布式方面的知识,然后找到了这本<数据密集型应用系统设计>,确实非常的不错,无论对于以前的工程还是现在的科研都有启迪和感悟,所以就写份读书笔记记录一下,里面提到的知识非 ...

  9. 数据密集型应用系统设计——笔记

    本篇章内容为阅读<数据密集型应用系统设计>一书的读书笔记. 作为个人成长学习使用,同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放,芳香四溢,在风中舞蹈! 写在前 ...

最新文章

  1. html5调用系统声音1s响一次_HTML5声音录制/播放功能的实现代码
  2. 让Linux系统开机速度更快的方法
  3. Linux系统巡检shell脚本
  4. VMware虚拟机安装centos
  5. CentOS thrift python demo
  6. log双线性模型log-bilinear model简单概括
  7. ios如何获取gps坐标(定位第二节)
  8. POJ 1151 扫描线 线段树
  9. drools 7.x 加载指定的决策表
  10. webpack 实用配置总结
  11. preg_match 参数获取两个_摄像相机标定到底是啥?标定完成得到的参数有什么用?...
  12. 零基础如何学习C语言
  13. ad转3d视图快捷键_AD 常用快捷键
  14. ar面部识别_AR人脸识别数据集
  15. 基于 GARCH-CoVaR 方法的中国 A 股行业 关联网络风险溢出动态研究
  16. python绝对值_如何在Python中获得数字的绝对值?
  17. html5字幕提取软件,VideoSubFinder(提取视频字幕软件)
  18. 什么是支付系统,一分钟带你了解
  19. 微信公众号开发引导用户关注公众号
  20. 什么是SFP光模块?

热门文章

  1. AcWing327.玉米田(状压DP)题解
  2. 最大子矩阵(前缀和+贪心)
  3. LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation 论文笔记
  4. 关于TortoiseGit汉化包装了,但仍然是英文菜单的问题记录
  5. 实验8.1 链表类的定义与实现
  6. c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数
  7. 剑指offer——21.调整数组顺序使奇数位于偶数前面
  8. MVC的Controller-Action布局:单独的创建/编辑页面还是创建/编辑/查看一体的页面?...
  9. Flex显示图片的常用方式
  10. vue 结合swiper插件实现广告公告上下滚动的效果