精华内容
下载资源
问答
  • 什么是一致性Hash算法?

    万次阅读 多人点赞 2018-03-13 21:15:32
    最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,加班为大家...

    最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,加班为大家整理一下什么是Hash一致性算法,希望对大家有帮助!

    经常阅读我文章的小伙伴应该都很熟悉我写文章的套路,上来就是先要问一句为什么?也就是为什么要有Hash一致性算法?就像以前介绍为什么要有Spring一样,首先会以历史的角度或者项目发展的角度来分析,今天的分享还是一样的套路,先从历史的角度来一步步分析,探讨一下到底什么是Hash一致性算法!

    一、Redis集群的使用

    我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者Master-Slave的形式,或者搭建Redis集群,进行数据的读写分离,类似于数据库的主从复制和读写分离。如下所示:
    这里写图片描述
    同样类似于数据库,当单表数据大于500W的时候需要对其进行分库分表,当数据量很大的时候(标准可能不一样,要看Redis服务器容量)我们同样可以对Redis进行类似的操作,就是分库分表。

    假设,我们有一个社交网站,需要使用Redis存储图片资源,存储的格式为键值对,key值为图片名称,value为该图片所在文件服务器的路径,我们需要根据文件名查找该文件所在文件服务器上的路径,数据量大概有2000W左右,按照我们约定的规则进行分库,规则就是随机分配,我们可以部署8台缓存服务器,每台服务器大概含有500W条数据,并且进行主从复制,示意图如下:

    这里写图片描述

    由于规则是随机的,所有我们的一条数据都有可能存储在任何一组Redis中,例如上图我们用户查找一张名称为"a.png"的图片,由于规则是随机的,我们不确定具体是在哪一个Redis服务器上的,因此我们需要进行1、2、3、4,4次查询才能够查询到(也就是遍历了所有的Redis服务器),这显然不是我们想要的结果,有了解过的小伙伴可能会想到,随机的规则不行,可以使用类似于数据库中的分库分表规则:按照Hash值、取模、按照类别、按照某一个字段值等等常见的规则就可以出来了!好,按照我们的主题,我们就使用Hash的方式。

    二、为Redis集群使用Hash

    可想而知,如果我们使用Hash的方式,每一张图片在进行分库的时候都可以定位到特定的服务器,示意图如下:

    这里写图片描述

    上图中,假设我们查找的是"a.png",由于有4台服务器(排除从库),因此公式为hash(a.png) % 4 = 2 ,可知定位到了第2号服务器,这样的话就不会遍历所有的服务器,大大提升了性能!

    三、使用Hash的问题

    上述的方式虽然提升了性能,我们不再需要对整个Redis服务器进行遍历!但是,使用上述Hash算法进行缓存时,会出现一些缺陷,主要体现在服务器数量变动的时候,所有缓存的位置都要发生改变!

    试想一下,如果4台缓存服务器已经不能满足我们的缓存需求,那么我们应该怎么做呢?很简单,多增加几台缓存服务器不就行了!假设:我们增加了一台缓存服务器,那么缓存服务器的数量就由4台变成了5台。那么原本hash(a.png) % 4 = 2 的公式就变成了hash(a.png) % 5 = ? , 可想而知这个结果肯定不是2的,这种情况带来的结果就是当服务器数量变动时,所有缓存的位置都要发生改变!换句话说,当服务器数量发生改变时,所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端数据库请求数据(还记得上一篇的《缓存雪崩》吗?)!

    同样的,假设4台缓存中突然有一台缓存服务器出现了故障,无法进行缓存,那么我们则需要将故障机器移除,但是如果移除了一台缓存服务器,那么缓存服务器数量从4台变为3台,也是会出现上述的问题!

    所以,我们应该想办法不让这种情况发生,但是由于上述Hash算法本身的缘故,使用取模法进行缓存时,这种情况是无法避免的,为了解决这些问题,Hash一致性算法(一致性Hash算法)诞生了!

    四、一致性Hash算法的神秘面纱

    一致性Hash算法也是使用取模的方法,只是,刚才描述的取模法是对服务器的数量进行取模,而一致性Hash算法是对232取模,什么意思呢?简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-232-1(即哈希值是一个32位无符号整形),整个哈希环如下:
    这里写图片描述
    整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到232-1,也就是说0点左侧的第一个点代表232-1, 0和232-1在零点中方向重合,我们把这个由232个点组成的圆环称为Hash环

    下一步将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置,这里假设将上文中四台服务器使用IP地址哈希后在环空间的位置如下:
    这里写图片描述
    接下来使用如下算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器!

    例如我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:

    这里写图片描述
    根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上。

    五、一致性Hash算法的容错性和可扩展性

    现假设Node C不幸宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响,如下所示:

    这里写图片描述

    下面考虑另外一种情况,如果在系统中增加一台服务器Node X,如下图所示:
    这里写图片描述
    此时对象Object A、B、D不受影响,只有对象C需要重定位到新的Node X !一般的,在一致性Hash算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它数据也不会受到影响。

    综上所述,一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

    六、Hash环的数据倾斜问题

    一致性Hash算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,例如系统中只有两台服务器,其环分布如下:
    这里写图片描述
    此时必然造成大量数据集中到Node A上,而只有极少量会定位到Node B上。为了解决这种数据倾斜问题,一致性Hash算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器IP或主机名的后面增加编号来实现。

    例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六个虚拟节点:
    这里写图片描述
    同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Node A#1”、“Node A#2”、“Node A#3”三个虚拟节点的数据均定位到Node A上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

    七、总结

    上文中,我们一步步分析了什么是一致性Hash算法,主要是考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来的情况,如何保证当系统的节点数目发生变化的时候,我们的系统仍然能够对外提供良好的服务,这是值得考虑的!


    参考文章:

    1、https://www.cnblogs.com/lpfuture/p/5796398.html
    2、http://www.zsythink.net/archives/1182

    在这里插入图片描述

    【视频福利】2T免费学习视频,搜索或扫描上述二维码关注微信公众号:Java后端技术(ID: JavaITWork)回复:1024,即可免费获取!内含SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,Jenkins、Nexus、Docker、ELK等等免费学习视频,持续更新!

    展开全文
  • 关于事务的一致性,《数据库系统概念》中是这样描述的 第二段说的三个特性是指原子性、隔离性、持久性。 就算这样,相信大家也是懵懵的,我也是,所以才会写下这篇博客。 看到别的博客说,一致性是事务的最终...

    (PS:黄色字体为二次修改的内容)

    关于事务的一致性,《数据库系统概念》中是这样描述的

    第二段说的三个特性是指原子性、隔离性、持久性。

    就算这样,相信大家也是懵懵的,我也是,所以才会写下这篇博客。

    看到别的博客说,一致性是事务的最终目的,原子性、隔离性、持久性都是为了实现一致性。

    在这里,我打算验证一番。

    怎么验证呢?

    假设,这个事务系统如果是由我们来设计的话。

    首先,场景是这样的,小范转100块钱给小黄,那么这个事务系统必须要保证小范扣了100块钱,而且小黄也必须要加了100块钱。

    这个我们要怎么保证呢?

    有了,我们可以先用一本本子记下来,小范扣100块钱,小黄加100块钱,然后,我们再根据本子上写的,顺序执行,这样的话,小范或者小黄就没法耍赖了。

    OK,那么我们现在就开干,把这个事务系统开发出来,下面是伪代码:

    //事务系统
    abstract class transaction{
    
        void transaction(){
    
            /* todo:将所有操作写进日志
             * args: 事务名称, 事务操作, 事务写入状态(0 未写完 1已写完)
             */
            setLog("小范转100块钱给小黄", "小范-100", 0);
            setLog("小范转100块钱给小黄", "小黄+100", 1);
    
            //获取日志
            Log logs = getLog("小范转100块钱给小黄");
    
            //解析日志,获取操作事件
            Event events = parseLog(logs);
            
            //执行操作并回写日志状态标记该事务已完成
            doEvent(events, logs);
    
        }
    
    }

    OK,系统开发出来了,我们把它应用上去跑起来试下。

    但是,可能是因为计算机内存不够,系统跑到一半,闪退了。。。

    也就是doEvent的时候,小范扣了100块钱,这个时候闪退了。。。

    上数据库一看,完了,小范已经扣了100,但是小黄并没有增加100,事务也没有执行下去。

    所以我们这个事务系统是有问题的,我们的事务系统,应该要保证小范扣100,而且小黄也要加100,我们姑且称这种状态为一致性,因为我们要保证这两个操作对数据而言是一致的嘛。

    从目前来看,我们这个事务系统,没有完全实现一致性,那如果发生了这种状况,系统闪退停机等等异常情况,我们该怎么处理,才能保证一致性呢?

    有了,我们可以在日志中多加一个状态,用来标记该操作有没有执行,然后用一个定时器,每隔几秒找出日志中没有完成的事务,把它执行完,这样一来,就能保证小范扣了100,小黄加了100了,哪怕中途停机了,也能用定时器把事务执行完。

    就这样测试了十来次,结果跟操作都一致,确实能保证一致性了,就正式给用上生产环境了。

    可是才不到一天,就出问题了,怎么呢?有个业务,小张向老李转账300元,可是小张的账户上只有298,该死的初级程序员又没有对小张的金额作校验,直接就给执行了。

    这下小张的账户余额变成了-2,老李的账户变成了300。闹了个大笑话。

    这虽然主要责任不在我们开发的事务系统,但是,我们也要做处理,也就是在小张的余额做加减的时候,减成了负数,这个时候程序应该需要抛出异常的,不能让程序再执行下去了,所以,这就需要我们的事务系统,可以在执行到一半的时候,回滚到初始状态。

    也就是说,如果同一个事务中,有操作ABC三个顺序操作,操作A成功了,操作B失败了,那这操作C还要执行吗?当然不能,这种情况,B失败了,我们就只能把A给回滚到操作之前。

    这样一来,我们这个事务系统就是,要么事务都完成,要么事务都不完成,我们姑且就把这个叫做原子性吧。

    增加了原子性的功能后,事务系统又开始跑了。

    过了几天,又出问题了,怎么呢?原来啊,小范有300块钱,小张向小范转了500块钱,事务还没操作完呢,小刘又给小范转了300块钱,这样一来,问题就来了,小张给小范转500,本应该事务结束的时候小范有800块钱,可是小刘又给小范转了300,还是用小范原有的300去增加的,这样一来,小刘的事务结束,小范就有600块钱,小张的事务执行完,把800写回给小范,接着,小刘的事务也执行完,把600写回给小范,导致最终小范账上只有600块钱,小张的500被吞了。

    这样,数据完全混乱了。问题出在哪呢?在于小张事务执行的时候,读取到小范有300,事务没完,小刘也读取到小范有300,这样就错乱了,我们应该要让小张在转账的时候,小刘要等小张转完了,才能转。这样,才能解决掉数据混乱的问题,我们,姑且把这个叫做隔离性。

    隔离性修复完之后,项目又开始运作了,事务系统运行了很长一段时间,也没有出现问题。

    到这里,验证就结束了,上面写日志的行为其实就是事务的持久性,也可以看到,上面出现的隔离性、原子性、持久性,也都是为了彻底实现一致性而产生的。

    所以,总的来说,一致性是一个比较笼统的概念,是事务的基础,一致性和原子性的区别就是,原子性强调的是操作的完整,要么都成功、要么都不成功,而一致性包含的比较多,数据的一致性啊等等。

    不过其实,我觉得一致性不应该跟原子性、隔离性、持久性放在一起,因为这三个都是为了实现一致性,如果有大佬知道,麻烦跟我说下原因。

    到这,本文就结束了,写的真的不是很好,以后,要是我对事务一致性、原子性有了新的理解,我会再回来修改的,也欢迎各位大佬留言或者私聊我,给我写关于一致性的启发。

    知乎上有个回答也是写的蛮好的,大家可以看看,https://www.zhihu.com/question/30272728

    展开全文
  • 一致性是一个深刻而复杂的问题,这篇文章是我目前的粗浅理解,如果发现理解错误还会继续更新 目前这篇文章只是记录我自己的理解,并没有考虑文章的可读性 本文由giantpoplar发表于CSDN,未经允许不得转载。 ...

    本文由giantpoplar发表于CSDN,转载请保留本声明。


    “Cache Coherence” V.S. “Memory Consistency” V.S. “Data Consistency”

    缓存一致性

    cache coherence 的coherence这个词猜测是体系结构圈为了和memory consistency做区分,用了coherence这个词,但我理解缓存一致性和分布式多副本数据的一致性基本接近,只不过cache coherence是一种同步可靠通信、有全局时钟条件下的强一致(linearizability)。cache一致性协议有MSI,MESI等,虽然处理器的整个内存系统很复杂,但就cache一致性协议来说,比分布式环境下的数据一致要简明一些

    多核处理器每个核会有私有cache,也就是内存里的一份数据在多个核上可能有了副本,这多个副本,每个核都可能会对一个内存地址有读写操作,每个核是直接读写自己私有的副本,这就要求各个副本上的读写操作顺序要一致,这和分布式环境下的数据一致性很接近。

    具体的MSI,MESI协议暂不展开写。

    内存一致性

    内存一致性说的是共享内存多核处理器访存序的问题,进程对某一个内存地址(和分布式的同一数据多副本的一致性有所区别)的访问序的在多核下暴露出的问题 全部内存读写顺序的正确性问题,单核乱序执行重新排列无关的指令在多核系统中可能出现问题。也就是程序中 Load Store 的(ISA)顺序(冯诺依曼架构下看可以看做内存操作请求的顺序)和Load Store实际执行完成的顺序可能相同、可能不同(这取决于微体系结构的实现),在多核情况下,程序的正确性可能出问题。有各种一致性模型来表达各种程度的相同不同,相应的有软、硬件机制来确保多核处理器上程序的正确运行。

    这里只具体写顺序一致性(sequential consistency)模型,更弱的一致性模型在学习过相关资料论文后再做补充。顺序一致性的概念来源于Lamport 1977年的一篇论文How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Program
    这里写一下论文中给出的阐述
    看一个互斥协议,问题是多核处理器下多进程并发/并行会使得两个进程都进入临界区么?

    几点说明写在前面:

    • 1,2,3,4,5,6只是标号,数字本身带有的序和问题没联系
    • 程序里的读写操作都是一条指令的粒度,不是高级语言的一句语句
    • P1, P2指处理器
    - P1 - P2
    a=0 b=0
    1 a=1 4 b=1
    2 IF(b==0) THEN 5 IF(a==0) THEN
    (临界区) (临界区)
    3 a=0 6 b=0
    ELSE ELSE
    {…} {…}

    考虑这个例子,如下事件依次发生

    • 1 P1 发出a=1的请求,请求的是内存模块1,内存模块1此时正忙
    • 2 P1 发出取b的请求,请求的是内存模块2,内存模块2此时可用,取b的指令执行
    • 4 P2 发出b=1的请求,请求的是内存模块2,这个请求会在取b执行完成后执行
    • 5 P2 发送取a得请求,请求的是内存模块1,内存模块1此时正忙

    在这个例子里,这4条指令对同一内存请求顺序是1 ->5 ; 2->4
    这4条指令执行完成的顺序是什么呢 2->4;
    如果是 2->4;5 -> 1 这两个处理器会同时进入临界区
    如果是 2->4;1 -> 5 则不会
    -> 符号不直接对应happen-before

    顺序一致性有两个条件:

    • 每个处理器按程序序发射内存请求(1->2;4->5)
    • 所有处理器到单个存储器模块的请求依照FIFO序服务。请求的发射过程包含进入FIFO队列。

    我理解就是说,不管这多个处理器对同一内存的请求顺序如何交叠,都可以,但是内存必须按照请求到达的顺序执行(这里应该隐含着对同一地址先请求(指令发射)的先到达(指令执行)的假设),这样保证上面的互斥协议正确。这样的要求称为顺序一致的要求,是很严格的,会对硬件性能造成影响,其实可以放宽,不必严格按请求顺序执行,但是必须有软件机制来提供正确的互斥协议的实现,上面的护持互斥协议在弱于顺序一致的内存模型下是不正确的。

    也就是说1,2,4,5的请求可以有C(4,2)=6种交叠方式,每一种都符合顺序一致只要每种情况的执行也是按照这个顺序

    现在来看这句很拗口的话

    the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program

    似乎这个定义里要求每个核上不同内存地址的请求也要安程序序执行,但是在微体系结构层次,提交时要保持,但是执行时程序序是可以打破的,同一处理器不同地址请求序(乱序发射)和程序序(冯诺依曼ISA序)是否一致,请求序和执行序是否一致,这里似乎没有明说。分布式环境中的一致性是关于同一数据的多个副本上要达成全局一致性,某种角度来讲,如果把内存的请求发射和到达,类比分布式中对一个副本的写/读和向各个副本传播写/读操作,这两者非常类似 //但是感觉还是没有理解二者的本质

    单核处理器下多进程并发会使得两个进程都进入临界区么?此时表里的P1,P2代指进程。不会有这个问题,内存请求是从同一个核过来,到达顺序和服务顺序一样(单核天然是顺序一致的),不会有多核中多个请求到达,在执行请求时会涉及调度导致服务顺序和到达顺序不一致的情况。

    如果你考虑一个多核处理器的内存体系,就会发现这个问题很复杂,cache以及一致性,buffer,pipeline和内存一致性的保证,和分布式的一致性相比,虽然分布式下异步不可靠网络带来了很大挑战,但是现在我觉得处理器的内存系统可以说比分布式环境下的一致性问题更加复杂

    x86的内存一致模型是顺序一致的TSO,所以在实现一个正确的互斥锁的时候也没有考虑太多,比如没用memory barrier这种东西就对了

    数据一致性

    分布式系统为了性能、容错的需要,数据进行多副本冗余是一项很基本的技术。数据一致性说的是一份数据有多个副本,在多个副本上的读写操作的顺序要达成一致,这个一致也有很多不同的强弱要求,产生了众多的强弱一致性模型,这些模型的术语和内存一致性的术语有很大的重叠,可能是历史上并行体系结构和分布式系统两个领域是一伙人在搞?

    由强到弱的数据一致性模型构成了 数据一致性谱

    线性一致性和顺序一致性

    这两种都是称为强一致性

    • 线性一致性和顺序一致性都是强一致性
    • 都给客户端提供单副本的假象
    • Linearizability关乎时间,sequential consistency 关乎程序顺序

    分布式下强一致是个困难问题,著名的paxos算法挺复杂的,Raft是2014年出的一个可以看作是改良版的算法。

    线性一致性 Linearizability

    • 表现出单副本的行为
    • 读操作返回最近(most recent)的写,和client无关
    • 所有后序读返回相同值,直到下一次写,和client无关

    最近所有后序: 由时间确定
    e.g.
    这里写图片描述
    这里写图片描述
    这里写图片描述

    顺序一致性

    • 表现出单副本的行为
    • 读操作返回最近(most recent)的写,和client无关
    • 所有后序读返回相同值,直到下一次写,和client无关

    最近所有后序
    同一个client的操作由时间决定(程序序);
    跨client的操作:不由时间决定,我们可以安排某种序,只要保持程序序。

    从系统外的观察者来看:顺序一致性需要提供操作的全局序,1)工作起来像一个副本,2)来自同一个client的操作顺序被保持

    e.g.

    • 不违背顺序一致
    - - - - - -
    P1: W(x)a
    P2: W(x)b
    P3: R(x)b R(x)a
    P4: R(x)b R(x)a

    这个例子里面,横轴代表时间,时间上虽然W(x)a在前,W(x)b在后,但是其序不一定也如此,所以这个例子并不违背分布式环境下的顺序一致,也再次说明分布式的顺序一致是比内存的顺序一致更弱的一致

    • 违背顺序一致
    - - - - - -
    P1: W(x)a
    P2: W(x)b
    P3: R(x)b R(x)a
    P4: R(x)a R(x)b
    • 不违背顺序一致,违背线性一致
    - - - -
    P1: W(x)a W(x)b
    P2: R(x)a
    time ——-> ——-> ——->

    内存的顺序一致是顺序一致么?

    内存的顺序一致性和分布式哪一种强一致性是一样的呢?是顺序一致性么?因为分布式环境下没有全局时间,所以分布式数据顺序一致性退化成较弱的一种一致性,而Linearizability和内存的顺序一致性更接近。

    因果一致性
    放宽顺序一致性的要求,有因果关联的操作保持顺序,并发的(相互没有因果关联的)写操作可能在不同机器上顺序不同
    因果关系可以由vector-clock捕捉
    e.g.

    • 违背顺序一致,不违背因果一致
    - - - - - - -
    P1: W(x)a W(x)c
    P2: R(x)a W(x)b
    P3: R(x)a R(x)c R(x)b
    P4: R(x)a R(x)b R(x)c
    • 违背因果一致
    - - - - - -
    P1: W(x)a
    P2: R(x)a W(x)b
    P3: R(x)b R(x)a
    P4: R(x)a R(x)b
    • 不违背因果一致
    - - - - - -
    P1: W(x)a
    P2: W(x)b
    P3: R(x)b R(x)a
    P4: R(x)a R(x)b

    最终一致性
    某些副本的数据已经修改,而另一些副本的数据还没来得及修改。当修改可靠地传播到所有副本,并给予足够的时间,所有副本的数据都将变成新值,取得一致。

    happen-before

    理解一致性要理解一个并发系统中的“序”的问题,什么叫先,什么叫后。在分布式系统中,这个问题困难是因为没有完美的全局同步时钟,多核系统中是因为多核的微体系结构上的原因。

    Lamport在1978年的论文中给出了happen-before的定义,这篇论文非常经典,提出了很多分布式系统中十分重要的概念,此处暂不展开,只谈happen-before。据说这篇文章受相对论启发,了解happen-before有助于理解时间、顺序。

    happen-before 关系

    基本假设

    • 假设进程的事件(event)形成一个序列(sequence),单个进程定义为 一组事件的全序(total ordering)
    • 假设进程之间消息(message)的发送(send)和接受(receive)是事件

    happen-before 是满足以下条件的最小关系(relation)

    • 如果a,b是同一个进程的事件,a在b前面 ,那么ab
    • 如果a是发送消息进程的发送事件,b是接收该消息进程的接受事件,那么ab
    • 如果ab,bc,那么ac

    定义aa
    另外,如果两个不同的事件a,b,有 ab,ba,就称a,b是并发的(concurrent)

    这样从数学上看,happen-before就是一个定义在所有事件上偏序关系,反自反,反对称,传递性都有了,偏序关系中存在不可比的情况,所以有些事件并无先后是并发的,如果在加上限制条件 break tie,那么在这个偏序关系上就可以定义一个全序关系。

    进程和事件的定义非常general,事件可以是一个子程序的执行、也可以是一条机器指令的执行。

    消息的发送和接受在分布式系统中很显然。在体系结构方面也有类似之处,考虑单核处理器、冯诺依曼架构中指令顺序执行,其实这些指令并不需要严格一条接着一条指令,所以会有乱序执行,在乱序执行里,如果把同一内存地址的写读看做消息发送接收,其实乱序执行的写后读依赖就和happen-before序十分类似。

    引用

    [1].Gharachorloo, Kourosh, et al. Memory consistency and event ordering in scalable shared-memory multiprocessors. Vol. 18. No. 2SI. ACM, 1990.
    [2].Lamport, Leslie. “Time, clocks, and the ordering of events in a distributed system.” Communications of the ACM 21.7 (1978): 558-565.
    [3]Lamport, Leslie. “How to make a multiprocessor computer that correctly executes multiprocess progranm.” IEEE transactions on computers 9 (1979): 690-691.
    [4].Tanenbaum, Andrew S., and Maarten Van Steen. Distributed systems: principles and paradigms. Prentice-Hall, 2007.
    [5].https://homes.cs.washington.edu/~bornholt/post/memory-models.html
    [6].https://cse.buffalo.edu/~stevko/courses/cse486/spring15/lectures/23-consistency2.pdf

    展开全文
  •  4)一致证书处理:与SSLv3.0不同,TLS试图指定必须在TLS之间实现交换的证书类型。  5)特定警报消息:TLS提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS还对何时应该发送某些警报进行记录。 ...

    SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering Task Force - 互联网工程任务组)标准化后写入(RFCRequest For Comments 请求注释),RFC里包含了很多互联网技术的规范!

                                            

    起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL是基于HTTP之下TCP之上的一个协议层,是基于HTTP标准并对TCP传输数据时进行加密,所以HPPTS是HTTP+SSL/TCP的简称。

    由于HTTPS的推出受到了很多人的欢迎,在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(Transport Layer Security 安全传输层协议),可以说TLS就是SSL的新版本3.1,并同时发布“RFC2246-TLS加密协议详解”,如果想更深层次的了解TLS的工作原理可以去RFC的官方网站:www.rfc-editor.org,搜索RFC2246即可找到RFC文档! ——以上就是历史背景

    SSL 是指安全套接字层,简而言之,它是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息,包括个人资料。两个系统可能是指服务器和客户端(例如,浏览器和购物网站),或两个服务器之间(例如,含个人身份信息或工资单信息的应用程序)。

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识。

    1. 大致了解几个基本术语(HTTPS、SSL、TLS)的含义
    2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长连接”)
    3. 大致了解加密算法的概念(尤其是“对称加密与非对称加密”的区别)
    4. 大致了解 CA 证书的用途   5.TCP通信协议的几次握手

    TLS(传输层安全)是更为安全的升级版 SSL。由于 SSL 这一术语更为常用,因此我们仍然将我们的安全证书称作 SSL。但当您从赛门铁克购买 SSL 时,您真正购买的是最新的 TLS 证书,有 ECC、RSA 或 DSA 三种加密方式可以选择。

    TLS/SSL是一种加密通道的规范

    它利用对称加密、公私钥不对称加密及其密钥交换算法,CA系统进行加密且可信任的信息传输

    在HTTP SSL中常用的对称加密算法有RC4,AES,3DES,Camellia等

    SSL由从前的网景公司开发
    有1,2,3三个版本,但现在只使用版本3

    TLS是SSL的标准化后的产物
    有1.0 1.1 1.2三个版本
    默认使用1.0

    TLS1.0和SSL3.0几乎没有区别

    事实上我们现在用的都是TLS,但因为历史上习惯了SSL这个称呼
    平常还是以SSL为多。

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

    SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

    安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。

    TLS 的最大优势就在于:TLS 是独立于应用协议。高层协议可以透明地分布在 TLS 协议上面。然而,TLS 标准并没有规定应用程序如何在 TLS 上增加安全性;它把如何启动 TLS 握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。

     1、SSL加密

        SSL是Netscape公司所提出的安全保密协议,在浏览器(如Internet Explorer、Netscape Navigator)和Web服务器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之间构造安全通道来进行数据传输,SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道,它采用了RC4、MD5以及RSA等加密算法,使用40 位的密钥,适用于商业信息的加密。同时,Netscape公司相应开发了HTTPS协议并内置于其浏览器中,HTTPS实际上就是HTTP over SSL,它使用默认端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。HTTPS协议使用SSL在发送方把原始数据进行加密,然后在接受方进行解密,加密和解密需要发送方和接受方通过交换共知的密钥来实现,因此,所传送的数据不容易被网络***截获和解密。 然而,加密和解密过程需要耗费系统大量的开销,严重降低机器的性能,相关测试数据表明使用HTTPS协议传输数据的工作效率只有使用HTTP协议传输的十分之一。假如为了安全保密,将一个网站所有的Web应用都启用SSL技术来加密,并使用HTTPS协议进行传输,那么该网站的性能和效率将会大大降低,而且没有这个必要,因为一般来说并不是所有数据都要求那么高的安全保密级别
     

     2、TLS加密


      TLS:安全传输层协议
      TLS:Transport Layer Security
      安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。

     

    SSL与TLS的区别以及介绍

    SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。

    TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

      SSL是Netscape开发的专门用于保护Web通讯的,目前版本为3.0.最新版本的TLS 1.0是IETE(工程任务组)指定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。

      SSL(Secure Socket Layer)

      为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。

      当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。

      SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

                                        

      SSL协议提供的服务主要有:

      1)认证用户和服务器,确保数据发送到正确的客户机和服务器;

      2)加密数据以防止数据中途被窃取;

      3)维护数据的完整性,确保数据在传输过程中不被改变。

      SSL协议的工作流程:

      服务器认证阶段:

      1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;

      2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;

      3)客服根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;

      4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

      用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

      TLS(Transport Layer Security Protocol):安全传输层协议

      安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两成组成:TLS记录协议(TLS Record)和TLS握手协议(TLS Handshake)。较低的层为TLS记录协议,位于某个可靠的传输协议(例如TCP)上面。

      TLS记录协议提供的连接安全性具有两个基本特性:

    私有——对称加密用以数据加密(DES、RC4等)。对称加密所产生的密钥对每个连接都是唯一的,且此密钥基于另一个协议(如握手协议)协商。记录协议也可以不加密使用。
    可靠——信息传输包括使用密钥的MAC进行信息完整性检查。安全哈希功能(SHA、MD5等)用于MAC计算。记录协议在没有MAC的情况下也能操作,但一般只能用于这种模式,即有另一个协议正在使用记录协议传输协商安全参数。
      TLS记录协议用于封装各种高层协议。作为这种封装协议之一的握手协议允许服务器与客户机在应用程序协议传输和接收其第一个数据字节前彼此之间互相认证,协商加密算法和加密密钥。TLS握手协议提供的连接安全具有三个基本属性:

    可以使用非对称的,或公共密钥的密码术来认证对等方的身份。该认证是可选的,但至少需要一个结点方。
    共享解密密钥的协商是安全的。对偷窃者来说协商加密是难以获得的。此外经过认证过的连接不能获得加密,即使是进入连接中间的***者也不能。
    协商是可靠的。没有经过通信方成员的检测,任何***者都不能修改通信协商。
      TLS的最大优势就在于:TLS是独立于应用协议。高层协议可以透明地分布在TLS协议上面。然而,TLS标准并没有规定应用程序如何在TLS上增加安全性;它如何启动TLS握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。

      协议结构

      TLS协议包括两个协议组——TLS记录协议和TLS握手协议。

      TLS和SSL的关系:并列关系

      最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL 3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL 3.0不能互操作。

      1.TLS与SSL的差异

      1)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。

      2)报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的异或运算。但是两者的安全程度是相同的。

      3)伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。

      4)报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。

      5)密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。

      6)certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。

      7)加密计算:TLS和SSLv3.0在计算主密值(master secret)时采用的方式不同。

      8)填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度哟啊达到密文快长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析

     

      2.TLS的主要增强内容

      TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS在SSL v3.0的基础上,提供了以下增加内容:

      1)更安全的MAC算法

      2)更严密的警报

      3)“灰色区域”规范的更明确的定义

     

      3.TLS对于安全性的改进

      1)对于消息认证使用密钥散列法:TLS使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络(如因特网)上传送时,该代码确保记录不会被变更。SSLv3.0还提供键控消息认证,但HMAC比SSLv3.0使用(消息认证代码)MAC功能更安全。

      2)增强的伪随机功能(PRF):PRF生成密钥数据。在TLS中,HMAC定义PRF。PRF使用两种散列算法保证其安全性。如果任一算法暴露了,只要第二种算法未暴露,则数据仍然是安全的。

      3)改进的已完成消息验证:TLS和SSLv3.0都对两个端点提供已完成的消息,该消息认证交换的消息没有被变更。然而,TLS将此已完成消息基于PRF和HMAC值之上,这也比SSLv3.0更安全。

      4)一致证书处理:与SSLv3.0不同,TLS试图指定必须在TLS之间实现交换的证书类型。

      5)特定警报消息:TLS提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS还对何时应该发送某些警报进行记录。

    以上就是对https、ssl、tsl的理解和分析,希望能帮助到你们。有更好的理解可以留言咱们共同学习。谢谢

    展开全文
  • 面试必备:什么是一致性Hash算法?

    万次阅读 多人点赞 2018-03-14 00:00:00
    最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,加班为大家...
  • 一致性可以理解为在任意时刻,所有节点中的数据是一样的。同一时间点,你在节点A中获取到key1的值与在节点B中获取到key1的值应该都是一样的。 弱一致性包含很多种不同的实现,目前分布式系统中广泛实现的是最终...
  • Raft 一致性算法论文

    万次阅读 2019-05-17 09:52:13
    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为《In search of an Understandable Consensus ...它和 Paxos 的性能和功能是一样的,但是它和 Paxos 的结构不一样;这使得 Raft 更容易理解并且更易...
  • 总线矩阵:业务过程和维度的交点; 一致性维度:同一集市的维度表,内容相同或包含; 一致性事实:不同集市的同一事实,需保证口径一致,单位统一。
  • 分布式系统的一致性问题(汇总)

    万次阅读 2019-09-02 15:32:19
    保证分布式系统数据一致性的6种方案 问题的起源 在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A、B、C,需要...
  • 一致性算法分析

    万次阅读 2018-01-18 14:25:47
    目的 :一致性算法的出现是为了解决一致性问题,一致性问题是指对于一组服务器(集群),给定一组操作,需要使用一种协议使得它们的结果最终达成一致,看起来好像是一台服务器一样。 作用 :一致性算法在构建可信赖...
  • 一致性模型确保正确的日志复制 只要大部分服务器是运行的系统就能工作 失败的模型:失败-停止(非拜占庭),延迟/丢失信息 Basic Paxos Proposers: 活动的:提出特定的值被选中 处理客户请求 Acceptors: 被动...
  • 一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前。 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文《拜占庭将军问题》(参考[1])。 拜占庭位于如今的土耳其的...
  • 下面通过几个问题来说明kafka如何来保证消息可靠性与一致性 在kafka中ISR是什么? 在zk中会保存AR(Assigned Replicas)列表,其中包含了分区所有的副本,其中 AR = ISR+OSR ISR(in sync replica):是kafka动态...
  • GFS一致性总结

    千次阅读 多人点赞 2017-05-10 19:29:47
    一致性背景分布式存储系统中,不管是文件系统还是数据库,只要数据存在多个副本,都涉及一致性问题其中一致性包括内部一致性和副本一致性,内部一致性即单机版数据库中的数据满足一定的约束条件。副本一致性表示同一...
  • ConcurrentHashMap为什么是弱一致性的

    千次阅读 2018-08-03 16:19:54
    关于ConcurrentHashMap在之前的 ...要成为强一致性,就得到处使用锁,甚至是全局锁,这就与Hashtable和同步的HashMap一样了。 Reference: http://blog.csdn.net/kobejayandy/article/details/16834311 ...
  • 而Flink提供了这样的一种容错机制CheckPoint,它能够保证Flink内部的一致性,实现内部Exact Once语义。首先看看什么是CheckPoint机制 它是受Chandy-Lamport算法的启发,形成的一种轻量级的分布式快照,它的意思是每...
  • (2)再写数据库(这两步和原来一样); (3)休眠1秒,再次淘汰缓存; 这么做,可以将1秒内所造成的缓存脏数据,再次删除! 5.1、那么,这个1秒怎么确定的,具体该休眠多久呢? 针对上面的情形,读者应该...
  • 编辑:业余草来源:https://www.xttblog.com/?p=4891今天,我们来简单的看一下 MySQL 的一致性、原子性和持久性问题。后面...
  • Raft 一致性算法论文译文

    千次阅读 2017-02-05 11:02:15
    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为《In search of an Understandable Consensus Algorithm ...它和 Paxos 的性能和功能是一样的,但是它和 Paxos 的结构不一样;这使得 Raft 更容易理解
  • 一致代码段和非一致代码段

    万次阅读 多人点赞 2009-09-26 13:56:00
    所以一致代码段和非一致代码段的意思就是指这个一致位是否置1,置1就是一致代码段,置0就为非一致代码段。 一致代码段: 简单理解,就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码. 通常...
  • Mysql-InnoDB 事务-一致性读(快照读)

    千次阅读 2018-03-01 18:21:21
    数据库读,是数据库操作中很常见的一个操作,在数据库事务中也经常...首先,概括一下,我理解的这篇官方文档主要表达的意思一致非锁定读,也可以称为快照读,其实就是普通的读取即普通SELECT语句。既然是快照读,...
  • &0xFF是怎么个意思

    万次阅读 多人点赞 2017-04-28 19:05:24
    这是因为Java中只有有符号数,当byte扩展到short, int时,即正数都一样,因为为符号位是0,所以无论如何都是补零扩展;但负数补零扩展和按符号位扩展结果完全不同。 补符号数,原数值不变。 补零时,相当于把有符号...
  • 浅析一致性维度

    千次阅读 2016-08-24 09:57:20
    维度建模的数据仓库中,有一个概念叫Conformed Dimension,中文一般翻译为“一致性维度”。一致性维度是Kimball的多维体系结构(MD)中的三个关键性概念之一,另两个是总线架构(Bus Architecture)和一致性事实...
  • 一致性Hash问题

    千次阅读 2018-04-19 14:58:51
    最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,加班为大家...
  • 分布式系统可用性与一致

    千次阅读 2017-06-23 09:55:27
    可用性(Availability)和一致性(Consistency)是分布式系统的基本问题,先有著名的CAP理论定义过分布式环境下二者不可兼得的关系,又有神秘的Paxos协议号称是史上最简单的分布式系统一致性算法并获得图灵奖,再有...
  • 一致性代码和非一致性代码有什么区别?等等这些问题,如果仅仅停留在知其然的级别,很容易会困惑,本文主要说明以上问题的答案和蕴涵在背后的原因。 1.特权级  首先,了解以下操作系统的特权级  1)CPL是存寄
  • 浅析数据一致

    千次阅读 2016-10-31 21:11:15
    什么是数据一致性? ...在数据有多分副本的情况下,如果网络、服务器或者... 实践中,导致数据不一致的情况有很多种,表现样式也多种多样,比如数据更新返回操作失败,事实上数据在存储服务器已经更新成功。 CA
  • 一致性Hash算法

    千次阅读 多人点赞 2019-09-18 17:57:39
    先从历史的角度来一步步分析,探讨一下到底什么是Hash一致性算法!一、Redis集群的使用我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者...
  • 数据一致性问题

    千次阅读 2018-09-18 10:44:36
    2.一致性,在事务开始之前和结束之后,数据完整性不被破坏。 3.隔离性,允许并发事务对数据同时进行读写。防止多个事务交叉执行而导致数据不一致。事务隔离分为读未提交、读提交、可重复读和串行化。 4.持久性,...
  • Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可理解性,Raft 将一致性算法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 237,342
精华内容 94,936
关键字:

一致是一样的意思吗