理解分布式存储的本质

有一个经典的实践经验:

数(值)据大了, 什么都是问题!
  • 如果要求128B或更大数值计算, 哪么四则运算会是个大问题!
  • 如果要求128T或更大日志存储, 哪么文件存储会是个大问题!
  • 如果要求128W或更大并发操作, 哪么内存管理会是个大问题!

等等....."墨菲定律", 凡有如果就会发生, Redis缓存数据就是一例! 单机128G内存都无法满足,咋办? 最简单的答案就是大学"数据结构与算法分析"的经常考点:"分而治之"策略. 何谓"分而治之", 就是用餐盒打包饭菜, 一个不够就二个, 二个不够就三个...很少人会去考虑其中蕴含的逻辑哲理.

实现分布式存储的关键

分布式存储的关键:

咋分?

一般都是在三个"方便"中权衡:

  • 方便加速读的性能.
  • 方便加速写的性能.
  • 方便扩展维护,故障恢复.

    结合日常需求, 很容易明白这些"方便"的意义.

为了满足上述需求, 很多"聪明人士"抽象了"虚拟结点", 再想出了"二层映射"思路(算法):

  1. 先将数据主键映射到虚拟(存储)结点.
  2. 再将虚拟结点映射到物理(存储)结点.

步骤1要求尽可能离散,尽可能均衡, 才能分摊读写的瓶颈. 这涉及"离散空间中的一般均衡理论". 说白了, 就是选择算法实现的优劣.

步骤2要求总够的灵活度, 才能实现扩展维护, 故障恢复. 说白了, 就是自由组合.

基于这种思路的生产算法:

  1. 一致性HASH算法:
  • 数据主键映射到虚拟结点:
HASH(key): unsigned int

结果介于0~2^32-1 (JAVA是-2^16 ~ 2^16-1). 为什么是2^32? 因为32位OS最直接的支持就是unsigned int.

  • 虚拟结点映射到物理结点:
switch(HASH(key)){
case (L0, H0]: Node0;
case (L1, H1]: Node1;
...
default: Node0;
}

(Li, Hi]->Nodei是由业务维护的一张映射关系表. 可变!

  1. ceph的CRUSH算法
  • 数据主键映射到虚拟结点:
hash(oid) & mask -> pgid
  • 虚拟结点映射到物理结点:
clustermap(pgid) -> osds

一般hash与一致性hash的优劣

一般hash与致性hash都可以实现将数据分布

  • 一般hash实现及优劣:
    HASH(key)%N
  1. 优点: 够简单, 我喜欢! 先hash, 再模N.
  2. 缺点: N变化波及整个离散空间.
  • 一致性hash实现及优劣:
switch(HASH(key)){
case (L0, H0]: Node0;
case (L1, H1]: Node1;
...
default: Node0;
}
  1. 优点:
  2. 缺点: 计算复杂了点.

相关算法实现

  • 数据主键映射到虚拟结点: MD5, MurmurHash.

    • MD5是16Byte, 映射到4Byte的int.
    • MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的CityHash算法.

      官方网站:https://sites.google.com/site/murmurhash/
  • 虚拟结点映射到物理结点: 红黑树

    参考资料:http://blog.csdn.net/yuhk231/article/details/51218244

一致性hash应用到redis的更多相关文章

  1. 一致性Hash算法在Redis分布式中的使用

    由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢? ...

  2. 关于一致性Hash算法

    在大型web应用中,缓存可算是当今的一个标准开发配置了.在大规模的缓存应用中,应运而生了分布式缓存系统.分布式缓存系统的基本原理,大家也有所耳闻.key-value如何均匀的分散到集群中?说到此,最常 ...

  3. 不会一致性hash算法,劝你简历别写搞过负载均衡

    大家好,我是小富~ 个人公众号:程序员内点事,欢迎学习交流 这两天看到技术群里,有小伙伴在讨论一致性hash算法的问题,正愁没啥写的题目就来了,那就简单介绍下它的原理.下边我们以分布式缓存中经典场景举 ...

  4. redis一致性hash算法理解

    一般算法: 对对象先hash然后对redis数量取模,如果结果是0就存在0的节点上. 1.2同上,假设有0-3四个redis节点.20个数据: 进行取模后分布如下: 现在因为压力过大需要扩容,增加一台 ...

  5. 7.redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

    作者:中华石杉 面试题 redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 面试官心理分析 在前几年, ...

  6. 11.redis cluster的hash slot算法和一致性 hash 算法、普通hash算法的介绍

    分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 一.hash 算法 来了一 ...

  7. Golang 实现 Redis(7): Redis 集群与一致性 Hash

    本文是使用 golang 实现 redis 系列的第七篇, 将介绍如何将单点的缓存服务器扩展为分布式缓存.godis 集群的源码在Github:Godis/cluster 单台服务器的CPU和内存等资 ...

  8. 探索c#之一致性Hash详解

    阅读目录: 使用场景 算法原理 虚拟节点 代码示例 使用场景 以Redis为例,当系统需要缓存的内容超过单机内存大小时,例如要缓存100G数据,单机内存仅有16G时.这时候就需要考虑进行缓存数据分片, ...

  9. tornado--SESSION框架,一致性hash,分布式存储

    预备知识 tornado框架session要自己写 cookie存储在客户端浏览器上,session数据放在服务器上 session依赖cookie 扩展tornado,返回请求前自定义session ...

随机推荐

  1. find 忽略文件夹选项-prune的说明

    注意:因为习惯在当前路径查找时候,常忽略./ 的指定,但读者不要因此而完全忘记find的格式. 查找时忽略指定目录,是要使用-prune选项,但实际上最重要的还是要和path配合.-prune的意义是 ...

  2. jQuery的deferred对象详解(一)

    最近一段时间,都在研究jquery里面的$.Deffered对象,几天都搞不明白,其中源码的运行机制,网上查找了相关的资料,<jQuery的deferred对象详解>阮一峰老师的文章,里面 ...

  3. 访问iPhone通讯录的问题

    每个APP只显示一次上图的提示,即使卸载APP也不显示.如果想再次显示提示,可进入 设置-->通用-->还原-->还原位置与隐私,即可. 而且在ios6中文环境下,访问通讯录会出现错 ...

  4. vijos P1037搭建双塔

    P1037搭建双塔 Accepted 标签:动态规划 背包     描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件, ...

  5. html+CSS--水平居中设置(定宽块状元素)

    来源:http://www.imooc.com/code/4336 当被设置元素为 块状元素 时用 text-align:center 就不起作用了,这时也分两种情况:定宽块状元素和不定宽块状元素. ...

  6. iOS - SWift3 & XCode8

    1. 使用资源文件夹导入并管理图片素材 /* *资源文件夹可以方便您进行图片管理,在读取图片时,不需要加上图片名的后缀.同时还可以提高软件的安全性,它会讲图片都加密压缩, *并保存到   Assets ...

  7. iOS开发那些事-iOS6苹果地图实用开发

    在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,但是API编程接口没有太大的变化.开发人员不需要再学习很多新东西就能开发地图应用,这是负责任的做法.因此本节介绍的内容也同样适用于iOS5 ...

  8. 【学习笔记】【C语言】变量的内存分析

    计算机中的内存是以字节为单位的存储空间.内存的每一个字节都有一个唯一的编号,这个编号就称为地址.就好像酒店是以房间为单位的,每个房间都有一个唯一的房号,我们根据房号就能找到对应的房间. 1. 变量的存 ...

  9. Liskov替换原则(LSP)

    OCP中,继承支持了抽象和多态特性. LSP:子类必须能够替换掉其基类. 反例:使用if/else判断类型,以便选择针对特定类型的正确行为. 有效性并非本质属性 模型的有效性,只能通过它的客户程序来表 ...

  10. JSON字符串和js对象转换

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON js数据类型: 字符串.数字 ...