数据密集型应用系统设计--数据分区
数据分区与数据复制
分区的目的一般是提高可扩展性、容错性和集群吞吐,同一个分区会在多个节点中都有副本。
- 容错性:一个节点挂掉,则这个节点上的分区,在其他节点上都有副本,可以查询其他的节点
- 可扩展性:新增节点时,会有多个节点把自己的部分数据给新的节点,这些节点传输的数据比较少
- 提高集群吞吐:数据和查询复杂会均匀的分配在所有的节点上
键-值数据的分区
一般来说,数据分区都是通过特定的key来检索对应的value,因此k-v分区是最主流的方式。
关键字区间分区
每个分区负责一个或者多个关键字区间,一般根据关键字区间值的数量和分区的个数决定。分区内部的关键字可以按照字典序等排列。这种方式的索引效率很高;缺点在于,某些访问模式下,一些key会成为热点,导致负载不均衡。
关键字哈希值分区
每个key对应一个唯一的hash值,然后通过对hash值取余等,映射到对应的分区上。优点在于可以均匀的分配key到对应的区间上,但是丧失了区间查询的特性。mint存储就是这种模式,不过每个分区都有多个对等的副本。
注意一致性Hash技术
组合索引分区
综合关键字&Hash分区的特性
负载倾斜和热点问题
某些情况下,会存在部分key
的热点问题,这种一般在应用层解决。比如微博的大v有很多粉丝等。这种情况下,简单的技术是,对关键字的开头或者结尾添加一个随机数,这样写的时候,就可以把key均匀的分布到不同的节点中;但是缺陷是,查询的时候需要查询10N10^N10N个关键字,NNN是关键字的位数。
分区与二级索引
二级索引:对于非主键的内容建立的索引。二级索引带来的挑战主要是它们不能规整的映射到分区中。
基于文档的二级索引技术,mongodb等在使用,暂时不做深入研究,基本理念是
基于词条的二级索引分区
对于每个分区,建立对应的词条索引,然后异步更新对应的索引。
kv模型很少涉及到二级索引。
分区再平衡
背景:
- 查询压力增大,需要更多的机器分担负载
- 存储空间需求增加,需要更多的存储介质
- 节点可能出现故障,需要其他节点来接管当前的节点
分区再平衡的要求:
- 负载、存储&读写请求等,需要更加均匀地分布在集群地节点中
- 再平衡地过程中,集群应该正常提供服务
- 避免不必要的迁移,加快速度,减少对网络和磁盘IO的影响
之前介绍的取模策略,虽然简单,但是对动态分区再平衡不友好。因为一旦机器的总数发生变化,会导致Hash发生偏移,涉及到大量的数据迁移。
给出几个减少数据迁移的方法,分别介绍。
固定数量的分区
在创建集群的时候,确定总的分区个数,比如说是1000。假设集群有10节点,那么每个节点会分担100个分区的存储。如果新增加一个1节点,那么每个节点会分给新的节点部分分区,直到全局再平衡。
该策略的局限性:
- 在开始的时候,就需要固定好分区的总数。如果业务要求的分区是高度不确定的,那么该方式不容易确认分区数量
- 每个分区的size需要均匀,如果有分区过大或者过小,则加重再平衡的负担
动态分区
HBase的方式,分区先分配给一个节点,当分区的数据超过一个可配置的参数值时,其拆分成两个分区,每个分区承担一半的数据量。如果涉及到大量的分区删除,则会合并有关的分区。具体参考HBase的方式。
请求路由
一般这属于服务发现的问题,借助zk&etcd等都可以实现。具体技术参考zookeeper等的技术手册即可。
数据密集型应用系统设计--数据分区相关推荐
- 数据密集型应用系统设计--数据存储与检索
数据结构 追加型数据库和哈希索引 数据库最简单的形式,是追加型的方式: 写入数据直接追加到文件尾部,O(1)复杂度 读取数据从文件头遍历,获取最新的数据 这种数据库,没有删除操作,所有的数据都是追加性 ...
- 数据密集型应用系统设计--数据复制
简介 引入数据复制的原因: 数据距离用户更近,让用户访问延迟降低 提高容错机制,某个节点坏掉后,其备份节点仍然能提供服务 负载扩展到多台机器,提高吞吐量 复制技术的真正难点在于如何处理持续变更的数据. ...
- 豆瓣评分 9.7 的神书:《数据密集型应用系统设计》
我最近在读一本好书<数据密集型应用系统设计>(也被叫做 DDIA).这真是本相见恨晚的神书. 这是怎样一本神书?豆瓣评分高达 9.7 分! 什么是「数据密集型应用系统」? 当数据(数据量. ...
- 数据密集型应用系统设计-第七章分布式系统的麻烦-笔记
这阵子在看数据密集型应用系统设计书籍,自己把书籍比较重要的内容整理出来,基本一天一更,请感兴趣的朋友多多关注! 整个系列会在这几天都发布出来,可以关注一下 链接: 数据密集型应用系统设计-笔记. 文章 ...
- 数据密集型应用系统设计 [Designing Data-Intensive Applications]
作者:[美] Martin Kleppmann(马丁·科勒普曼) 著,赵军平 吕云松 耿煜 李三平 译 出版社: 中国电力出版社 出版时间:2018-09-01 数据密集型应用系统设计 [Design ...
- Designing Data-Intensive Application《数据密集型应用系统设计》笔记
Designing Data-Intensive Application 中译<设计数据密集型应用>又名<数据密集型应用系统设计>,我看的是冯若航在gitbook开源的翻译版本 ...
- 《数据密集型应用系统设计》读书笔记——第一部分 数据系统基础
第一部分 数据系统基础 第1章 可靠.可扩展与可维护的应用系统 当今许多新型应用都属于数据密集型,而不是计算密集型.对于这些类型应用,CPU的处理能力往往不是第一限制性因素,关键在于数据量.数据的复杂 ...
- 《数据密集型应用系统设计》读书笔记——数据系统基础
因为个人兴趣,想学学分布式方面的知识,然后找到了这本<数据密集型应用系统设计>,确实非常的不错,无论对于以前的工程还是现在的科研都有启迪和感悟,所以就写份读书笔记记录一下,里面提到的知识非 ...
- 数据密集型应用系统设计——笔记
本篇章内容为阅读<数据密集型应用系统设计>一书的读书笔记. 作为个人成长学习使用,同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放,芳香四溢,在风中舞蹈! 写在前 ...
最新文章
- html5调用系统声音1s响一次_HTML5声音录制/播放功能的实现代码
- 让Linux系统开机速度更快的方法
- Linux系统巡检shell脚本
- VMware虚拟机安装centos
- CentOS thrift python demo
- log双线性模型log-bilinear model简单概括
- ios如何获取gps坐标(定位第二节)
- POJ 1151 扫描线 线段树
- drools 7.x 加载指定的决策表
- webpack 实用配置总结
- preg_match 参数获取两个_摄像相机标定到底是啥?标定完成得到的参数有什么用?...
- 零基础如何学习C语言
- ad转3d视图快捷键_AD 常用快捷键
- ar面部识别_AR人脸识别数据集
- 基于 GARCH-CoVaR 方法的中国 A 股行业 关联网络风险溢出动态研究
- python绝对值_如何在Python中获得数字的绝对值?
- html5字幕提取软件,VideoSubFinder(提取视频字幕软件)
- 什么是支付系统,一分钟带你了解
- 微信公众号开发引导用户关注公众号
- 什么是SFP光模块?
热门文章
- AcWing327.玉米田(状压DP)题解
- 最大子矩阵(前缀和+贪心)
- LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation 论文笔记
- 关于TortoiseGit汉化包装了,但仍然是英文菜单的问题记录
- 实验8.1 链表类的定义与实现
- c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数
- 剑指offer——21.调整数组顺序使奇数位于偶数前面
- MVC的Controller-Action布局:单独的创建/编辑页面还是创建/编辑/查看一体的页面?...
- Flex显示图片的常用方式
- vue 结合swiper插件实现广告公告上下滚动的效果