一致性hash理解

  1. 白话概述:

    • 比如说存储图片,有10台服务器用来存储,对图片名进行hash(pic_name)%10得到的值就是图片存放的服务器序号。这是正常的hash算法分散图片存储。但是有一天,你觉得服务器不够了,需要加几台机器扩容存储。这时候,假设加了10台,变成20台,那么原先譬如11%10=1现在11%20=11,则存取图片会跑到11号服务器,如果仍旧用原来的算法,那所有图片几乎都要重新移动位置,这明显非常消耗性能。
    • 一致性hash就是为了解决这一问题,它建立了hash环的概念,2^32个点,围城一个环,表示从0-2^32-1的数,比如3台服务器,根据ip地址hash后%2^32余数就是hash环上的位置A,B,C,假设按从小到大顺时针排序,存储图片的时候同样算出图片位置,如果在A,B之间,按顺时针则放在B,在B,C之间顺时针放C,CA之间,顺时针放A,理想情况下,A,B,C均匀排列则图片均匀分布在ABC三台服务器上。这时候,若多加了台服务器D,算出位置为 CA之间那么,落在CD之间的图片存在D,落在DA之间的图片依旧存在A,这台服务器D只是负担了一部分资源存储,减少了A的负担,并不会影响其他服务器
    • 当然以上算法都是理想状态,实际情况可能A,B,C都挤在一起,靠的比较近,使大部分资源都落到一个服务器上,为了解决这一问题,它引入了虚拟节点,也就是说,A可以创建多个A1,A2...节点分散在整个hash环,存入的图片位置,顺时针若落入A1,则代表它粗怒A服务器,虚拟节点越多,分布也就越均匀

详细参考 http://www.zsythink.net/archives/1182

拜占庭将军问题

  1. 问题白话概述:10支军队攻城,必须至少5支以上一起攻击才能成功,10支军队通过通信兵互相传递消息决定要不要进攻和进攻时间。但是需要考虑通信兵中可能存在间谍会改变攻击时间和意图。所以问题归结就是将军能否找到一种分布式协议能够让他们远程协调10支军队有效进攻。(前提假设通信不会被中断,消息传递可靠性有保障)
  2. 两军问题:A军队分为A1和A2分隔两地,只有两军同时进攻中间的B军队才能获胜。现在需要通信兵实现A1、A2通信,表达何时进攻的意图。A1通知A2,A2收到通知后,需要确认信息,通知A1我收到了,A1收到消息后又要通知A2,告诉它我收到你的确认消息了,A2收到后同样要确认A1我收到了,这样无休止循环,不能保证消息的可靠性。
  3. 由两军问题,可以看出TCP协议就是为了解决两军问题消息的一致性。A发送随机数x给B,B收到后把x+1,再生产随机数y,把两数都发给A,A收到后确认了B收到了消息,再把y+1,返回给B。这样B也确认了A收到了消息。这就是TCP协议的重点,但它任然不能够绝对的保证消息的可靠性,因为传输途中可能被拦截修改内容。

详细参考 https://www.cnblogs.com/zpfbuaa/p/6846966.html

CAP理论

  1. C一致性,比如客户端请求服务端,获取的数据要么是最新数据,要么返回错误,==强调数据正确性==
  2. A可靠性,比如客户端请求服务端,一定会获得数据,但不保证最新,==强调不错出==
  3. P分区容错性,不管分布式系统内部出现何种问题,大量数据丢失,数据同步延迟,但系统持续工作,==强调不挂掉==

详细参考 https://blog.csdn.net/guitar___/article/details/80656681

一致性hash理解、拜占庭将军问题解读和CAP理论总结的更多相关文章

  1. 一致性hash理解

    在做memcached分布式集群时往往要用到一致性hash算法来调节缓存数据的分布. 通常的hash算法是以服务器数量N作为模数,使用key%N的值来获得最终位置,显然当服务器数量发生变化即N发生变化 ...

  2. CAP理论解读

    经历过技术面试的小伙伴想必对这个两个概念已经再熟悉不过了! 我当年参加面试的时候,不夸张地说,只要问到分布式相关的内容,面试官几乎是必定会问这两个分布式相关的理论. 并且,这两个理论也可以说是小伙伴们 ...

  3. CAP理论与MongoDB一致性、可用性的一些思考

    大约在五六年前,第一次接触到了当时已经是hot topic的NoSql.不过那个时候学的用的都是mysql,Nosql对于我而言还是新事物,并没有真正使用,只是不明觉厉.但是印象深刻的是这么一张图片( ...

  4. [梁山好汉说IT] 如何理解一致性Hash

    [梁山好汉说IT] 如何理解一致性Hash 0x00 摘要 用梁山酒店分配客人为例来理解一致性Hash. 0x01. 与经典哈希方法的对比 经典哈希方法:总是假设内存位置的数量是已知且固定不变的.因为 ...

  5. 一致性hash的理解

    参考: http://www.blogjava.net/hello-yun/archive/2012/10/10/389289.html http://blog.csdn.net/cywosp/art ...

  6. 分布式缓存一致性hash算法理解

    今天阅读了一下大型网络技术架构这本苏中的分布式缓存一致性hash算法这一节,针对大型分布式系统来说,缓存在该系统中必不可少,分布式集群环境中,会出现添加缓存节点的需求,这样需要保障缓存服务器中对缓存的 ...

  7. redis一致性hash算法理解

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

  8. 【高并发解决方案】7、一致性hash解读

       一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 ...

  9. 对一致性hash原理的理解

    一致性hash算法解决的核心问题是,当solt数发生变化的时候能够尽量少的移动数据.该算法最早在<Consistent Hashing and Random Trees:Distributed ...

随机推荐

  1. 电商项目中使用Redis实现秒杀功能

    参与过抢购活动就知道,很明显的一点是商即便商品实际没有了也是可以下单成功的,但是在支付的时候会提示你商品没有了. 实现原理:list双向链表 使用redis队列,因为pop操作是原子的,即使有很多用户 ...

  2. Python单元测试unittest【转自https://www.cnblogs.com/feng0815/p/8045850.html】

    [转自https://www.cnblogs.com/feng0815/p/8045850.html] Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一 ...

  3. 大数据入门到精通11-spark dataframe 基础操作

    // dataframe is the topic 一.获得基础数据.先通过rdd的方式获得数据 val ny= sc.textFile("data/new_york/")val ...

  4. MariaDB ColumnStore初探(1):安装、使用及测试

    相信大家在对接BI数据报表部门有很深刻的体验,高大上的复杂SQL关联JOIN十几张表在InnoDB里跑起来,会让你酸爽到死.它的出现正是解决这个问题,DBA能不能轻松愉快地玩耍,就要靠它了,“神州行我 ...

  5. Python SMTP发送邮件

    import smtplibfrom email.mime.text import MIMEText  # 引入smtplib和MIMEText host = 'smtp.163.com'  # 设置 ...

  6. 部分用户访问Polycom视频会议时故障

    1.现象 Polycom视频会议服务器部署在防火墙下,通过Paloalto防火墙的一对一映射到公网. 部分同事使用职场网络或者4G通过公网访问时,出现超时问题. 2.分析: Polycom设备并没有做 ...

  7. 单点登录(SSO)原理与案例

    单点登录业务流程 概要 详细流程 单点登录系统一共有三个模块,1.服务端 2.客户端 3.代理模块端 用户发送访问客户端的请求,被客户端的代理模块的拦截器拦截,判断cookie中是否含有token(令 ...

  8. Win10电脑系统使用技巧

    现如今,电脑已经成为我们不可或缺的伙伴,陪伴着我们的工作.娱乐和生活,而Windows10在大家使用的电脑中占据了大多数,但是很多的小伙伴对它的许多功能并不真正了解,今天小编就带大家了解一下这些技巧, ...

  9. ( function(){…} )()和( function (){…} () )是两种立即执行函数

    函数声明:function fnName () {…};函数表达式 var fnName = function () {…};匿名函数:function () {}; fnName(); functi ...

  10. maven 项目中没有src/test/java文件夹

    项目右键->buildPath configure Build Path->点击选项卡Libraries->选中JRE System Library->点击edit->选 ...